自定义网络创建

自定义网络创建

面试题

如何创建 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
喜欢就支持一下吧
点赞6 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容