
原因:经过一系列的折腾发现是因为容器内部没有监听8080端口导致。
排查方法:
一、可以在服务器中 telnet 172.16.16.10 80 看是否通畅(请将172.16.16.10更换为自己服务器的私网ip,80更换为自己的端口)如果容器内部没监听这个端口,正常是不会通的,此时基本断定问题是出在容器内部。
二、可以分别执行如下命令可以直观的看到容器里面的端口监听情况(如果您的容器内部有安装netstat命令,也可以直接进入容器执行 netstat -lunpt 查看端口监听 )
1、查看容器Pid信息
范例:
输出结果:docker inspect 9ff01a6a5101 | grep Pid
2、将进程网络命名空间恢复到主机目录[[email protected] ~]# docker inspect 9ff01a6a5101 | grep Pid
"Pid": 3152570,
"PidMode": "",
"PidsLimit": null,
范例:将3152570替换为上面查询出来的Pid,将9ff01a6a5101替换为自己的容器名mkdir -p /var/run/netns
输出结果:(没任何报错则没问题)ln -s /proc/3152570/ns/net /var/run/netns/9ff01a6a5101
3、使用ip netns 命令查看相关信息[[email protected] ~]# mkdir -p /var/run/netns
[[email protected] ~]# ln -s /proc/3152570/ns/net /var/run/netns/9ff01a6a5101
输出结果:ip netns exec 9ff01a6a5101 netstat -anptlu
此时可以看到容器里面有8081端口监听,没有8080端口监听,所以外部检测公网ip的80端口不会通。[[email protected] ~]# ip netns exec 9ff01a6a5101 netstat -anptlu
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:8081 0.0.0.0:* LISTEN 3152570/nginx: mast
tcp6 0 0 :::8081 :::* LISTEN 3152570/nginx: mast
此时需要检查容器里面的服务是否有启动或者服务配置是否正常,或者重新调整端口映射。
另外,也可以执行如下命令查看当前设置的所有进程网络空间名
输出结果:ip netns
希望对大家有帮助,如果你有其他更方便的方法查看,也可以留言提供,感谢。[[email protected] ~]# ip netns
9ff01a6a5101 (id: 3)
a4237422118a (id: 1)
b94d48addd8f (id: 2)
3ef8d0619a7f (id: 0)

文章评论 本文章有个评论