docker - 为什么 docker 容器已经设置了 network_mode:"host" 并且公众仍然可以从 "http://ip:port" 访问
问题描述
我尝试制作这样的架构:
- docker_container_1 nginx:公开(network_mode:“桥”,端口:80)
- docker_container_2 web_serverI:作为内部服务(network_mode:“主机”,端口: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"
- 比我用“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
选项。没有这个,容器间通信仍然可以工作。
推荐阅读
- asp.net - ASPX 有变化。CS页面需要构建。
- javascript - 将 GET 参数传递给 jsfiddle 嵌入式版本
- reactjs - React 组件不会改变父级的状态
- firebase - Firestore 聊天应用程序结构 - 未读/已读消息架构
- javascript - 从函数发出事件的正确方法 - Node JS - Socket.io
- django - {% if } 用于隐藏 Django HTML 文件中的表格视图
- android - 如何从指定的目录路径使用android目录选择器
- sql-server - 在同一张表上查询两次不同的列
- excel - 在链接到访问表(并打开)时编辑 Excel 工作表
- sql-server - 实体框架视图使用问题