从不同的 docker-compose.yml 部署容器
Deploy containers from different docker-compose.yml
目前我有一个 rabbitmq 消息代理和多个 celery worker 需要容器化。我的问题是,如何使用不同的 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
用于 celery workers:
version: '2'
services:
worker:
build:
context: .
dockerfile: dockerfile
volumes:
- .:/app
environment:
- CELERY_BROKER_URL=amqp://admin:mypass@rabbit:5672
links:
- rabbit
但是,当我为 celery workers 执行 docker-compose up
时,我不断收到以下错误:
ERROR/MainProcess] consumer: Cannot connect to
amqp://admin:**@rabbit:5672//: failed to resolve broker hostname.
谁能看看我的代码有没有问题?谢谢。
您可以使用任何文件作为服务定义。
docker-compose.yml
是默认文件名,但可以使用 -f
参数传递任何其他名称。
docker-compose -f rabbit-compose.yml COMMAND
您的第二个 docker-compose.yml 文件中的域名 rabbit
无法解析,因为 docker-[=28] 中没有使用该名称的服务=] 文件.
如评论中所述,一种解决方案是将 rabbit
服务和 worker
服务放在同一个 docker-compose.yml 文件中。在这样的设置中,为这些服务启动的所有容器都将加入同一个 docker 网络,并且这些服务名称可以解析为其容器的 IP 地址。
因为在你的情况下只有一个 docker-compose.yml 文件不方便,你必须找到其他方法让容器来自不同的 docker-compose.yml 个文件加入同一个 docker 网络。
为此,您需要为此目的创建专用 docker network:
docker network create rabbitNetwork
然后,在每个 docker-compose.yml 文件中,您需要 refer to this network 在服务定义中:
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
目前我有一个 rabbitmq 消息代理和多个 celery worker 需要容器化。我的问题是,如何使用不同的 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
用于 celery workers:
version: '2'
services:
worker:
build:
context: .
dockerfile: dockerfile
volumes:
- .:/app
environment:
- CELERY_BROKER_URL=amqp://admin:mypass@rabbit:5672
links:
- rabbit
但是,当我为 celery workers 执行 docker-compose up
时,我不断收到以下错误:
ERROR/MainProcess] consumer: Cannot connect to
amqp://admin:**@rabbit:5672//: failed to resolve broker hostname.
谁能看看我的代码有没有问题?谢谢。
您可以使用任何文件作为服务定义。
docker-compose.yml
是默认文件名,但可以使用 -f
参数传递任何其他名称。
docker-compose -f rabbit-compose.yml COMMAND
您的第二个 docker-compose.yml 文件中的域名 rabbit
无法解析,因为 docker-[=28] 中没有使用该名称的服务=] 文件.
如评论中所述,一种解决方案是将 rabbit
服务和 worker
服务放在同一个 docker-compose.yml 文件中。在这样的设置中,为这些服务启动的所有容器都将加入同一个 docker 网络,并且这些服务名称可以解析为其容器的 IP 地址。
因为在你的情况下只有一个 docker-compose.yml 文件不方便,你必须找到其他方法让容器来自不同的 docker-compose.yml 个文件加入同一个 docker 网络。
为此,您需要为此目的创建专用 docker network:
docker network create rabbitNetwork
然后,在每个 docker-compose.yml 文件中,您需要 refer to this network 在服务定义中:
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