[英]How do I setup two docker containers, such that they can see each other?
我为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 以与主机 os 进行通信。
$ curl 0.0.0.0:5672
AMQP
但是,第二个服务无法看到该端口。 以下命令错误,因为它无法连接到 0.0.0.0:5672。
docker-compose run --service-ports celery
如何设置两个 docker 容器,以便它们可以相互看到?
从Docker容器内部,环回地址0.0.0.0引用容器本身。 使用主机的IP地址到达其他容器。
以下是有关如何从容器内部访问主机以及Docker提供的各种网络模式的详细说明: https : //stackoverflow.com/a/24326540/417866
另一种方法是创建一个Docker网络,将两个容器连接到它,然后他们就能够在该网络上相互解析。 详情请访问: https : //docs.docker.com/engine/reference/commandline/network_create/
@ArashMotamedi如果你是对的,那么他也无法从主机连接到rabbitmq
,不是吗?
@AndreiCioara我认为您的docker docker-compose
很好,问题在于命令 - 因为默认情况下--service-ports <service>
docker-compose run
并不打开任何端口,除非您使用--service-ports <service>
指定它们实际执行的操作,但仅限于对于一次一个服务,因此当您docker-compose run --service-ports celery
时, rabbitmq
端口关闭。
除非你有充分的理由使用run
(例如覆盖命令或避免端口冲突),我建议你使用常规
docker-compose up
所以简单的答案就是通过名字互相引用。 在您的撰写文件中,您引用了两个服务:
如果您使用docker-compose up -d(或只是docker-compose up),它将在他们共享的新创建的网络上创建新容器。 Docker compose然后通过自动别名将两个服务注册到该网络的DNS服务。
所以从芹菜中,您可以通过以下方式ping rabbitmq:
ping rabbitmq
和rabbitmq你可以通过ping celery
这适用于所有网络通信,因为它只是名称解析。 您可以通过创建新网络,将它们分配给主机,然后注册别名来手动完成所有操作,但是docker-compose可以完成所有工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.