当前位置: 首页 > news >正文

第四部分-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)
  • 支持容器动态连接/断开网络
  • 一个容器可连接到多个网络
  • 定期清理未使用网络

http://www.jsqmd.com/news/792683/

相关文章:

  • 基于WebSocket的轻量级代码光标同步工具设计与实现
  • AI绘画自动化:从批量生成到Pixiv发布的半自动工具实践
  • 终极指南:八大网盘直链下载助手完整使用教程,告别限速烦恼
  • TeamHero开源团队协作工具:轻量可定制部署与核心功能解析
  • LLM微调→评估→对齐→发布,全流程卡点全曝光(SITS 2026 CI/CD for LLM实战拓扑图+12个已验证失败案例归因)
  • 基于有限状态机(FSM)的LLM智能体架构:Haath项目解析与实践
  • AI聊天机器人插件开发指南:从SDK原理到实战部署
  • AI应用安全实战:使用SecurityLayer构建防护中间件
  • 模型融合实战指南:使用mergekit工具实现大模型能力组合与优化
  • ClawMorph:OpenClaw智能体一键切换角色的CLI工具详解
  • 多智能体系统(MAS)架构解析:从通信协议到协同工作流实践
  • 为AI编程助手构建权限脚手架:提升Claude Code开发效率的实战指南
  • NVIDIA Profile Inspector深度指南:解锁显卡隐藏性能的完整教程
  • Claude编程协作指南:提示词工程与AI结对编程实战
  • Mac Mouse Fix:让你的第三方鼠标在macOS上比触控板更好用!
  • 上海老房改造市场迎来“精改”时代,益鸟美居以透明化服务与专利技术领跑局改赛道 - 博客湾
  • Xplorer文件属性查看器:全面掌控文件信息的终极指南
  • ThinkPad风扇控制终极指南:用TPFanCtrl2实现完美静音与散热平衡
  • 2026 年 4 月:从稀疏 Cholesky 分解推导消元树,解锁矩阵分解新路径
  • Claude Code权限引导框架:安全集成AI编程助手的核心策略
  • 【建筑】石油化工建筑抗爆分析Matlab仿真
  • 局域网文件传输终极指南:3步实现跨平台文件秒传
  • Upsonic:生产就绪的AI智能体框架,安全第一,模块化设计
  • Vibe Coding生态全景与实战指南:从AI编程工具到智能体工作流
  • AI智能体协作框架ccagents:构建多智能体协同系统的核心原理与实践
  • 2026年5月新消息:聚焦河北小黑板源头厂家,解析工程选材新趋势 - 2026年企业推荐榜
  • AI编程新范式:基于Claude的代码技能提升与系统化学习路径
  • AI编码安全护栏:Claude代码生成的质量与安全管控实践
  • Mac Mouse Fix终极指南:让你的鼠标比苹果触控板更好用!
  • 如何轻松解决Blue Archive自动脚本Mumu模拟器检测问题:完整配置指南