У меня есть образ Docker на основе
rabbitmq
.В моем Dockerfile нет никаких указаний на порты.
Я привязываю обычные порты rabbitmq (5671, 5672 и 15672) к своим пользовательским портам, запуская свой экземпляр следующим образом:
docker run -d -p $someport:5671 -p 127.0.0.1::5672 -p $somemgtport:15672 myimage
В моей цепочке INPUT iptables ничего нет, а цепочка FORWARD заполнена обычными вещами Docker.
Проблема
Когда $somemgtport
отличается от 15672
Я не могу получить к нему доступ (интерфейс управления rabbitmq через HTTP) из внешнего мира.
Но, похоже, я -p
правильно использовал флаг, потому что curl https://localhost:$somemgtport
он работает так, как и ожидалось (как и вызовы amqp к $someport).
При запуске цепочка DOCKER iptables выглядит следующим образом:
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 (для перенаправления портов), сетевой уровень был переписан с нуля как минимум дважды с момента публикации вопроса.