Я строю два проекта, которые имеют общие данные. Сервисы двух проектов построены из двух файлов 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