Как получить сопоставленный порт на хосте из контейнера докеров?

Я хочу запустить задачу в некоторых контейнерах докеров на разных хостах. И я написал приложение-менеджер для управления контейнерами (запуск задачи, остановка задачи, получение статуса и т.д.). Как только контейнер запущен, он отправит http-запрос менеджеру с его адресом и портом, чтобы менеджер знал, как управлять контейнером.

Так как на одном хосте может быть несколько контейнеров, они будут отображаться на разные порты. Чтобы зарегистрировать контейнер у моего менеджера, я должен знать, к какому порту сопоставляется каждый контейнер.

Как я могу получить сопоставленный порт внутри контейнер-докер?

Здесь есть решение Как узнать сопоставленный порт хоста из контейнера docker?. Но это не применимо, если я запускаю контейнер с -P. Поскольку этот вопрос задан более 1 года назад, мне интересно, может быть, новая функция добавлена ​​в докер для решения этой проблемы.

Ответ 1

Как только контейнер запущен, он отправит http-запрос менеджеру с его адресом и портом

Это не будет работать. Изнутри контейнера вы не можете определить, к какому порту хост-докера подключен порт контейнера.

Что я могу думать о том, что будет работать и быть ближе всего к тому, что вы описываете, это сделать контейнер открытым подключением к серверу с менеджером. Такое соединение позволит двум способам связи между вашим менеджером и контейнером, все еще находясь над HTTP.


То, что вы пытаетесь достичь, называется обнаружением службы. Уже есть инструменты для обнаружения сервисов, которые работают с Docker. Вы должны выбрать один из них вместо того, чтобы пытаться сделать свой собственный.

См. например:


Если вы действительно хотите внедрить свою систему обнаружения сервисов, один из способов сделать это, чтобы ваш менеджер использовал команду docker event (или один из docker client librairies). Это позволит вашему менеджеру получать уведомления о создании/удалении контейнеров, не имеющих ничего общего с контейнером.

Затем запросите хост докера, чтобы выяснить порты, которые сопоставлены с вашими контейнерами docker port.

Ответ 2

Вы также можете docker port container_id

Документ

https://docs.docker.com/reference/commandline/port/

примеры из документа

$ docker port test
7890/tcp -> 0.0.0.0:4321
9876/tcp -> 0.0.0.0:1234
$ docker port test 7890/tcp
0.0.0.0:4321
$ docker port test 7890/udp
2014/06/24 11:53:36 Error: No public port '7890/udp' published for test
$ docker port test 7890
0.0.0.0:4321

Ответ 3

Я делюсь /var/run/docker.sock в контейнер и получаю информацию о себе

docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock alpine:latest sh

в оболочке контейнера

env //get HOSTNAME

curl --unix-socket /var/run/docker.sock http://localhost/containers/3c6b9e44a622/json

3c6b9e44a622 является вашим HOSTNAME