使用 docker 和 docker-compose 的主机解析

Host resolution with docker and docker-compose

我想知道为什么使用 docker-compose,容器在使用 docker 时无法解析主机名?主机在不同的物理机器上但在同一网络上。

我的Dockerfile

FROM openjdk:8-jre-alpine
CMD ping -c 2 myhost

我的docker-compose.yml

version: '3.3'
services:
    net:
        build: .
        image: test/myimage:1.0
        container_name: mycontainer

经过docker-compose build我试过了

docker run -it test/myimage:1.0
PING myhost (10.20.78.13): 56 data bytes
64 bytes from 10.20.78.13: seq=0 ttl=250 time=0.720 ms
64 bytes from 10.20.78.13: seq=1 ttl=250 time=0.515 ms

但是

docker-compose up
Recreating mycontainer ...
Recreating mycontainer ... done
Attaching to mycontainer
mycontainer | ping: bad address 'myhost'
mycontainer exited with code 1

我该怎么做才能让它正常工作?

编辑1

使用 cat /etc/resolv.conf 代替 ping -c 2 myhost

docker-compose up
Recreating mycontainer ...
Recreating mycontainer ... done
Attaching to mycontainer
mycontainer | search myorg.intra
mycontainer | nameserver 127.0.0.11
mycontainer | options ndots:0
mycontainer exited with code 0

docker run -it test/myimage:1.0
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 10.19.128.55
nameserver 10.19.142.23
nameserver 10.19.128.56
search myorg.intra

当 运行 docker 直接命令与执行某些 docker-compose 运行时,网络设置存在细微差别。使用 docker-compose,容器连接到某个用户定义的网络,该网络是 bridged network,但与 default bridged network 的配置不同。后者做了一些特殊的配置,以向后兼容像今天这样不存在这些网络功能的版本。

我假设当 运行 从撰写时,您缺少主机上可用的一些 dns 设置,因此您无法解析网络上的其他主机。请查看差异 here and here。对于第一次检查,您可以比较 运行 cat /etc/resolv.conf 时的输出,而不是两种方式的 ping 命令,看看您需要添加什么才能使其在 compose 中工作。

您还需要在撰写中使用 dns 条目

version: '3.3'
services:
    net:
        build: .
        image: test/myimage:1.0
        container_name: mycontainer
        dns:
          - 10.19.128.55
          - 10.19.142.23
          - 10.19.128.56
        dns_search: myorg.intra

如果您不想为每个容器指定它们,那么您甚至可以直接在守护程序级别设置它们。

在 JSON 文件中创建或编辑 /etc/docker/daemon.json 及以下条目

{
    "dns": ["10.19.128.55", "10.19.142.23", "10.19.128.56"],
    "dns-search": ["myorg.intra"],
}

使用 service docker restart 重新启动 docker 服务。那么你应该不需要 docker-compose 中的条目。您的原始 docker-compose 应该可以使用