簡體   English   中英

為什么docker容器不能在一個網絡內通過ip互相訪問?

[英]Why docker containers can't access each other by ip within one network?

我已經設置了 service_main流登錄套接字 127.0.0.1:6000
簡化的 docker-compose.yml 看起來像這樣:

version: "3"

networks:
  some_network:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 100.100.100.0/24
          gateway: 100.100.100.1
services:
  service_main:
    image: someimage1
    networks:
      some_network:
        ipv4_address: 100.100.100.2
  
  service_listener:
    image: someimage2
    networks:
      some_network:
        ipv4_address: 100.100.100.21
    entrypoint: some_app
    command: listen 100.100.100.2:6000

我假設它應該工作,因為兩個容器都屬於一個網絡。
但是,我收到一個錯誤(來自 service_listener),即 100.100.100.2:6000 不可​​用(我認為該服務嘗試偵聽某些公共套接字而不是網絡。)

我嘗試了不同的方法,但沒有深入理解:在 service_main 上公開/發布 6000 端口,或將日志的套接字設置為 100.100.100.21:6000 並在 service_listener 中監聽 127.0.0.1:6000(也結束發布端口)。 但沒有任何作用。 顯然我不明白為什么。

在具有類似方法的同一網絡中 - powerdns 和 postgresql 工作正常 - 我在配置中告訴 powerdns db 主機在 100.100.100.x 上並且它可以工作。

這一切都取決於你想做什么

如果你想從外部訪問 service_main 就像運行容器的主機一樣,那么有兩種方法可以解決這個問題:

  1. 發布端口。 這是通過 Ports 命令完成的:
services:
  service_main:
    image: someimage1
    ports:
      - "6000:4000"

在這種情況下,端口 4000 是 someimage1 在 Docker 容器內運行的端口。

  1. 使用與 Docker 容器的 IP 地址通信的 ProxyServer。

但是您需要確保您在 Docker 容器(someimage1)中運行的東西確實在端口 6000 上運行。

代理服務器

proxyserver 方法的好處是您可以在另一個 docker 容器中使用 nginx,並將所有部署和網絡內容放在那里。 以我在 docker 中創建的代理服務器為例,無恥的自我推銷

不可路由網絡

而且我總是將不可路由的網絡用於內部網絡,而不是 100.100.100.*

我假設當我發布/映射端口時 - 我使它不僅可用於 docker compose 網絡,還可用於外部調用。

我的問題已通過以下步驟解決:

  1. 在 service_main 的配置中,我設置它應該將日志流式傳輸到套接字:100.100.100.21:6000
  2. 在 service_listener 我告訴里面的應用程序監聽 0.0.0.0:6000 端口
  service_listener:
    image: someimage2
  networks:
    some_network:
      ipv4_address: 100.100.100.21
  entrypoint: some_app
  command: listen 0.0.0.0:6000

它有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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