我有一个基于的 docker 镜像
rabbitmq
。我的 Dockerfile 中没有任何内容指定有关端口的内容。
我通过运行我的实例将常用的 rabbitmq 端口(5671、5672 和 15672)绑定到我的自定义端口,如下所示:
docker run -d -p $someport:5671 -p 127.0.0.1::5672 -p $somemgtport:15672 myimage
我的 iptables INPUT 链中没有任何内容,FORWARD 链中充满了常见的 docker 内容。
问题
当$somemgtport
不同于15672
我无法从外界访问它(通过 HTTP 的 rabbitmq 管理接口)时。
但看来我-p
正确使用了该标志,因为curl https://localhost:$somemgtport
它按预期工作(以及对 $someport 的 amqp 调用)。
运行时,iptables DOCKER链如下:
Chain DOCKER (1 references)
target prot opt in out source destination
ACCEPT tcp -- !docker0 docker0 anywhere xyz tcp dpt:15672
ACCEPT tcp -- !docker0 docker0 anywhere xyz tcp dpt:5671
ACCEPT tcp -- !docker0 docker0 anywhere xyz tcp dpt:amqp
因此它不会打开端口 $someport 和 $somemgtport,而是打开对应于容器“内部”的端口:5671 和 15672(来自 rabbitmq 的端口)。
=> 在我看来,它所做的与我的期望完全相反……!
我对这个命令做错了什么docker run
?
注意:我想要默认端口以外的其他端口,因为我在同一台机器上运行了 2 个 rabbitmq 实例。
netstat -pln
更新-这是(带有someport=55001
和)的部分输出somemgtport=65002
:
tcp6 0 0 :::55001 :::* LISTEN 29613/docker-proxy
tcp6 0 0 :::65002 :::* LISTEN 29622/docker-proxy
netstat -pln | grep 15672
没有输出
答案1
弃用通知:这个问题已经过时了,当时可能产生这个问题的东西已经不存在了。Docker 很久以前就停止使用 iptables(以实现端口重定向),自问题发布以来,网络层至少被重写了两次。