2015-09-07 5 views
9

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

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

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

Здесь есть решение How do I know mapped port of host from docker container?. Но это не применимо, если я запускаю контейнер с -P. Поскольку этот вопрос задан более 1 года назад, мне интересно, может быть, есть новая функция, добавленная в докер для решения этой проблемы.

ответ

1

После того, как контейнер был запущен, он будет посылать запрос НТТРА менеджер с адресом и портом

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

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


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

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


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

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

9

Вы можете также вы 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 
+1

Спасибо, но это не может быть запущена внутри контейнера. Можно ли получить порт внутри контейнера? – iuradz

2

я разделяю /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

+0

Проблема только в том, что если ваша служба получает компрометацию, вы создаете новый вектор атаки на всю вашу докеревую систему ... Я думаю, что я предпочел бы сделать специальный контейнер докеров, чтобы предоставить вам информацию для вашего контейнера ... потому что только ваш контейнер будет общаться с ним, а не внешним миром –

Смежные вопросы