Как связать порт в одном док-контейнере с портом в другом док-контейнере? - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь привязать порт 9000 на док-контейнере 1 (A) к порту 9000 на док-контейнере 2 (B).

Я попробовал вариант --net host, но это не помогло мне.Мне нужно, чтобы оба контейнера находились в одной и той же сети (172.17.0.x), а их порты были привязаны так же, как флаг -p port используется для привязки одного контейнера к хосту.Я попытался настроить порты прослушивания как на А, так и на В, используя --expose flag, но я не смог связать их.

docker run -p 8080:8080\ # to bind port 8080 on A to port 8080 on the host
    -it -d \
    --cap-add NET_ADMIN \
    --cap-add NET_RAW \
    --expose 9000 \ # listening port to communicate with B
    <image file>

docker run -p 8081:8081\ # to bind port 8081 on B to port 8081 on the host
    -it -d \
    --cap-add NET_ADMIN \
    --cap-add NET_RAW \
    --expose 9000 \ # listening port to communicate with B
    <image file>

Я хотел бы сопоставить порт 9000 А с портом 9000 В (или любым другимдругой порт) Спасибо!

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

То, что вы описываете, невозможно сделать с параметром expose.--net=host указывает вашему контейнеру работать в сети хоста, открывая все порты всех ваших контейнеров, запущенных с этим флагом.

Вы можете создать сеть докеров и подключить к ней оба контейнера.

Пример:

$ docker network create mynetwork --driver bridge
$ docker run -d --name containerA -p 8080:8080 --net=mynetwork <image>:tag
$ docker run -d --name containerB -p 8081:8081 --net=mynetwork <image>:tag

Это создаст запись DNS для containerA и containerB с тем же именем контейнера, которое будет разрешено из любого контейнера в вашей пользовательской сети.

Так что теперь, если вы хотите получить доступ к containerB из containerA, вы просто используете имя контейнера, например:

curl http://containerB:8080

Другим решением будет использование docker-compose:

version: '3'
services:
  containerA:
    image: <image>:<tag>
  containerB:
    image: <image>:<tag>

Поскольку docker-compose также создает пользовательскую сеть, вы можете обращаться к контейнерам так же, как я описал ранее.

Подробнее о docker-compose и определяемых пользователемсети здесь: https://docs.docker.com/compose/overview/

https://docs.docker.com/network/bridge/

0 голосов
/ 17 апреля 2019

Это невозможно сделать.Но это и не нужно.Если оба контейнера находятся в одной сети, они могут видеть друг друга, просто ссылайтесь на них по IP или имени.

Чтобы добавить значительное имя, используйте --name my_memorable_name в качестве параметра для docker run, и вы готовы к работе.При этом из любого другого Docker-контейнера вы можете ссылаться на этот конкретный контейнер по имени, например:

curl http://my_memorable_name:8080

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...