我试着做一个这样的架构:
- docker_container_1 nginx: expose to public (network_mode:"bridge", port:80)
- docker_container_2 web_serverI:作为内部服务(network_mode:"host", port:8080)
- 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配置,使用其他容器的名字作为主机名; - 如果你不想让后端容器在Docker空间之外可见,删除它们的Compose
ports:
配置或docker run -p
选项。
server docker_container_2 web_serverI:8080
。有关更多详细信息,请参见例如Compose中的Networking。