Развертывание контейнеров из разных docker-compose.yml - PullRequest
0 голосов
/ 28 февраля 2019

В настоящее время у меня есть брокер сообщений rabbitmq и несколько работников сельдерея , которые должны быть упакованы в контейнеры.Моя проблема в том, как я могу запустить контейнеры, используя различные docker-compose.yml?Моя цель - раз и навсегда запустить rabbitmq и никогда больше не трогать его.

В настоящее время у меня есть docker-compose.yml для rabbitmq :

version: '2'
services:
    rabbit:
        hostname: rabbit
        image: rabbitmq:latest
        environment:
            - RABBITMQ_DEFAULT_USER=admin
            - RABBITMQ_DEFAULT_PASS=mypass
        ports:
            - "5672:5672"
        expose:
            - "5672"

И еще docker-compose.yml для работников сельдерея :

version: '2'
services:
    worker:
        build:
            context: .
            dockerfile: dockerfile
        volumes:
            - .:/app
        environment:
            - CELERY_BROKER_URL=amqp://admin:mypass@rabbit:5672
        links:
            - rabbit

Однако, когда я делаю docker-compose up для работников сельдерея , я получаю следующую ошибку:

ERROR/MainProcess] consumer: Cannot connect to 
amqp://admin:**@rabbit:5672//: failed to resolve broker hostname.

Может кто-нибудь взглянуть, если что-то не так?с моим кодом?Спасибо.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

имя домена rabbit во втором файле docker-compose.yml не разрешается, поскольку в этом файле docker-compose.yml нет службы с таким именем.

Как указано в комментариях,Одно из решений - поместить службу rabbit и службу worker в один файл docker-compose.yml.При такой настройке все контейнеры, запущенные для этих служб, будут подключаться к одной и той же сети докеров, и имена этих служб могут быть разрешены по IP-адресам их контейнеров.

Поскольку наличие одного файла docker-compose.yml не являетсяудобно в вашем случае, вам нужно найти другой способ, чтобы контейнеры, происходящие из разных файлов docker-compose.yml, подключались к одной и той же сети докеров.

Для этого вам необходимо создать выделенную сеть докеров для этой цели:

docker network create rabbitNetwork

Затем в каждом файле docker-compose.yml вам потребуется см. эту сеть в определениях услуг:

version: '2'
services:
    rabbit:
        hostname: rabbit
        image: rabbitmq:latest
        environment:
            - RABBITMQ_DEFAULT_USER=admin
            - RABBITMQ_DEFAULT_PASS=mypass
        # ports:
        #    - "5672:5672"  # there is no need to publish ports on the docker host anymore
        expose:
            - "5672"
        networks:
            - rabbitNet

networks:
  rabbitNet:
    external:
      name: rabbitNetwork
version: '2'
services:
    worker:
        build:
            context: .
            dockerfile: dockerfile
        volumes:
            - .:/app
        environment:
            - CELERY_BROKER_URL=amqp://admin:mypass@rabbit:5672
        networks:
            - rabbitNet

networks:
  rabbitNet:
    external:
      name: rabbitNetwork
0 голосов
/ 01 марта 2019

Вы можете использовать любой файл в качестве определения сервиса.docker-compose.yml является именем файла по умолчанию, но любое другое имя может быть передано с помощью аргумента -f.

docker-compose -f rabbit-compose.yml COMMAND
...