docker中配置--internal自定义网络可实现内外网逻辑隔离:执行docker network create --subnet=10.20.30.0/24 --gateway=10.20.30.1 --internal internal-net,该网络使容器间互通但默认无法访问外网,因docker禁用snat且不提供外部路由。

在 Docker 中配置自定义网络网关实现内外网逻辑隔离,核心是**用 --internal 创建纯内网网络 + 显式指定子网与网关**,让容器只能互通、无法主动出网。这不是靠 iptables 临时封堵,而是从网络层切断外部路由能力。
创建带网关的内部专用网络
执行命令时同时指定子网、网关,并启用 --internal:
docker network create --subnet=10.20.30.0/24 --gateway=10.20.30.1 --internal internal-net
这样创建的网络具备三个关键特征:
- 所有接入容器自动获得
10.20.30.x段 IP,且默认网关设为10.20.30.1 -
--internal会禁止 Docker 为此网络添加 SNAT 规则,也阻止容器访问宿主机外网(包括 DNS 查询) - 容器之间仍可通过服务名或 IP 直接通信,DNS 解析正常(Docker 内置 DNS 仍在工作)
让容器接入并验证隔离效果
启动容器时明确指定该网络:
docker run -d --name db --network internal-net postgres-
docker run -it --network internal-net alpine ping db→ 成功 -
docker run -it --network internal-net alpine ping 8.8.8.8→ 超时(无路由) -
docker run -it --network internal-net alpine nslookup google.com→ 失败(DNS 请求发不出去)
如需有限对外能力,不破坏隔离前提下补充方案
若某容器必须访问外网(比如拉取配置),但又不能让整个网络“开闸”,可单独处理:
- 为该容器额外连接一个非
--internal的网络:docker network connect bridge my-external-container - 此时它拥有两个网络接口:一个在
internal-net(用于内部通信),一个在bridge(用于出网) - 注意:不要给
internal-net容器加--network=bridge启动,否则默认路由会走错,破坏隔离
关键检查与清理要点
确认配置是否生效:
-
docker network inspect internal-net查看Internal: true和IPAM.Config.Gateway是否匹配 -
docker exec -it db ip route应只有一条默认路由指向10.20.30.1,且该网关本身不转发外网流量 - 删除未用网络:
docker network rm internal-net(确保无容器连接)











