Назад | Перейти на главную страницу

соединение между двумя докер-контейнерами из двух стеков

Я строю два проекта, которые имеют общие данные. Сервисы двух проектов построены из двух файлов YML, созданных в докере. Я хочу получить доступ к серверу MySQL, указанному в одном стеке, из скрипта Python, запущенного в другом стеке.

Я делаю это, подключаясь к внутреннему IP-адресу докера. Однако я обнаружил, что после перезапуска сервера IP-адрес меняется. Я попытался подключиться по имени контейнера или «связать» имя контейнера в файле YML для создания докеров. Оба не работают. Я думаю, что совместное использование одного сетевого интерфейса докеров между двумя стеками должно решить проблему.

Могу ли я узнать, как указать "сеть" в двух файлах YML для создания докеров?

Или есть лучший способ добиться этого?

Спасибо.

Создайте сеть вне ваших файлов компоновки (это позволяет избежать зависимостей от порядка развертывания любого файла компоновки):

$ docker network create dbnet

Затем разместите сервисы, которые вы хотите соединить друг с другом, во внешней сети. Например. файл набора для mysql может быть:

version: '3.5'

networks:
  dbnet:
    external: true
    name: dbnet

services:
  mysql:
    networks:
    - dbnet

И ваш другой файл набора будет подключаться к той же сети:

version: '3.5'

networks:
  dbnet:
    external: true
    name: dbnet

services:
  pythonapp:
    networks:
    - dbnet

Из pythonapp вы подключаетесь к БД как «mysql» (имя службы), а не по IP. Docker будет обрабатывать разрешение DNS за вас, пока контейнеры находятся в одной сети.

Примечание. Я использовал синтаксис 3.5+ для определения внешних сетей. До этого синтаксис был:

networks:
  dbnet:
    external:
       name: dbnet

Подробнее см .: https://docs.docker.com/compose/compose-file/#external-1