第四部分-Docker网络与存储——18. 自定义网络

18. 自定义网络

1. 自定义网络概述

自定义网络允许用户根据需求创建具有特定配置的网络,相比默认的 bridge 网络,提供了更好的隔离性、DNS 解析和灵活性。

┌─────────────────────────────────────────────────────────────┐ │ 自定义网络架构 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ mynet (自定义) │ │ │ │ 10.10.0.0/16 │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ │ │ web-app │ │ api-app │ │ db-app │ │ │ │ │ │10.10.0.2│ │10.10.0.3│ │10.10.0.4│ │ │ │ │ └─────────┘ └─────────┘ └─────────┘ │ │ │ │ │ │ │ │ │ │ │ └────────────┼────────────┘ │ │ │ │ │ │ │ │ │ 自动 DNS 解析 │ │ │ │ web-app → api-app → db-app │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘

2. 创建自定义网络

2.1 基础创建

# 创建 bridge 类型网络dockernetwork create mynet# 指定 IP 地址范围dockernetwork create--driverbridge--subnet=10.10.0.0/16--gateway=10.10.0.1 mynet# 指定 IP 范围dockernetwork create--subnet=10.10.0.0/16 --ip-range=10.10.1.0/24 mynet# 指定网络驱动dockernetwork create--driverbridge--optcom.docker.network.bridge.name=my_bridge mynet# 查看网络dockernetworklsdockernetwork inspect mynet

2.2 网络选项配置

# 禁用 IPv6dockernetwork create--ipv6=false mynet# 启用 IPv6dockernetwork create--ipv6--subnet=2001:db8::/64 mynet# 设置 MTUdockernetwork create--optcom.docker.network.driver.mtu=1450mynet# 设置网桥名称dockernetwork create--optcom.docker.network.bridge.name=my_bridge mynet# 启用 iptablesdockernetwork create--optcom.docker.network.bridge.enable_ip_masquerade=true mynet

3. 使用自定义网络

3.1 运行容器

# 创建网络dockernetwork create app-net# 在自定义网络中运行容器dockerrun-d--nameweb--networkapp-net nginxdockerrun-d--nameapi--networkapp-net myapidockerrun-d--namedb--networkapp-net mysql# 通过容器名通信dockerexecwebpingapidockerexecwebpingdb# 指定 IP 地址dockerrun-d--networkapp-net--ip10.10.0.100 nginx

3.2 连接现有容器

# 将现有容器连接到网络dockernetwork connect app-net existing-container# 断开连接dockernetwork disconnect app-net existing-container# 指定连接时的 IPdockernetwork connect--ip10.10.0.200 app-net existing-container# 查看容器连接的网络dockerinspect container_name|grep-A10Networks

4. 网络隔离

4.1 多网络隔离

# 创建不同的网络隔离环境dockernetwork create frontenddockernetwork create backenddockernetwork create database# 前端应用只连接前端网络dockerrun-d--nameweb--networkfrontend nginx# API 同时连接前端和后端dockerrun-d--nameapi--networkfrontend--networkbackend myapi# 数据库只连接后端dockerrun-d--namedb--networkbackend mysql# 通信路径# web → api (通过 frontend)# api → db (通过 backend)# web 无法直接访问 db

4.2 网络访问控制

# 创建隔离网络dockernetwork create--internalinternal-net# 内部网络无外网访问权限dockerrun-d--nameinternal-app--networkinternal-net myapp# 无法访问外网dockerexecinternal-apppinggoogle.com# 失败# 通过代理容器访问外网dockerrun-d--nameproxy--networkinternal-net--networkbridge myproxy

5. 高级配置

5.1 自定义网关

# 创建网络指定网关dockernetwork create\--subnet=172.20.0.0/16\--gateway=172.20.0.1\mynet# 创建辅助网络dockernetwork create\--subnet=172.21.0.0/16\--gateway=172.21.0.1\mynet2

5.2 网络别名

# 创建网络dockernetwork create mynet# 运行容器并添加别名dockerrun-d--namedb--networkmynet --network-alias mysql --network-alias database mysql# 其他容器可以通过别名访问dockerrun--rm--networkmynet alpinepingmysqldockerrun--rm--networkmynet alpinepingdatabase# 添加额外的别名到运行中的容器dockernetwork connect--aliasprimary-db mynet db

6. 网络驱动

6.1 Bridge 驱动

# 默认驱动,单机使用dockernetwork create--driverbridge mynet# 带选项的 bridgedockernetwork create\--driverbridge\--optcom.docker.network.bridge.name=my_bridge\--optcom.docker.network.bridge.enable_icc=true\--optcom.docker.network.bridge.enable_ip_masquerade=true\--optcom.docker.network.bridge.host_binding_ipv4=0.0.0.0\mynet

