使用 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
应该可以使用
我想知道为什么使用 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
应该可以使用