在容器a中运行一个应用程序在http://home.local:8180上,另一个容器B在http://data.local:9010上运行。容器B正在使用容器A来访问API。如果我在容器B中指定容器A的主机名为http://host.docker.internal:8180,那么它就可以工作了。如果我想使用主机名,我需要做的是(home.local:8180)以下是docker-compose文件:
home_app:
hostname: "home.local"
image: "home-app"
ports:
- "8180:8080"
environment:
data_app:
hostname: "data.local"
image: "data-app"
links:
- "home_app"
ports:
- "9010:9010"
您需要配置您的应用程序,以使用Compose服务名称home_app
作为主机名,以及容器内进程正在使用的端口号。hostname:
和ports:
对容器之间的连接没有任何影响。您不需要(也不能)指定自定义DNS后缀。更多详细信息,请参见Docker文档中的撰写网络。
所以我可以指定:
version: '3.8'
services:
home_app:
image: "home-app"
ports:
- "8180:8080" # optional, only for access from outside Docker
data_app:
image: "data-app"
ports:
- "9010:9010"
environment:
HOME_APP_URL: 'http://home_app:8080'
你不需要hostname:
,它只影响容器认为自己的主机名是什么,对容器之外的任何东西都没有影响;你不需要links:
,这是第一代Docker网络中过时的选项。
直接使用"home.local:8080"8180仅在主机上,并转发到容器上的8080,而基于您的docker-compose, 8080是您的应用程序在home_app容器上的端口,因此在docker-compose网络中,其他容器应该能够通过主机名(home.local)和实际端口(8080)访问它。