6.2 Overlay 驱动(Swarm)

# 跨主机网络,需要 Swarm 模式dockernetwork create--driveroverlay--attachablemy-overlaydockerservicecreate--networkmy-overlay--nameweb nginx

6.3 Macvlan 驱动

# 直接使用物理网络dockernetwork create-dmacvlan\--subnet=192.168.1.0/24\--gateway=192.168.1.1\-oparent=eth0\macnet

7. 网络管理

7.1 查看网络

# 列出所有网络dockernetworkls# 查看网络详情dockernetwork inspect mynet# 查看网络连接的容器dockernetwork inspect mynet--format'{{range .Containers}}{{.Name}} {{.IPv4Address}}{{"\n"}}{{end}}'# 查看网络的使用情况dockernetworkls--format"table {{.Name}}\t{{.Driver}}\t{{.Scope}}"

7.2 清理网络

# 删除网络dockernetworkrmmynet# 清理未使用的网络dockernetwork prune# 强制清理dockernetwork prune-f# 清理特定标签的网络dockernetwork prune--filter"until=24h"

8. DNS 配置

8.1 自定义 DNS

# 创建网络时指定 DNSdockernetwork create\--dns8.8.8.8\--dns8.8.4.4\--dns-search example.com\mynet# 在容器中指定 DNSdockerrun-d--dns8.8.8.8 --dns-search example.com nginx

8.2 容器名解析

# 自定义网络支持自动 DNS 解析# 容器名指向容器 IP# 网络别名也支持解析# 测试解析dockerrun--rm--networkmynet alpinenslookupwebdockerrun--rm--networkmynet alpinedigapi

9. 网络调试

9.1 网络诊断工具

# 创建带网络工具的容器dockerrun-it--networkmynet--namenet-tools alpinesh# 安装网络工具apkaddiproute2curlbusybox-extras# 测试连接ipaddriproutepingwebcurlapi:8080traceroutedb

9.2 网络故障排查

# 检查网络配置dockernetwork inspect mynet# 检查容器连接dockerinspect container_name|grep-A10Networks# 测试网络连通性dockerexeccontainer_nameping-c3target-containerdockerexeccontainer_namecurl-vhttp://target-container:port# 查看 iptables 规则sudoiptables-L-n-vsudoiptables-tnat-LDOCKER-n-v

10. 实战示例

10.1 三层应用架构

# 创建三个网络dockernetwork create frontenddockernetwork create backenddockernetwork create database# 前端层(只能访问前端网络)dockerrun-d--nameweb\--networkfrontend\nginx# 应用层(连接前后端)dockerrun-d--nameapi\--networkfrontend\--networkbackend\myapi# 数据层(只能被后端访问)dockerrun-d--namedb\--networkbackend\-eMYSQL_ROOT_PASSWORD=123\mysql# 验证通信dockerexecwebpingapi# 成功dockerexecwebpingdb# 失败(隔离)dockerexecapipingdb# 成功

10.2 网络模板

# 创建网络模板脚本dockernetwork create\--driverbridge\--subnet=10.10.${ENV}.0/24\--gateway=10.10.${ENV}.1\--labelenvironment=${ENV}\--labelproject=${PROJECT}\${PROJECT}-${ENV}

11. 命令速查

操作命令
创建网络docker network create
列出网络docker network ls
查看详情docker network inspect
连接容器docker network connect
断开容器docker network disconnect
删除网络docker network rm
清理网络docker network prune

12. 最佳实践

✅ 推荐做法

  1. 使用自定义网络而非默认 bridge
  2. 合理规划 IP 地址段,避免冲突
  3. 使用网络隔离提高安全性
  4. 为网络添加标签便于管理
  5. 定期清理未使用网络
  6. 生产环境指定 IP 范围

❌ 避免事项

  • 在生产环境使用默认 bridge
  • 网络段与宿主机网络冲突
  • 创建过多未使用网络
  • 忽略网络 MTU 设置
  • 在 bridge 网络上依赖 --link

13. 常见问题

Q1: 如何删除正在使用的网络?

先断开所有连接的容器,或强制删除(需停止相关容器)。

Q2: 自定义网络和默认 bridge 的区别?

自定义网络支持容器名自动 DNS 解析,默认 bridge 不支持。

Q3: 容器启动后能更改网络吗?

可以,使用docker network connect/disconnect

14. 小结

  • 自定义网络提供更好的隔离性和灵活性
  • 支持自定义 IP 范围、网关、DNS
  • 自动 DNS 解析容器名
  • 可以实现网络隔离(类 VLAN)
  • 支持容器动态连接/断开网络
  • 一个容器可连接到多个网络
  • 定期清理未使用网络