簡體   English   中英

為什么 docker 容器已經設置了 network_mode:“host” 並且公眾仍然可以從“http://ip:port”訪問

[英]Why docker container already set network_mode:“host” and the public still can access from “http://ip:port”

我嘗試制作這樣的架構:

  1. docker_container_1 nginx:公開(network_mode:“bridge”,端口:80)
  2. docker_container_2 web_serverI:作為內部服務(network_mode:“主機”,端口:8080)
  3. docker_container_2 web_serverII: 作為內部服務 (network_mode:"host", port:8081)

upstream server-i {
    server 172.17.0.1:8080;
}

upstream server-ii {
    server 172.17.0.1:8081;
}

server {
    listen       80;
    server_name  localhost;

    location /service-i {
        proxy_pass http://server-i;   
    }

    location /service-ii {
        proxy_pass http://server-ii;   
    }
    
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
  • 我已經設置了服務 i 和 ii network_mode:"host"
  • 比我使用“docker ps”檢查,只有 nginx PORTS 顯示 0.0.0.0:80->80/tcp,其他什么都沒有。
  • 而且我還使用“docker stats”來檢查,所有容器的 NET I/O 僅 nginx 的值其他為零。
  • 我發現仍然可以從外部使用訪問 server_i server-ii:http://ip:port(8080 和 8081)怎么辦? 我想念什么嗎?

如果您指定network_mode: host ,它將禁用該容器的所有 Docker 網絡功能。 您不能重新映射容器端口或阻止它在主機上可見; 您不能使用普通的 Docker 容器間網絡連接容器之間。 從網絡的角度來看,您的主機網絡容器與直接在主機上運行的非 Docker 進程沒有區別。

幾乎從不需要主機網絡。 在一些非常不尋常的情況下——如果你的服務有數千個它監聽的端口,如果你測量到 Docker NAT 開銷對於非常大的流量非常重要——它可以繞過 Docker 網絡系統的一些限制. 在幾乎所有實際情況下,您都應該使用默認(橋接)網絡,並在需要從 Docker 空間外部訪問時發布特定端口。

你應該:

  • 禁用所有容器上的主機網絡; 請改用標准橋接網絡。 (在非 Compose 上下文中,您需要在docker network create一個具有默認設置的網絡。)
  • 更新您的 Nginx 配置以使用其他容器的名稱作為主機名; server docker_container_2 web_serverI:8080 有關更多詳細信息,請參閱Compose 中的網絡示例。
  • 如果您不希望從 Docker 空間外部看到后端容器,請刪除它們的 Compose ports:配置或docker run -p選項。 沒有這個,容器間通信仍然可以工作。

暫無
暫無

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

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