Docker原生支持通过--internal参数创建纯内网网络实现轻量隔离:执行docker network create --subnet=192.168.200.0/24 --gateway=192.168.200.1 --internal myprivate,Docker自动禁用SNAT、不添加默认路由,并在iptables FORWARD链插入DROP规则,阻断所有外发流量,容器仅能互通,无法访问宿主机外网、DNS或互联网。

用 docker network create --internal 创建纯内网网络,是 Docker 原生支持的轻量级隔离方式。它不依赖额外防火墙规则或手动 iptables 配置,而是从网络层切断外发能力,让容器只能互相通信,无法访问宿主机外网接口、DNS 或互联网。
创建带网关的 --internal 网络
执行命令时必须同时指定子网、网关,并启用 --internal 参数:
docker network create --subnet=192.168.200.0/24 --gateway=192.168.200.1 --internal myprivate- 子网和网关需匹配,例如
192.168.200.0/24对应的有效网关只能是192.168.200.1~192.168.200.254中的一个 -
--internal是核心开关:Docker 会禁用 SNAT、不添加默认路由、不在 FORWARD 链放行,自动插入 DROP 规则阻断所有向外流量
验证容器是否真正隔离
启动容器并测试连通性,确认隔离生效:
- 运行容器:
docker run -it --network=myprivate alpine sh - 在容器内执行:
ping 192.168.200.2(其他同网段容器)→ 应成功 - 执行:
ping 8.8.8.8或ping $(ip route | awk '/default/ {print $3}')→ 应超时或无响应 - 执行:
nslookup google.com→ 通常失败(因 DNS 请求也被拦截)
注意事项与常见问题
几个关键细节决定隔离是否可靠:
- 容器必须显式使用
--network=myprivate启动;若漏写,会默认接入bridge网络,失去隔离效果 - 不能混用多个网络:一个容器只应接入一个
--internal网络,否则可能通过另一网络绕过隔离 - 宿主机上可查看隔离状态:
iptables -t filter -L DOCKER-USER -n中能看到针对该网络的 DROP 规则 - 如需部分容器“例外”出网,应另建非 internal 网络,再用多网络模式桥接,而非关闭 internal
这种方式适合开发测试环境、敏感服务部署或需要强逻辑隔离的微服务子集,配置简单但效果扎实。


















