Docker容器无法解析主机

时间:2016-04-29 09:26:43

标签: ubuntu docker dns

从我的主人我可以ping谷歌

$ cat /etc/resolv.conf 
nameserver 127.0.1.1
search my.company.server

$ ping google.com
PING google.com (172.217.16.174) 56(84) bytes of data.
64 bytes from fra15s11-in-f14.1e100.net (172.217.16.174): icmp_seq=1 ttl=54 time=11.0 ms
64 bytes from fra15s11-in-f14.1e100.net (172.217.16.174): icmp_seq=2 ttl=54 time=10.7 ms

从容器我可以上网:

$ docker run ubuntu:14.04 cat /etc/resolv.conf
search my.company.server
nameserver 8.8.8.8
nameserver 8.8.4.4


$ docker run ubuntu:14.04 ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=45 time=16.4 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=45 time=16.3 ms

但是不能ping主机名:

$ docker run ubuntu:14.04 ping google.com
<no answer>

一些环境信息:

$ docker --version
Docker version 1.10.1, build 9e83765

$ cat /proc/version
Linux version 4.2.0-27-generic (buildd@lgw01-12) (gcc version 5.2.1 20151010 (Ubuntu 5.2.1-22ubuntu2) ) #32-Ubuntu SMP Fri Jan 22 04:49:08 UTC 2016

$ cat /proc/sys/net/ipv4/ip_forward
1

$ ps -ef|grep [d]ocker
root   ....... /usr/bin/docker daemon -H fd://

与此相似: Docker container can reach DNS but not resolve hosts

但重新启动并没有帮助...

1 个答案:

答案 0 :(得分:0)

默认情况下,创建新的Docker容器还会创建一个虚拟网络,该虚拟网络将Docker网络环境与主机网络环境(某种程度上)分开。这样一来,人们就可以轻松启动多个容器,这些容器可能都侦听同一端口(例如80),但是可以映射到主机上的唯一端口(例如service1:80-> host:8080,service2: 80-> host:8081)。

docker run YOUR_IMAGE --network="host"将容器网络适配器绑定到主机的适配器。这应该允许您通过主机的侦听端口访问主机。例如localhost:8080但是,您需要记住端口是一种稀缺资源,并且在执行此操作时,不同容器中的端口侦听器不能冲突。

您还可以根据操作系统和docker版本从docker容器中检索主机的ip地址:

Mac / Windows: 从Docker v18.03 +开始,您可以使用host.docker.internal主机名连接到Docker主机。

Linux: docker container run -e "DOCKER_HOST=$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+')"将使docker容器中的主机IP作为环境变量可用:DOCKER_HOST