我有以下docker-compose.yml
文件:
version: '3'
services:
frontend:
image: alpine
command: tail -f /dev/null
networks:
- shared
- default
backend:
image: alpine
command: tail -f /dev/null
networks:
- shared
- default
networks:
shared:
external: true
基于上面的文件,我创建了两个使用相同网络(shared
)和相同服务名称(frontend
和backend
)的项目:
docker-compose -p foo up -d
docker-compose -p bar up -d
码头工人的DNS是否确保docker-compose -p foo exec frontend ping backend
仅解析为项目foo
中的后端容器,反之亦然?
答案 0 :(得分:1)
根据您的设置,我使用了pdf.output('blob')
来查找DNS解析是否孤立。
nslookup
从上面的输出中可以看到,$ docker-compose -p foo exec frontend nslookup backend
Name: backend
Address 1: 172.19.0.2 foo_backend_1.shared
Address 2: 172.19.0.4 bar_backend_1.shared
解析到两个容器。
答案 1 :(得分:0)
如果使用docker swarm,则可以使用服务名称来限定主机名,以消除容器的歧义。但是我不相信docker-compose可以做到这一点。
答案 2 :(得分:0)
根据https://github.com/docker/compose/issues/4645,在这种情况下,解析顺序不确定。由于网络正在使用golang转换为无序dict,因此不会保留顺序。这意味着https://github.com/docker/libnetwork/blob/master/sandbox.go#L593被查询的端点顺序与网络顺序不匹配。
解决方案是使用docker-compose版本2来定义https://docs.docker.com/compose/compose-file/compose-file-v2/#priority。或者将完全限定的dns名称命名为service.network
,例如backend.foo_default
或backend.shared
。