如何列出所有容器的暴露端口?
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 容器相互通信而不将端口暴露给全世界