我们通过 Docker 在自己的容器中运行大量服务,并使用 Docker Compose 连接它们。
以前我们使用链接来引用其他主机,但这样做的问题是,如果容器重新启动并获取新的 IP 地址,则链接的节点将不知道这一点并将停止工作。
因此,我们创建了一个网络并命名了主机,这很好用。但是,我们有一个用于测试的模拟组件,它取代了二其他容器。我可以通过链接轻松配置这一点,但我不知道如何通过网络做到这一点。
原本是这样的:
mm:
extends:
file: common-service.yml
service: mm-container
links:
- mock:enet
- mock:ff
(其中mm
,容器知道容器enet
和ff
,并且在这个用于测试的组合文件中,我们将它们链接到容器mock
。)
我尝试添加这个而不是链接:
extra_hosts:
- "enet:mock"
- "ff:mock"
(其中enet
和ff
是模拟主机名)但当然这会将这些行按原样添加到 /etc/hosts 中,因此不会进行主机名解析。
Docker 中是否有针对此问题的解决办法,或者我们是否必须重写我们的模拟工具?
答案1
您可以在模拟容器上定义网络别名。网络上定义了这些别名的每个人都将看到它们,因此您可能需要调整网络以防止其他容器看到它。例如
version: '3'
networks:
mocknet:
services:
mm:
image: mm:latest
networks:
default:
mocknet:
other_svc:
image: other_image:latest
mock:
image: mock:latest
networks:
mocknet:
aliases:
- ff
- enet
如果此堆栈中的所有内容都可以将 ff 和 enet 解析为模拟服务,那么您可以不再使用 mocknet 而只需在默认网络上设置别名。
答案2
只要只有两个,您就可以为“mock”提供一个名称和一个主机名。Docker 会将它们都放入/etc/hosts
因此,类似于:
mock:
[definitions of how to run 'mock']
container_name: enet
hostname: ff