自定义网络创建
面试题
如何创建 Docker 自定义网络?自定义网络有哪些类型?怎么使用?
标准答案
自定义网络是 Docker 的高级网络功能,相比默认的 bridge 网络,它提供更好的隔离性、自动 DNS 解析和灵活的子网配置。
创建自定义网络
创建 bridge 类型网络
# 最简单的创建方式
docker network create mynet
# 指定子网和网关
docker network create \
--driver bridge \
--subnet 10.0.0.0/16 \
--gateway 10.0.0.1 \
mynet
# 指定 IP 范围(限定容器分配 IP 的区间)
docker network create \
--subnet 10.0.0.0/16 \
--ip-range 10.0.1.0/24 \
--gateway 10.0.0.1 \
mynet
# 指定容器分配固定 IP
docker network create \
--subnet 172.20.0.0/16 \
--gateway 172.20.0.1 \
--aux-address "reserved=172.20.0.100" \
fixed-ip-net
创建其他类型网络
# overlay 网络(Swarm 模式跨主机通信)
docker network create \
--driver overlay \
--subnet 10.10.0.0/16 \
my-overlay
# macvlan 网络(容器直连物理网络)
docker network create \
--driver macvlan \
--subnet 192.168.1.0/24 \
--gateway 192.168.1.1 \
-o parent=eth0 \
my-macvlan
管理自定义网络
# 列出所有网络
docker network ls
# 查看网络详情(包含连接的容器)
docker network inspect mynet
# 将容器连接到网络
docker network connect mynet my-container
# 指定容器在网络中的别名(DNS 解析名称)
docker network connect \
--alias app-web \
--alias web-v2 \
mynet my-container
# 断开容器与网络的连接
docker network disconnect mynet my-container
# 删除网络
docker network rm mynet
# 清理未使用的网络
docker network prune
使用自定义网络启动容器
创建容器时加入网络
# 方式一:创建时指定
docker run -d \
--name web \
--network mynet \
nginx
# 方式二:创建后加入
docker run -d --name api myapi:latest
docker network connect mynet api
指定容器 IP
# 在自定义网络中指定固定 IP
docker run -d \
--name db \
--network mynet \
--ip 10.0.0.10 \
postgres:15
# # 注意:--ip 只在自定义网络有效
# 默认 bridge 不支持指定 IP
多网络连接
# 一个容器可以同时加入多个网络
docker run -d --name gateway nginx
docker network create frontend
docker network create backend
docker network connect frontend gateway
docker network connect backend gateway
# 容器同时拥有 frontend 和 backend 两个网络的接口
docker exec gateway ip addr
# 可以看到多个 IP 地址
自定义网络与默认 bridge 对比
| 特性 | 自定义 bridge | 默认 bridge |
|---|---|---|
| 自动 DNS 解析 | ✅ 支持容器名 ↔ IP | ❌ 不支持 |
| 网络隔离 | ✅ 不同网络完全隔离 | ❌ 所有容器互通 |
| 子网自定义 | ✅ 可自定义 | ❌ 固定 172.17.0.0/16 |
| 固定 IP | ✅ 支持 | ❌ 不支持 |
| 断开/连接 | ✅ 支持运行时操作 | ❌ 必须重建容器 |
| 环境变量注入 | ❌ 不支持 | ❌ 不支持 |
网络配置的 daemon.json
# /etc/docker/daemon.json
{
"default-address-pools": [
{
"base": "172.30.0.0/16",
"size": 24
},
{
"base": "172.31.0.0/16",
"size": 24
}
]
}
这样可以避免 Docker 创建的默认子网与公司内网冲突。
常见场景示例
场景一:三层架构
# 创建两个独立的网络
docker network create frontend --subnet 10.0.1.0/24
docker network create backend --subnet 10.0.2.0/24
# Web 层:只暴露到前端
docker run -d --name nginx \
--network frontend \
-p 80:80 \
nginx:alpine
# API 层:同时连接前端和后端
docker run -d --name api \
--network frontend \
--network backend \
myapi:latest
# 数据库层:只暴露到后端
docker run -d --name db \
--network backend \
-e POSTGRES_PASSWORD=secret \
postgres:15
场景二:服务发现
# 自定义网络自动提供 DNS 解析
docker network create microservice
docker run -d --name users --network microservice users-service
docker run -d --name orders --network microservice orders-service
docker run -d --name gateway --network microservice -p 8080:8080 api-gateway
# gateway 可以通过服务名访问
# curl http://users:3000/api/users
# curl http://orders:3000/api/orders
常见问题
Q:如何修改已有网络的配置?
Docker 目前不支持修改已有网络的配置(subnet、gateway 等)。需要删除重建:
# 1. 断开所有容器
docker network disconnect mynet container1
docker network disconnect mynet container2
# 2. 删除网络
docker network rm mynet
# 3. 重新创建
docker network create --subnet 10.0.0.0/16 mynet
# 4. 重新连接容器
docker network connect mynet container1
Q:创建网络时 –subnet 和 –ip-range 区别?
--subnet 定义整个网络的 CIDR,--ip-range 限制实际分配给容器的 IP 范围。后者是子集。
Q:最多能创建多少个自定义网络?
理论上不超过 30 个,因为默认每个 net 占用一个 /24 子网,而 Docker 会从地址池中分配。实际限制取决于宿主机资源和配置。
总结
自定义 bridge 网络比默认 bridge 强大得多:自动 DNS 解析是最大的优势。生产环境始终使用自定义网络。记住一条推荐命令:
docker network create --driver bridge --subnet 10.0.0.0/16 mynetwork
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END


暂无评论内容