为什么docker容器已经设置network_mode:"host",而公众仍然可以从"http://ip:port"访问



我试着做一个这样的架构:

  1. docker_container_1 nginx: expose to public (network_mode:"bridge", port:80)
  2. docker_container_2 web_serverI:作为内部服务(network_mode:"host", port: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">
  • >>>>>>>>>>>>>>>>要检查,只有nginx PORTS显示0.0.0.0:80->80/tcp,其他没有。
  • 和我也使用"docker stats";为了检查,只有nginx的所有容器的。NET I/O值为零。
  • 和我发现仍然可以访问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中的Networking。
  • 如果你不想让后端容器在Docker空间之外可见,删除它们的Composeports:配置或docker run -p选项。

最新更新