簡體   English   中英

如何設置兩個 docker 容器,以便它們可以相互看到?

[英]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

所以簡單的答案就是通過名字互相引用。 在您的撰寫文件中,您引用了兩個服務:

  • 的RabbitMQ
  • 芹菜

如果您使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM