在主机上有一项服务
@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
有关系吗?还是其他原因?
答案 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)
Docker桥驱动程序自动在主机中安装规则 机器,以便不同桥网络上的容器无法 彼此直接沟通。
我检查了服务器上的iptables
,为了进行实验,我停止了iptables
临时目录。然后,容器可以达到该服务成功。后来我被告知,服务器最近已重新启动。因此,猜测该配置在重新启动后丢失了。对iptables
不太熟悉,当我尝试
systemctl status iptables.service
它表示未安装该服务。安装并运行该服务后,
iptables -L -n
几乎是空的。现在不知道哪种iptables
规则会造成混乱。
但是,如果有人遇到ping success telnet fail
的情况,iptables
可能是根本原因所在。