【问题标题】:How do I setup two docker containers, such that they can see each other?如何设置两个 docker 容器,以便它们可以互相看到?
【发布时间】:2019-10-29 22:38:54
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    从 Docker 容器内部,环回地址 0.0.0.0 指的是容器本身。使用主机的 IP 地址访问另一个容器。

    以下是关于如何从容器内部访问主机以及 Docker 提供的各种网络模式的详细说明:https://stackoverflow.com/a/24326540/417866

    另一种方法是创建一个 Docker 网络,将您的两个容器连接到它,然后它们将能够在该网络上相互解析。详情在这里:https://docs.docker.com/engine/reference/commandline/network_create/

    【讨论】:

      【解决方案2】:

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

      • rabbitmq
      • 芹菜

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

      所以从 celery 中,您可以通过以下方式 ping rabbitmq:

      ping rabbitmq 在 rabbitmq 上你可以通过 ping celery ping celery

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

      【讨论】:

        猜你喜欢
        • 2020-02-05
        • 2021-12-19
        • 2010-11-03
        • 1970-01-01
        • 2016-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-04
        相关资源
        最近更新 更多