Как настроить два док-контейнера, чтобы они могли видеть друг друга? - PullRequest
0 голосов
/ 15 июня 2019

У меня есть две службы, определенные для docker-compose

version: '3'

services:
    celery:
        build:
            context: .
            dockerfile: ./docker/celery/Dockerfile
        command: celery -A api.tasks worker -l info
    rabbitmq:
        image: "rabbitmq:3-management"
        ports:
            - "5672:5672"
            - "15672:15672"
        hostname: "0.0.0.0"

Я могу запустить первую службу

docker-compose run --service-ports rabbitmq

И все работает хорошо.Я могу пропинговать и подключиться к порту 5672 для связи с хостом os.

$ curl 0.0.0.0:5672
AMQP

Однако вторая служба не может видеть этот порт.Следующие ошибки команды, потому что он не может подключиться к 0.0.0.0:5672.

docker-compose run --service-ports celery

Как настроить два контейнера докеров, чтобы они могли видеть друг друга?

Ответы [ 3 ]

0 голосов
/ 15 июня 2019

@ ArashMotamedi, если вы были правы, он не сможет подключиться к rabbitmq с хоста, не так ли?

@ AndreiCioara Я думаю, что ваш docker-compose в порядке, проблема в том,с командой - поскольку docker-compose run по умолчанию не открывает никаких портов, если вы не указали их с помощью --service-ports <service>, что вы на самом деле сделали, но только для одной службы за раз, поэтому порты rabbitmq закрываются при запуске docker-compose run --service-ports celery.

, если у вас нет очень веских причин использовать run (например, переопределить команду или избежать коллизии портов), я рекомендую использовать обычный

docker-compose up
0 голосов
/ 20 июня 2019

Таким образом, простой ответ - обращаться друг к другу по имени. В вашем файле compose вы ссылаетесь на две службы:

  • RabbitMQ
  • сельдерей

если вы используете docker-compose up -d (или просто docker-compose up), он создаст новые контейнеры во вновь созданной сети, к которой они совместно используют . Затем Docker compose регистрирует обе службы в службе DNS для этой сети через автоматический псевдоним.

Так что из сельдерея вы можете пинговать кролика через:

ping rabbitmq и на rabbitmq вы можете пинговать сельдерей через ping celery

Это относится ко всем сетевым коммуникациям, так как это просто разрешение имен. Вы можете выполнить все это вручную, создав новую сеть, назначив их хостам, а затем зарегистрировав псевдонимы, но docker-compose выполняет всю тяжелую работу.

0 голосов
/ 15 июня 2019

Внутри контейнера Docker адрес обратной связи 0.0.0.0 относится к самому контейнеру.Используйте IP-адрес вашего хоста, чтобы добраться до другого контейнера.

Вот подробное объяснение того, как связаться с вашим хостом из контейнера и из различных сетевых режимов, которые предлагает Docker: https://stackoverflow.com/a/24326540/417866

Другой подход заключается в создании Docker Network, подключив обаконтейнеры к нему, и тогда они смогут разрешать друг друга в этой сети.Подробности здесь: https://docs.docker.com/engine/reference/commandline/network_create/

...