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

如何在Docker Swarm中配置仅内部服务可访问的私有网络

Docker Swarm内部私有服务访问限制解决方案

报错原因说明

The network ... cannot be used with services. Only networks scoped to the swarm can be used, such as those created with the overlay driver.
上述报错的根因是bridge网络属于单节点本地网络,Docker Swarm集群服务需要跨节点调度,仅支持swarm范围的overlay网络作为服务通信网络。

实现方案

要实现DB服务仅允许内部API访问、完全不对外暴露,按以下步骤配置即可:

1. 定义两类overlay网络

  • public-overlay:普通overlay网络,用于API服务对外暴露端口接收公网请求
  • internal-backend:带internal: true属性的overlay网络,属于集群内部私有网络,加入该网络的服务无法访问公网,也不会被公网访问,仅支持同网络内的服务互访

2. 服务网络分配

  • API服务同时加入上述两个网络,既可以对外提供服务,也可以和同私有网络的DB通信
  • DB服务仅加入internal-backend私有网络,不要配置任何ports端口映射,完全不对外暴露

配置示例(docker-compose.yml)

version: "3.8"

# 定义网络
networks:
  public-overlay:
    driver: overlay
    attachable: true # 可选,允许普通容器接入该网络调试
  internal-backend:
    driver: overlay
    internal: true # 核心配置:标记为内部私有网络,禁止对外通信
    attachable: true

services:
  api:
    image: 你的API镜像地址
    ports:
      - "80:80" # 仅API对外暴露端口
    networks:
      - public-overlay
      - internal-backend
    deploy:
      mode: replicated
      replicas: 2
      restart_policy:
        condition: on-failure

  db:
    image: 你的数据库镜像地址
    # 不要配置ports字段!不要对外映射端口
    expose:
      - "5432" # 仅声明内部监听端口,不会对外暴露
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - internal-backend # 仅加入内部私有网络
    deploy:
      mode: replicated
      replicas: 1
      restart_policy:
        condition: on-failure

volumes:
  db-data:

验证方法

部署成功后可通过以下方式验证隔离效果:

  • 公网直接访问DB端口,完全无法连通
  • 进入API服务容器内部,可正常访问DB的服务名和端口
  • 进入DB服务容器内部,无法访问公网地址

进阶安全限制(可选)

如果需要更严格的访问控制,仅允许API服务访问DB端口,可配合Swarm集群节点的iptables规则,或者安装支持网络策略的CNI插件配置细粒度访问规则。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:24:03