我有一个docker-compose文件,其中包括以下服务:
- Dind(在这个容器中有其他容器负责消费RabbitMQ队列)
- RabbitMQ
我希望Dind的子容器在与Dind相同的docker-compose文件中使用来自RabbitMQ的消息。
version: '3.8'
services:
dind:
build:
context: docker-compose-command-api
dockerfile: Dockerfile
container_name: docker-compose-command-api
privileged: true
ports:
- "8080:8080"
volumes:
- ./message-consumer-worker:/app/message-consumer-worker:ro
networks:
- default
rabbitmq:
image: rabbitmq:3.12.10-management
container_name: rabbitmq
environment:
- RABBITMQ_DEFAULT_USER=guest
- RABBITMQ_DEFAULT_PASS=guest
ports:
- "5672:5672"
- "15672:15672"
volumes:
- ./rabbitmq/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf:ro
- ./rabbitmq/definitions.json:/etc/rabbitmq/definitions.json:ro
healthcheck:
test: [ "CMD", "rabbitmqctl", "status" ]
interval: 5s
timeout: 20s
retries: 5
networks:
- default
networks:
default:
driver: bridge
字符串
将在Dind中运行的docker-compose:
version: '3.8'
services:
app:
build:
context: message-consumer-worker
dockerfile: Dockerfile
container_name: message-consumer-worker
型
从我的研究来看,使用外部网络是可能的。但由于缺乏知识,我没有实现它。
我在Docker(DinD)中运行Docker,因为在Docker中,我有一个负责扩展消费者的API。例如,API接收到一个扩展10个消费者的请求,然后它使用“docker compose up”命令创建容器。这就是为什么我需要在Docker中运行Docker以使我的消费者可扩展。你有什么其他建议可以帮助我吗?
2条答案
按热度按时间gzszwxb41#
我认为你需要在docker-compose文件中使用
network_mode: host
。这将使内部容器使用与主机(外部容器)相同的网络。bqjvbblv2#
Docker网络特定于Docker守护进程的示例。如果您正在运行Docker中的Docker设置,则嵌套的Docker守护进程具有自己的映像,容器,卷和网络;您不能在两个Dockers之间共享任何这些资源。Compose
external: true
网络允许一个Compose文件附加到在此特定Compose文件之外创建的网络,但在其他Docker守护进程中却没有。Docker Hubdocker
image显然没有提供任何类似Docker Desktop上可用的host.docker.internal
主机名的东西来调用守护进程的网络环境。这里最简单的答案是在同一个Compose文件中运行RabbitMQ broker和worker。这里不需要嵌套的Docker守护进程,我可能会完全删除DinD容器。
字符串