You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Swarm栈服务如何在特定接口暴露端口?Digital Ocean私有网络场景

绝对可以实现!我之前在Digital Ocean上部署Docker Swarm集群时,刚好碰到过和你一模一样的需求——要把管理类服务藏在私有网络里,绝不暴露到公网IP上。下面给你分享几个靠谱的解决方案:

方案1:修改Swarm Ingress网络,让它只绑定私有IP

Swarm默认的ingress网络会把暴露的端口绑定到节点的所有网卡(包括公网和私有网卡),我们可以重新创建一个只绑定私有IP的ingress网络:

  1. 先删除默认的ingress网络(注意:操作前要暂停所有依赖ingress的服务,或者提前做好服务迁移准备):
docker network rm ingress
  1. 创建新的ingress网络,指定绑定到你的Droplet私有IP(比如你的eth1对应的IP是10.128.0.10):
docker network create -d overlay \
  --ingress \
  --opt com.docker.network.bridge.host_binding_ipv4=10.128.0.10 \
  --subnet=10.1.0.0/16 \
  --gateway=10.1.0.1 \
  ingress-private

这样之后,所有通过这个ingress-private网络暴露的服务端口,都会只监听在指定的私有IP上,公网IP完全看不到这些端口。如果集群里还有需要公网访问的服务,你可以保留默认ingress网络,同时创建这个私有ingress,给不同服务分配不同的网络即可。

方案2:为单个管理服务指定私有IP绑定(不修改默认Ingress)

如果你不想动默认的ingress网络,只想单独处理个别管理服务,可以在部署服务时用host模式发布端口,并指定绑定的私有IP:

docker service create \
  --name private-admin-service \
  --network your-existing-private-overlay-network \
  --publish published=8080,target=8080,mode=host,ip=10.128.0.10 \
  your-admin-image:latest

这里的your-existing-private-overlay-network是你已经创建的、基于eth1私有网络的Swarm overlay网络。用mode=host+ip=私有IP的组合,能让服务端口只绑定在私有网卡上,完全不碰公网IP。

方案3:优化你当前的普通容器临时方案

如果你的管理服务不需要Swarm的服务发现、滚动更新等特性,也可以优化现有的普通容器方案,启动容器时直接指定绑定私有IP:

docker run -d \
  --name private-admin-container \
  --network your-private-bridge-network \
  --publish 10.128.0.10:8080:8080 \
  your-admin-image:latest

这样容器的8080端口只会绑定在10.128.0.10这个私有IP上,公网根本访问不到。

额外注意事项

  • 验证端口监听:部署完成后,在Droplet上执行ss -tulpn | grep 8080(替换成你的端口号),确认输出里的监听地址是你的私有IP,而不是0.0.0.0(0.0.0.0表示所有网卡都监听,包括公网)。
  • 私有网络互通:Digital Ocean同区域内的Droplet私有网络默认是互通的,跨区域的话需要额外配置,但管理服务一般都在同区域集群内,所以不用太担心。
  • Swarm特性保留:如果你的管理服务需要Swarm的集群调度、故障转移等能力,优先选择方案1或2,不要用普通容器方案,不然会失去Swarm的核心优势。

内容的提问来源于stack exchange,提问作者pjotr_dolphin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:03:18