我为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
一切正常。我可以ping并连接到端口5672以便与主机操作系统进行通信。
$ curl 0.0.0.0:5672
AMQP
但是,第二个服务看不到该端口。以下命令错误,因为它无法连接到0.0.0.0:5672。
docker-compose run --service-ports celery
如何设置两个docker容器,使它们可以互相看到?
答案 0 :(得分:0)
在Docker容器内部,回送地址0.0.0.0指向容器本身。使用主机的IP地址访问另一个容器。
以下是有关如何从容器内部访问主机以及Docker提供的各种网络模式的广泛解释:https://stackoverflow.com/a/24326540/417866
另一种方法是创建一个Docker网络,将两个容器都连接到该网络,然后它们将能够在该网络上相互解析。此处的详细信息:https://docs.docker.com/engine/reference/commandline/network_create/
答案 1 :(得分:0)
@ArashMotamedi,如果您是正确的话,他也将无法从主持人连接到rabbitmq
,对吗?
@AndreiCioara我认为您的docker-compose
很好,命令出了问题-因为docker-compose run
默认情况下不会打开任何端口,除非您用--service-ports <service>
指定了它们的实际用途,但一次仅适用于一项服务,因此在运行rabbitmq
时docker-compose run --service-ports celery
端口将关闭。
除非您有充分的理由使用run
(例如覆盖命令或避免端口冲突),否则我建议您使用常规
docker-compose up
答案 2 :(得分:0)
因此,简单的答案是按名称相互引用。在撰写文件中,您引用两项服务:
如果您使用docker-compose up -d(或仅使用docker-compose up),它将在它们共享的新创建网络上创建新容器 。然后,Docker compose通过自动别名将这两种服务注册到该网络的DNS服务。
所以从芹菜中,您可以通过以下方式ping Rabbitmq:
ping rabbitmq
,然后在rabbitmq上可以通过
ping celery
这仅适用于名称解析,因此适用于所有网络通信。您可以通过创建一个新网络,将它们分配给主机,然后注册别名来手动完成所有操作,但是docker-compose可以完成所有艰苦的工作。