没有外网出口的网络
docker network create --internal 创建的网络不给容器配置到外网的默认路由:接进来的容器彼此可以互通,访问互联网或宿主以外的地址会被阻断。它给的是网络层的出网隔离,适合数据库、缓存、内部管理接口这类本来就不需要外联的服务;但要注意它并不阻止容器之间的横向访问,安全效果仍要配合认证与最小权限使用。
基本信息
| 语法 | docker network create --internal 网络名 |
|---|---|
| 行为 | 容器间互通,无外网出口 |
| 验证 | 容器内请求外网应超时,解析同网容器名正常 |
| 常见组合 | 需要外联的服务再接一张普通网络 |
典型使用场景
- 数据库隔离:只在内部网络暴露,减少被外部直接触达的面
- 防止意外外联:避免中间件在启动时自动上报或联网更新
- 数据流向收敛:把内部服务集中到一张无出口网络,出入只走指定网关容器
- 合规要求落地:对不需要外联的服务做网络级隔离,便于核查
- 测试环境约束:防止测试代码误连生产或外网接口
创建与验证
创建与验证
# 创建无外网出口的网络
docker network create --internal db-net
# 数据库接入该网络
docker run -d --network db-net --name db postgres:16-alpine
# 验证同网内按名解析正常
docker run --rm --network db-net alpine getent hosts db
# 验证没有外网出口,请求应当超时或失败
docker run --rm --network db-net alpine sh -c 'nc -z -w 2 223.5.5.5 53; echo rc=$?'
# 需要外联的应用同时接两张网络
docker network connect db-net api网络模式出网对照
| 网络模式 | 外网访问 | 容器间按名解析 |
|---|---|---|
| 默认 bridge | 可用,经宿主 NAT 转发 | 不支持按容器名解析 |
| 用户自定义网络 | 可用,经宿主 NAT 转发 | 支持 |
| --internal 网络 | 不可用 | 支持 |
| host | 与宿主一致 | 不适用(共享宿主网络栈) |
需要拉镜像、装依赖的服务不要只接 internal 网络:构建阶段与运行阶段的网络需求要分开规划,运行期隔离不影响构建期。
internal 网络里的服务如果同时接了普通网络,出网方向以后者为准,隔离效果取决于有多少张网络同时接入。