使用同一网络的多个项目的Docker DNS

时间:2019-02-03 19:55:40

标签: docker dns docker-compose

我有以下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)和相同服务名称(frontendbackend)的项目:

docker-compose -p foo up -d
docker-compose -p bar up -d

码头工人的DNS是否确保docker-compose -p foo exec frontend ping backend仅解析为项目foo中的后端容器,反之亦然?

3 个答案:

答案 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_defaultbackend.shared