我想知道为什么,使用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
我能做些什么才能让它发挥作用?
EDIT1
使用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
答案 0 :(得分:1)
您还需要在撰写中使用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
应该有效
答案 1 :(得分:0)
直接运行docker命令与执行某些docker-compose运行时,网络设置存在细微差别。使用docker-compose,容器将附加到某个用户定义的网络,该网络为bridged network
,但与default bridged network
的配置不同。后者执行一些特殊配置,以向后兼容这些网络功能不像今天这样的版本。
我假设从compose运行时,您缺少主机上可用的某些dns设置,因此您无法解析网络上的其他主机。请查看差异here和here。对于第一次检查,您可以在运行cat /etc/resolv.conf
而不是ping命令时比较两种方式的输出,并查看需要添加的内容以使其在compose中起作用。