Рубрики
Uncategorized

Крест контейнер связи и сеть в докере

Это четвертый пост в моей серии о доке. Вам не нужно пройти через предыдущий в … Tagged с новичками, учебником, DevOps, Docker.

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

В этом посте я собираюсь объяснить вам, как вы можете сделать приложение, запущенное в вашем контейнере, связывайтесь с другими услугами (API, базы данных) за пределами этого конкретного контейнера. Теперь, когда мы говорим об этих услугах, которые бегут за пределами контейнера, мы можем разделить их на три категории:

  1. Бег на всемирной паутине. Как общедоступная API (например, Swapi )

  2. Работает на месте на вашей машине. (Например, экземпляр базы данных работает локально)

  3. Работает в другом контейнере. (Например, экземпляр базы данных работает в другом контейнере)

Давайте посмотрим на каждое из этих случаев отдельно.

Работает на всемирной паутине

Угадай, что? Вы столкнетесь с абсолютно без проблем здесь. Если код в вашем контейнере позвонит на некоторую внешнюю API, то он не столкнется без проблем и будет работать идеально, как если бы вы не были бы контейнерированы:)

Бег локально на вашей машине

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

Служба, которую вы будете работать на местном уровне, будет иметь URL-то вроде:

localhost:8000/service

для подключения. Все, что вам нужно сделать в своем коде, чтобы сделать это на работу — это заменить localhost с host.docker.internal. . Так:

'host.docker.internal:8000/service

Это работает, потому что Host.Docker.internal Это специальный адрес, который автоматически переводится на правильный адрес хост-машина POCKER.

Работает в другом контейнере

Это немного сложно, чем два других (которые не должны быть неожиданностью: P). Но я постараюсь объяснить его как можно простые термины.

Основная идея заключается в том, что всякий раз, когда вы хотите, чтобы два или более контейнеров могли «общаться» друг с другом, вы помещаете их в одну и ту же «сеть». Дочсерская сеть — это то, что вы создадите перед запуском любой из контейнеров, используя эту команду:

docker network create dummy_name

Это создаст сеть по имени dummy_name Отказ Теперь вы укажете эту сеть при запуске всех контейнеров, которые вы хотите, чтобы взаимодействовать друг с другом.

Есть еще одно маленькое изменение, которое вам придется сделать. Вы помните, как во втором случае мы заменили localhost с host.docker.internal. ? Точно так же здесь мы заменим это с именем контейнера, которую мы хотим получить доступ.

Например:

docker run -network dummy_name --name appCode image-one
docker run -network dummy_name --name dbInstance image-two

Если я планирую сделать это, то нам нужно будет изменить localhost В коде (из которого мы создали изображение-один), как это:

dbInstance:8000/service

Docker автоматически теперь поймет это, поскольку две контейнеры являются частью одной и той же сети. Если он становится немного сложной, позвольте мне суммировать это:

  1. Создать сеть
  2. Если контейнер A необходимо поговорить с контейнером B, то в коде контейнера A, замените локальныйhost с именем контейнера B.
  3. Запустите контейнеры правильными именами и не забудьте указать одну и ту же сеть при запуске.

И с этим, теперь вы хорошо поехать!

Вывод

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

Спасибо за чтение!:)

Если у вас есть какие-либо отзывы для меня или просто хочу поговорить, не стесняйтесь связываться со мной на Twitter Отказ Я буду более чем рад помочь вам!: D.

Оригинал: «https://dev.to/rinkiyakedad/cross-container-communication-and-networking-in-docker-39n0»