容器连接多个Docker网络时如何仅向指定单个网络暴露端口?
结论
Docker 及 docker-compose 原生暂不支持按单个网络限制端口暴露范围的功能,你没有遗漏相关配置项。
核心原因说明
expose的本质是元数据声明,仅作为镜像端口的提示信息,没有任何访问控制能力。只要容器内部程序监听了对应端口,该容器接入的所有网络下的同网段容器,都可以直接访问这个端口,和是否配置expose无关。ports对应Docker的端口发布能力,仅支持绑定宿主机现有网卡的IP,无法绑定容器自定义子网的IP,你之前测试不生效的判断是正确的。- 你提到的
HOST_IP:HOST_PORT:CONTAINER_IP:CONTAINER_PORT格式并不符合Docker端口配置语法,Docker端口发布仅支持三种格式:容器端口、宿主机端口:容器端口、宿主机IP:宿主机端口:容器端口,不存在包含容器IP的配置规则。
可行替代方案
可以通过拆分容器角色的方式在docker-compose中实现需求,不需要额外配置防火墙:
将需要仅向database网络开放的端口对应的业务逻辑,放到独立的Sidecar容器中,Sidecar容器仅接入database网络,同时和主容器共享网络命名空间,二者通过localhost通信。
示例配置如下:
services: container1: networks: - internet - email # 主容器仅保留internet、email网络的业务逻辑 container1-db-sidecar: # 共享主容器的网络命名空间,和主容器用localhost即可互相通信 network_mode: service:container1 networks: # 仅接入database网络 - database # 目标端口的监听逻辑部署在本容器中,仅能被database网络下的容器访问
内容的提问来源于stack exchange,提问作者Bob Ortiz
相关产品推荐
相关产品推荐

