Loading
0

不进入Docker容器查看容器内部端口监听的方法

技术小学生微信公众号
腾讯云服务器大促销。
华为服务器
前言:之前踩过一个坑,拉起容器并设置监听映射端口,比如设置80->8080(宿主80映射到容器8080),在容器外部使用docker ps -a 命令能看到宿主映射的端口,netstat -lunpt 命令也能看到80端口有监听,但80端口死活不通,安全组和防火墙等都有放行。
原因:经过一系列的折腾发现是因为容器内部没有监听8080端口导致。
排查方法:
一、
可以在服务器中 telnet 172.16.16.10 80 看是否通畅(请将172.16.16.10更换为自己服务器的私网ip,80更换为自己的端口)如果容器内部没监听这个端口,正常是不会通的,此时基本断定问题是出在容器内部。
二、可以分别执行如下命令可以直观的看到容器里面的端口监听情况(如果您的容器内部有安装netstat命令,也可以直接进入容器执行 netstat -lunpt 查看端口监听 )
两个方法查看内部监听情况:
方法1:
1、查看容器Pid信息
范例:

docker inspect 9ff01a6a5101 | grep Pid

输出结果:

[root@blog-tag-gg ~]# docker inspect 9ff01a6a5101 | grep Pid
            "Pid": 3152570,
            "PidMode": "",
            "PidsLimit": null,

2、将进程网络命名空间恢复到主机目录

mkdir -p /var/run/netns

范例:将3152570替换为上面查询出来的Pid,将9ff01a6a5101替换为自己的容器名

ln -s /proc/3152570/ns/net /var/run/netns/9ff01a6a5101

输出结果:(没任何报错则没问题)

[root@blog-tag-gg ~]# mkdir -p /var/run/netns
[root@blog-tag-gg ~]# ln -s /proc/3152570/ns/net /var/run/netns/9ff01a6a5101

3、使用ip netns 命令查看相关信息

ip netns exec 9ff01a6a5101 netstat -anptlu

输出结果:

[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

此时可以看到容器里面有8081端口监听,没有8080端口监听,所以外部检测公网ip的80端口不会通。
此时需要检查容器里面的服务是否有启动或者服务配置是否正常,或者重新调整端口映射。
另外,也可以执行如下命令查看当前设置的所有进程网络空间名

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

执行结果:

[root@blog.tag.gg ~]# docker inspect 9728dbee2076 | grep Pid
            "Pid": 36964,
            "PidMode": "",
            "PidsLimit": null,

2、执行如下命令查看容器内部监听情况

sudo nsenter -t 36964 -n netstat -lunpt

将“36964 ”更换为您查询出来的pid。
执行结果如图。

[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


希望对大家有帮助,如果你有其他更方便的方法查看,也可以留言提供,感谢。
 
技术小学生微信公众号
华为服务器
腾讯云服务器大促销。

声明:站长码字很辛苦啊,转载时请保留本声明及附带文章链接:https://blog.tag.gg/showinfo-3-36267-0.html
亲爱的:若该文章解决了您的问题,可否收藏+评论+分享呢?
上一篇:PHP代码获取操作系统版本以及手机系统版本方法
下一篇:kubernetes/k8s健康检查范例及详细使用方法