Это четвертый пост в моей серии о доке. Вы не должны были пройти через предыдущий, чтобы понять это. Единственная предпосылка заключается в том, что у вас есть идея о том, какие контейнеры Docker есть. Если вы этого не предложите, вы посмотрите на второй пост.
В этом посте я собираюсь объяснить вам, как вы можете сделать приложение, запущенное в вашем контейнере, связывайтесь с другими услугами (API, базы данных) за пределами этого конкретного контейнера. Теперь, когда мы говорим об этих услугах, которые бегут за пределами контейнера, мы можем разделить их на три категории:
Бег на всемирной паутине. Как общедоступная API (например, Swapi )
Работает на месте на вашей машине. (Например, экземпляр базы данных работает локально)
Работает в другом контейнере. (Например, экземпляр базы данных работает в другом контейнере)
Давайте посмотрим на каждое из этих случаев отдельно.
Работает на всемирной паутине
Угадай, что? Вы столкнетесь с абсолютно без проблем здесь. Если код в вашем контейнере позвонит на некоторую внешнюю 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 автоматически теперь поймет это, поскольку две контейнеры являются частью одной и той же сети. Если он становится немного сложной, позвольте мне суммировать это:
- Создать сеть
- Если контейнер A необходимо поговорить с контейнером B, то в коде контейнера A, замените локальныйhost с именем контейнера B.
- Запустите контейнеры правильными именами и не забудьте указать одну и ту же сеть при запуске.
И с этим, теперь вы хорошо поехать!
Вывод
Это решает все наши проблемы, связанные с сетью при использовании контейнеров. Я надеюсь, что у вас есть довольно хорошее понимание этого и будет чувствовать себя достаточно уверенно, чтобы использовать его.
Спасибо за чтение!:)
Если у вас есть какие-либо отзывы для меня или просто хочу поговорить, не стесняйтесь связываться со мной на Twitter Отказ Я буду более чем рад помочь вам!: D.
Оригинал: «https://dev.to/rinkiyakedad/cross-container-communication-and-networking-in-docker-39n0»