原因:经过一系列的折腾发现是因为容器内部没有监听8080端口导致。
排查方法:
一、可以在服务器中 telnet 172.16.16.10 80 看是否通畅(请将172.16.16.10更换为自己服务器的私网ip,80更换为自己的端口)如果容器内部没监听这个端口,正常是不会通的,此时基本断定问题是出在容器内部。
二、可以分别执行如下命令可以直观的看到容器里面的端口监听情况(如果您的容器内部有安装netstat命令,也可以直接进入容器执行 netstat -lunpt 查看端口监听 )
两个方法查看内部监听情况:
方法1:
1、查看容器Pid信息
范例:
输出结果:docker inspect 9ff01a6a5101 | grep Pid
2、将进程网络命名空间恢复到主机目录[root@blog-tag-gg ~]# 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 命令查看相关信息[root@blog-tag-gg ~]# mkdir -p /var/run/netns
[root@blog-tag-gg ~]# ln -s /proc/3152570/ns/net /var/run/netns/9ff01a6a5101
输出结果:ip netns exec 9ff01a6a5101 netstat -anptlu
此时可以看到容器里面有8081端口监听,没有8080端口监听,所以外部检测公网ip的80端口不会通。[root@blog-tag-gg ~]# 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
[root@blog-tag-gg ~]# ip netns
9ff01a6a5101 (id: 3)
a4237422118a (id: 1)
b94d48addd8f (id: 2)
3ef8d0619a7f (id: 0)
方法2:
方法2更简单:
1、查看这个容器的Pid(将 9728dbee2076 更换为您自己的容器id)
执行结果:docker inspect 9728dbee2076 | grep Pid
2、执行如下命令查看容器内部监听情况[root@blog.tag.gg ~]# docker inspect 9728dbee2076 | grep Pid
"Pid": 36964,
"PidMode": "",
"PidsLimit": null,
将“36964 ”更换为您查询出来的pid。sudo nsenter -t 36964 -n netstat -lunpt
执行结果如图。
[root@blog.tag.gg ~]# sudo nsenter -t 36964 -n netstat -lunpt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 36964/nginx: master
tcp6 0 0 :::80 :::* LISTEN 36964/nginx: master
希望对大家有帮助,如果你有其他更方便的方法查看,也可以留言提供,感谢。
文章评论 本文章有个评论