如何将Docker Swarm的overlay网络端口绑定到单个指定公网IP
解决方案
方案1:原生端口绑定指定IP(无额外配置,推荐)
Docker Compose 3.2及以上版本支持端口长语法的published_ip参数,可以直接指定Swarm路由网监听的IP,其他节点的对应端口不会被占用,无需手动配置iptables。
修改后的docker-compose.yml示例:
version: '3.9' services: web1: image: nginx ports: - target: 80 published: 8080 protocol: tcp mode: ingress published_ip: 192.168.1.100 # 替换为你需要绑定的目标节点的指定IP
重新部署后,只有该IP对应的8080端口会响应服务请求,其余3台节点的8080端口可正常部署其他服务。
方案2:host端口模式+节点约束(无跨节点转发开销)
如果不需要Swarm路由网的转发能力,还可以用host端口模式配合节点约束,让端口仅绑定到服务运行的目标节点上:
- 先给目标节点打自定义标签,假设目标节点主机名为
node01:
docker node update --label-add role=web-entry node01
- 修改
docker-compose.yml配置:
version: '3.9' services: web1: image: nginx deploy: placement: constraints: # 约束服务仅运行在打了对应标签的节点上 - node.labels.role == web-entry ports: - target: 80 published: 8080 protocol: tcp # 端口使用host模式,仅绑定到服务运行节点的本地网卡 mode: host
该方案的优势是没有路由网的跨节点流量转发开销,服务实例和端口都只在指定节点存在,其余节点的8080端口完全不受影响。
内容的提问来源于stack exchange,提问作者AlanObject
相关产品推荐
相关产品推荐

