关键是为每条业务线创建独立--internal自定义bridge网络实现隔离,再通过专用网关容器按需打通特定通道,而非混入同一网络或开放全通;例如finance-line与marketing-line默认不通,仅允许finance-line容器经api-gateway访问/marketing-line的/report/接口。

要让不同业务线的容器彼此隔离、按需互通,关键不是“禁止所有通信”,而是通过网络分层设计实现精准控制。核心思路是:每个业务线独占一个自定义 bridge 网络,必要时用共享网关或代理容器打通特定通道,而非混入同一网络或开放全通。
为每条业务线创建独立内部网络
这是隔离的基础。使用 --internal 参数创建纯内网网络,天然阻断外发流量,同时避免容器意外访问宿主机或公网:
- 运行命令:
docker network create --subnet=10.20.10.0/24 --gateway=10.20.10.1 --internal finance-line - 同理创建:
docker network create --subnet=10.20.20.0/24 --gateway=10.20.20.1 --internal marketing-line - 启动容器时明确指定网络:
docker run --network finance-line --name db-finance -d mysql:8
此时 finance-line 和 marketing-line 之间默认完全不通,各自内部容器可互访(如 ping db-finance 成功),但都 ping 不通 8.8.8.8 或宿主机外网接口。
跨业务线有限互通:用专用网关容器中转
若财务系统需调用营销系统的报表 API,不建议直接连通两个 --internal 网络(会破坏隔离边界),而应部署一个受控的“网关容器”:
- 创建中立网络:
docker network create gateway-net - 启动代理容器(如 nginx)并同时接入三个网络:
docker run -d --name api-gateway --network finance-line --network marketing-line --network gateway-net nginx - 在 nginx 配置中仅开放
/report/*路由代理到 marketing-line 的服务,其余请求全部拒绝
这样,finance-line 内容器只与 api-gateway 通信,无法直连 marketing-line 任何其他容器;所有跨线流量经统一入口审计和限流。
允许部分容器访问外部服务
某些业务线需要拉取配置中心或推送日志,但又不能放开整个网络。推荐两种安全做法:
-
单容器出站:对特定容器取消
--internal限制,改用普通 bridge 网络,并严格限制其暴露端口和挂载目录,例如:docker run --network default --name log-sender -v /var/log:/logs:ro alpine sh -c "apk add curl && curl -X POST https://log.internal/api/v1 -d @/logs/app.log" -
白名单 iptables 规则:在宿主机上为某子网放行目标 IP:
sudo iptables -I DOCKER-USER -s 10.20.10.0/24 -d 192.168.5.100 -j ACCEPT(仅允许 finance-line 访问内网配置服务器)
验证与日常维护要点
配置不是一次性的,需定期确认是否持续生效:
- 查网络属性:
docker network inspect finance-line | grep -A 3 "IPAM\|Internal",确认"Internal": true且子网正确 - 查拦截规则:
sudo iptables -t filter -L DOCKER-USER -n | grep 10.20.10.0,应看到对应 DROP 条目 - 进容器测试:
docker exec -it db-finance sh -c "ip route | grep default",输出应只有网关 IP,无额外路由 - 业务线新增容器时,务必检查
--network参数是否写错,避免误入公共网络


















