容器端口映射后,无法通过宿主机ip访问

来源:4-4 Docker bridge0详解

Aioria_

2020-02-28

运行一个nginx的容器,绑定宿主机的8080端口

docker run -d \
--name nginx-8080 \
-p 8080:80 \
-v ~/nginx-sign-web/html:/usr/share/nginx/html \
-v ~/nginx-sign-web/conf:/etc/nginx \
nginx

宿主机ip为172.18.6.123,外部无法通过http://172.18.6.123:8080访问Nginx,在宿主机执行telnet 127.0.0.1 8080也是不通。

在宿主机上尝试ping容器内部的ip 172.17.0.2,同样是不通的。

[user1@smcv bin]$ ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
From 172.17.0.1 icmp_seq=1 Destination Host Unreachable
From 172.17.0.1 icmp_seq=2 Destination Host Unreachable
From 172.17.0.1 icmp_seq=3 Destination Host Unreachable

一开始以为是firewalld关系,尝试放行8080/tcp,不管用,索性停掉firewalld还是不起作用。

搞不懂为什么,于是停掉了该容器,在宿主机上直接运行了一个Tomcat,监听8080端口,尝试访问,一切正常。

在另外一台机器上,同样的操作结果都是正常的,不存在上面说的这种情况。

对比了2台机器上的docker0网络接口,有细微差别(少了group default两项内容)

有问题的:

3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:43:c5:00:5b brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:43ff:fec5:5b/64 scope link
       valid_lft forever preferred_lft forever

正常的:

3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:62:ac:b2:0b brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:62ff:feac:b20b/64 scope link
       valid_lft forever preferred_lft forever

另外在尝试启动容器的时候,偶尔遇到下面这种iptables有关的错误提示

$ docker run --name mongo1 -p 27011:27017 -v /data/db/mongo1:/data/db -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro -d mongo:latest
ceb02e59282ad4eab6bceb9086794cf44a53dfe64a4b1045bb8b1c465aa53e2d
docker: Error response from daemon: driver failed programming external connectivity on endpoint mongo1 (3450ca000350f6cb642f67272b8c6b1736e8c252a72a48623a23215950693713):  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 27011 -j DNAT --to-destination 172.17.0.2:27017 ! -i docker0: iptables: No chain/target/match by that name.
 (exit status 1)).

由于计算机网络水平太差,被这个问题困扰几天,希望借助老师专业的网络知识,帮我找出问题的原因,非常感谢!

写回答

2回答

麦兜搞IT

2020-03-02

您的环境能详细说一下么,比如您是什么系统,怎么安装的docker,感觉像是在创建docker0的时候有问题,不过我也不确定,没有遇到过呢。

0
4
麦兜搞IT
回复
Aioria_
好的,加油!
2020-03-05
共4条回复

江湖沧海客

2020-03-01

端口映射8080:80 改成 80:8080

0
1
Aioria_
你这明显不对
2020-03-02
共1条回复

系统学习Docker 践行DevOps理念

无论你是开发、测试还是运维,Docker都是你的必备技能。

3297 学习 · 1895 问题

查看课程