无法通过容器到达主机服务

时间:2019-04-18 10:16:45

标签: docker networking

在主机上有一项服务

@server# netstat -ln | grep 3308
tcp6       0      0 :::3308                 :::*                    LISTEN

可以从远程访问它。 容器位于用户定义的网桥网络中。 服务器IP地址为192.168.1.30

@localhost ~]# ifconfig
br-a54fd3b63acd: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.18.0.1  netmask 255.255.0.0  broadcast 172.18.255.255
        inet6 fe80::42:1eff:fecc:92e8  prefixlen 64  scopeid 0x20<link>
        ether 02:42:1e:cc:92:e8  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:37ff:fe9f:e4f1  prefixlen 64  scopeid 0x20<link>
        ether 02:42:37:9f:e4:f1  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 34  bytes 4018 (3.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.30  netmask 255.255.255.0  broadcast 192.168.1.255

容器中的ping也可以使用。

@33208c18aa61:~# ping -c 2 192.168.1.30
PING 192.168.1.30 (192.168.1.30) 56(84) bytes of data.
64 bytes from 192.168.1.30: icmp_seq=1 ttl=64 time=0.120 ms
64 bytes from 192.168.1.30: icmp_seq=2 ttl=64 time=0.105 ms

该服务可用。

@server# telnet 192.168.1.30 3308
Trying 192.168.1.30...
Connected to 192.168.1.30.
Escape character is '^]'.
N

但是无法从容器访问该服务。

@33208c18aa61:~# telnet 192.168.1.30 3308
Trying 192.168.1.30...
telnet: Unable to connect to remote host: No route to host

我检查了 Make docker use IPv4 for port binding 确保我没有将IPv6设置为仅绑定到IPv6

# sysctl net.ipv6.bindv6only
net.ipv6.bindv6only = 0

From inside of a Docker container, how do I connect to the localhost of the machine? 发现我的路线有些不同。

# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         router.asus.com 0.0.0.0         UG    100    0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
172.18.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-a54fd3b63acd
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0

有关系吗?还是其他原因?

2 个答案:

答案 0 :(得分:0)

您的Docker容器位于与主机不同的网络名称空间中,并且连接到与主机不同的接口,这就是为什么无法使用ip 192.168.x.x来访问它的原因

您需要做的是改为使用docker网络网关,在您的情况下172.17.0.1,但要注意,主机之间的IP可能并不相同,因此请在各处重现此IP,并完全确定这是IP,您可以创建一个用户定义的网络,该网络指定子网和网关并在其中运行您的容器,例如:

docker network create -d bridge --subnet 172.16.0.0/24 --gateway 172.16.0.1 dockernet
docker run --net=dockernet ubuntu

此外,无论您要在此处连接的任何服务都必须也在docker的网桥接口上进行监听。

另一种选择是使用--net=host标志在与主机相同的网络名称空间上运行容器,在这种情况下,您可以使用localhost

访问容器外部的服务

答案 1 :(得分:0)

受到official document

的启发
  

Docker桥驱动程序自动在主机中安装规则   机器,以便不同桥网络上的容器无法   彼此直接沟通。

我检查了服务器上的iptables,为了进行实验,我停止了iptables临时目录。然后,容器可以达到该服务成功。后来我被告知,服务器最近已重新启动。因此,猜测该配置在重新启动后丢失了。对iptables不太熟悉,当我尝试

systemctl status iptables.service

它表示未安装该服务。安装并运行该服务后,

iptables -L -n

几乎是空的。现在不知道哪种iptables规则会造成混乱。
但是,如果有人遇到ping success telnet fail的情况,iptables可能是根本原因所在。