如何列出所有容器的暴露端口?

Posted

技术标签:

【中文标题】如何列出所有容器的暴露端口?【英文标题】:How to list exposed port of all containers? 【发布时间】:2018-09-24 01:42:14 【问题描述】:

我们有很多容器开始使用Rancher,每个容器都暴露多个端口。由于我们使用 Rancher 启动容器,因此默认情况下不会向主机公开任何端口。

$ docker container ls 

显示 Rancher 启动的容器没有暴露的端口。 Rancher CLI rancher未安装。

如何列出rancher网络中暴露的端口?这可以使用docker 命令吗?还是我需要rancher

【问题讨论】:

如果Rancher使用某种overlay network,数据包会被封装在一些上层协议(例如UDP)中。没有 Rancher 提供的工具无法检查容器端口,因为数据包是通过隧道传输的。 docker inspect 有我正在寻找的所有信息。如何在命令行上提取端口?也许通过awk 查看docker inspect --format ...。链接:docs.docker.com/engine/reference/commandline/inspect/… 谢谢,很好的提示。我试过:docker ps | awk 'print $1;' | xargs docker inspect --format='.Config.Image range $p, $conf := .NetworkSettings.Ports $p -> (index $conf 0).HostPort end' 但你是对的,那里没有暴露端口:-( 还可以查看 Rancher 的网络工作文档:rancher.com/docs/rancher/latest/en/rancher-services/networking 【参考方案1】:

Rancher 不使用 docker 范例来公开端口,因此使用任何 docker 命令都无法获得信息。

使用自定义 iptables 规则在主机上公开端口。

iptables-save | grep "\-A CATTLE_HOSTPORTS_POSTROUTING"

虽然不漂亮,但上面的命令为您提供了与暴露端口相关的所有规则的列表。

【讨论】:

【参考方案2】:

在一台主机上显示端口,您可以尝试使用

docker container ls --format "table .ID\t.Names\t.Ports" -a

您可以在这里找到更多示例docker-container-ls by manpages.ubuntu.com

【讨论】:

这看起来很有希望,甚至可以回答 OP 的问题,但我想查看 HOST 端口,这些只是容器公开的端口。【参考方案3】:

您可以使用以下命令查看 Rancher 的公开端口,以便它会向您显示突出显示的端口号。但是,它不会向您展示哪个容器准确地暴露了哪个端口。无论如何,您将能够通过名称推断它,使用“cmets”部分,如“ingress-nginx/default-http-backend cluster IP”:

iptables-save | grep -P "(--to-destination|--.port)" | grep -v "DROP" | grep -P ":\d+|--dport \d+"

使用上面的命令,你会看到如下输出:

-A KUBE-SEP-2ICPNCS4ZCJFOURG -p tcp -m comment --comment "ingress-nginx/default-http-backend" -m tcp -j DNAT --to-destination 10.42.1.3:8080
-A KUBE-SEP-7KPAUC7DBZEOGEJO -p tcp -m comment --comment "kube-system/kube-dns:dns-tcp" -m tcp -j DNAT --to-destination 10.42.0.6:53
-A KUBE-SEP-F4W6KYXNUTEPM6IK -p tcp -m comment --comment "kube-system/kube-dns:metrics" -m tcp -j DNAT --to-destination 10.42.1.2:9153
-A KUBE-SEP-J7ZDRJF2PSY5XJQS -p tcp -m comment --comment "kube-system/metrics-server:https" -m tcp -j DNAT --to-destination 10.42.0.5:4443
-A KUBE-SEP-KAJYD2TZYV7IYC6H -p udp -m comment --comment "kube-system/kube-dns:dns" -m udp -j DNAT --to-destination 10.42.1.2:53
-A KUBE-SEP-LJF33VEROEJBDKWI -p tcp -m comment --comment "kube-system/kube-dns:dns-tcp" -m tcp -j DNAT --to-destination 10.42.1.2:53
-A KUBE-SEP-PK2JJP3XEEJW3OPW -p tcp -m comment --comment "kube-system/kube-dns:metrics" -m tcp -j DNAT --to-destination 10.42.0.6:9153
-A KUBE-SEP-QMNQ4GQ2JI3QXI4N -p udp -m comment --comment "kube-system/kube-dns:dns" -m udp -j DNAT --to-destination 10.42.0.6:53
-A KUBE-SEP-U5JKF7K4YNNYXQDU -p tcp -m comment --comment "default/kubernetes:https" -m tcp -j DNAT --to-destination 138.201.139.162:6443
-A KUBE-SERVICES ! -s 10.42.0.0/16 -d 10.43.0.1/32 -p tcp -m comment --comment "default/kubernetes:https cluster IP" -m tcp --dport 443 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.43.0.1/32 -p tcp -m comment --comment "default/kubernetes:https cluster IP" -m tcp --dport 443 -j KUBE-SVC-NPX46M4PTMTKRN6Y
-A KUBE-SERVICES ! -s 10.42.0.0/16 -d 10.43.0.10/32 -p tcp -m comment --comment "kube-system/kube-dns:metrics cluster IP" -m tcp --dport 9153 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.43.0.10/32 -p tcp -m comment --comment "kube-system/kube-dns:metrics cluster IP" -m tcp --dport 9153 -j KUBE-SVC-JD5MR3NA4I4DYORP
-A KUBE-SERVICES ! -s 10.42.0.0/16 -d 10.43.0.10/32 -p udp -m comment --comment "kube-system/kube-dns:dns cluster IP" -m udp --dport 53 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.43.0.10/32 -p udp -m comment --comment "kube-system/kube-dns:dns cluster IP" -m udp --dport 53 -j KUBE-SVC-TCOU7JCQXEZGVUNU
-A KUBE-SERVICES ! -s 10.42.0.0/16 -d 10.43.0.10/32 -p tcp -m comment --comment "kube-system/kube-dns:dns-tcp cluster IP" -m tcp --dport 53 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.43.0.10/32 -p tcp -m comment --comment "kube-system/kube-dns:dns-tcp cluster IP" -m tcp --dport 53 -j KUBE-SVC-ERIFXISQEP7F7OF4
-A KUBE-SERVICES ! -s 10.42.0.0/16 -d 10.43.203.205/32 -p tcp -m comment --comment "kube-system/metrics-server:https cluster IP" -m tcp --dport 443 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.43.203.205/32 -p tcp -m comment --comment "kube-system/metrics-server:https cluster IP" -m tcp --dport 443 -j KUBE-SVC-Z4ANX4WAEWEBLCTM
-A KUBE-SERVICES ! -s 10.42.0.0/16 -d 10.43.158.90/32 -p tcp -m comment --comment "ingress-nginx/default-http-backend cluster IP" -m tcp --dport 80 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.43.158.90/32 -p tcp -m comment --comment "ingress-nginx/default-http-backend cluster IP" -m tcp --dport 80 -j KUBE-SVC-JTFAIQOSQRKTQWS3

因此,您将看到多个容器处理端口 80 和 443。您不会看到容器名称,但会看到它们的 IP 地址,因此您将能够运行 docker inspect 并查找数学。要准确查看谁在侦听某些端口,例如 80 和 443,请在命令中再添加一个 grep:

iptables-save | grep -P "(--to-destination|--.port)" | grep -v "DROP" | grep -P ":\d+|--dport \d+"|grep -P "\b(443|80)\b"

因此,你会看到:

-A KUBE-SERVICES ! -s 10.42.0.0/16 -d 10.43.203.205/32 -p tcp -m comment --comment "kube-system/metrics-server:https cluster IP" -m tcp --dport 443 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.43.203.205/32 -p tcp -m comment --comment "kube-system/metrics-server:https cluster IP" -m tcp --dport 443 -j KUBE-SVC-Z4ANX4WAEWEBLCTM
-A KUBE-SERVICES ! -s 10.42.0.0/16 -d 10.43.158.90/32 -p tcp -m comment --comment "ingress-nginx/default-http-backend cluster IP" -m tcp --dport 80 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.43.158.90/32 -p tcp -m comment --comment "ingress-nginx/default-http-backend cluster IP" -m tcp --dport 80 -j KUBE-SVC-JTFAIQOSQRKTQWS3
-A KUBE-SERVICES ! -s 10.42.0.0/16 -d 10.43.0.1/32 -p tcp -m comment --comment "default/kubernetes:https cluster IP" -m tcp --dport 443 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.43.0.1/32 -p tcp -m comment --comment "default/kubernetes:https cluster IP" -m tcp --dport 443 -j KUBE-SVC-NPX46M4PTMTKRN6Y

【讨论】:

以上是关于如何列出所有容器的暴露端口?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有端口映射的情况下将 docker 容器的 ip 和端口暴露给外部 docker 主机?

如何让不同的 Docker 容器相互通信而不将端口暴露给全世界

如何在流浪盒上转发端口

Docker 和 netstat:netstat 不显示端口,由 docker 容器暴露

k8s-暴露容器应用

sh Bash - 如何列出所有侦听端口的服务