如何设置两个docker容器,使它们可以互相看到?

时间:2019-06-15 17:26:23

标签: docker docker-compose docker-container docker-networking

我为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容器,使它们可以互相看到?

3 个答案:

答案 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>指定了它们的实际用途,但一次仅适用于一项服务,因此在运行rabbitmqdocker-compose run --service-ports celery端口将关闭。

除非您有充分的理由使用run(例如覆盖命令或避免端口冲突),否则我建议您使用常规

docker-compose up

答案 2 :(得分:0)

因此,简单的答案是按名称相互引用。在撰写文件中,您引用两项服务:

  • rabbitmq
  • 芹菜

如果您使用docker-compose up -d(或仅使用docker-compose up),它将在它们共享的新创建网络上创建新容器 。然后,Docker compose通过自动别名将这两种服务注册到该网络的DNS服务。

所以从芹菜中,您可以通过以下方式ping Rabbitmq:

ping rabbitmq,然后在rabbitmq上可以通过 ping celery

这仅适用于名称解析,因此适用于所有网络通信。您可以通过创建一个新网络,将它们分配给主机,然后注册别名来手动完成所有操作,但是docker-compose可以完成所有艰苦的工作。