如何配置Docker网络实现不同容器网络间的单向访问
Docker单向网络访问配置方案
核心原理
Docker 不同自定义网桥网络之间默认二层隔离,未加入对应网络的容器无法访问该网络内的服务、也无法解析该网络的内部DNS域名。你当前的服务网络归属配置已经符合隔离前提,只需要补全显式的网络声明即可确保规则生效。
修改后的完整docker-compose.yml配置
version: '3.1' services: core-gateway: image: boxs-gateway networks: - core - seperated-network # 按需添加端口暴露,比如网关对外提供服务的端口 # ports: # - "80:80" core-auth: image: boxs-auth networks: - core # 不要对外暴露auth端口,仅允许core网络内的服务访问 # ports: [] unsecure-service: image: unsecure-image networks: - seperated-network # 按需配置端口暴露,不需要对外暴露的话可以省略 # ports: [] # 显式声明两个自定义网络,避免默认配置导致意外互通 networks: core: driver: bridge # 不需要核心网络访问外网的话可以开启internal配置,进一步提升安全性 # internal: true seperated-network: driver: bridge
效果验证方法
- 验证boxs-gateway可访问unsecure-service:进入core-gateway容器执行
curl unsecure-service:[你的服务端口],能正常返回响应即连通正常 - 验证unsecure-service无法访问core-auth:进入unsecure-service容器执行
ping core-auth或curl core-auth:[auth服务端口],会提示无法解析域名/连接超时,即隔离生效
特殊场景补充配置
如果你的业务场景需要两个网络存在其他互通逻辑,无法通过归属网络做隔离,可以通过宿主机iptables规则强制阻断seperated-network到core网络的访问:
- 先查看两个网络的网段:执行
docker network inspect core | grep Subnet和docker network inspect seperated-network | grep Subnet获取对应网段,假设core网段为172.20.0.0/16,seperated-network网段为172.21.0.0/16 - 添加阻断规则:
iptables -I DOCKER-USER -s 172.21.0.0/16 -d 172.20.0.0/16 -j DROP - 保存规则到宿主机配置,避免重启后失效
内容的提问来源于stack exchange,提问作者יהוידע שטינמץ
相关产品推荐
相关产品推荐

