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

第二部分-Docker核心原理——10. 容器网络原理

10. 容器网络原理

1. 容器网络概述

容器网络是 Docker 的核心组件之一,负责实现容器与容器、容器与宿主机、容器与外部的网络通信。Docker 通过 Linux 内核的网络命名空间、veth pair、网桥、iptables 等技术实现网络隔离和连通。

┌─────────────────────────────────────────────────────────────┐ │ Docker 网络架构 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 宿主机 │ │ │ │ │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ │ │ 容器A │ │ 容器B │ │ 容器C │ │ │ │ │ │ eth0 │ │ eth0 │ │ eth0 │ │ │ │ │ │172.17.0.2│ │172.17.0.3│ │172.17.0.4│ │ │ │ │ └────┬────┘ └────┬────┘ └────┬────┘ │ │ │ │ │ │ │ │ │ │ │ │ veth │ veth │ veth │ │ │ │ ▼ ▼ ▼ │ │ │ │ ┌─────────────────────────────────────────────┐ │ │ │ │ │ docker0 网桥 │ │ │ │ │ │ 172.17.0.1/16 │ │ │ │ │ └─────────────────────┬───────────────────────┘ │ │ │ │ │ │ │ │ │ │ iptables NAT │ │ │ │ ▼ │ │ │ │ ┌─────────────────────────────────────────────┐ │ │ │ │ │ eth0 (宿主机网卡) │ │ │ │ │ │ 192.168.1.100 │ │ │ │ │ └─────────────────────────────────────────────┘ │ │ │ │ │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────┐ │ │ │ 外部网络 │ │ │ └─────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘

2. Docker 网络模式

网络模式说明使用场景
bridge默认模式,通过 docker0 网桥通信大多数场景
host共享宿主机网络栈网络性能要求高
none无网络不需要网络
container共享其他容器网络网络调试
overlay跨主机网络Swarm 集群
macvlan直接使用物理网卡需要物理网络 IP

3. Bridge 网络模式

3.1 原理

┌─────────────────────────────────────────────────────────────┐ │ Bridge 模式原理 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 步骤: │ │ 1. 创建网络命名空间 │ │ 2. 创建 veth pair 虚拟网卡对 │ │ 3. 一端放入容器命名空间(eth0) │ │ 4. 另一端挂载到 docker0 网桥 │ │ 5. 分配 IP 地址(默认 172.17.0.0/16) │ │ 6. 设置 iptables NAT 规则实现外网访问 │ │ │ └─────────────────────────────────────────────────────────────┘

3.2 查看网桥信息

# 查看 docker0 网桥ipaddr show docker0# 查看网桥设备brctl show# 查看 iptables NAT 规则sudoiptables-tnat-L-n-v# 查看 FORWARD 规则sudoiptables-LFORWARD-n-v# 查看网络命名空间lsns-tnet# 查看容器网络详细信息dockerinspect container_name|grep-A20"Networks"

3.3 自定义 bridge 网络

# 创建自定义 bridge 网络dockernetwork create--driverbridge--subnet=10.10.0.0/16--gateway=10.10.0.1 mynet# 查看网络列表dockernetworkls# 查看网络详情dockernetwork inspect mynet# 在自定义网络中运行容器dockerrun-d--nameapp1--networkmynet nginxdockerrun-d--nameapp2--networkmynet nginx# 容器间可以通过名称通信(自动 DNS 解析)dockerexecapp1pingapp2# 连接容器到指定网络dockernetwork connect mynet app1# 断开连接dockernetwork disconnect mynet app1# 删除网络dockernetworkrmmynet

4. Host 网络模式

# 使用 host 网络模式dockerrun-d--networkhost--nameweb nginx# 容器直接使用宿主机网络,没有独立 IP# 容器内的 localhost 就是宿主机的 localhostdockerexecwebcurllocalhost:80# 查看网络(与宿主机相同)dockerexecwebipaddr# 端口映射不需要 -p 参数,容器端口直接绑定宿主机dockerrun-d--networkhostnginx# 占用宿主机 80 端口# 优点:网络性能最佳# 缺点:端口冲突,隔离性差# 查看哪些容器使用 host 网络dockerps--format"table {{.Names}}\t{{.Ports}}"|grep-v"0.0.0.0"

5. None 网络模式

# 容器没有网络dockerrun-it--networknone alpinesh# 只有 lo 接口/# ip addr# 1: lo: ...# 适用场景:# - 不需要网络的批处理任务# - 安全隔离要求高# - 自定义网络配置# 后续可以手动连接网络dockernetwork connect bridge container_name

6. Container 网络模式

# 创建第一个容器dockerrun-d--nameweb1 nginx# 第二个容器共享第一个容器的网络dockerrun-it--networkcontainer:web1--nameweb2 alpinesh# web2 中使用 localhost 访问 web1/# curl localhost:80# 查看网络(和 web1 相同)/# ip addr# 适用场景:# - 网络调试# - 网络代理# - Sidecar 模式

7. veth pair 工作原理

┌─────────────────────────────────────────────────────────────┐ │ veth pair 原理 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 宿主机 容器 │ │ ┌─────────────────┐ ┌─────────────────┐ │ │ │ │ │ │ │ │ │ docker0 │ │ eth0 │ │ │ │ 172.17.0.1 │ │ 172.17.0.2 │ │ │ │ │ │ │ ▲ │ │ │ │ │ │ │ │ │ │ │ │ ▼ │ │ │ │ │ │ │ ┌───────┐ │ │ │ │ │ │ │ │ veth │─────┼───────────────┼───────┘ │ │ │ │ │ pair │ │ │ │ │ │ │ └───────┘ │ │ │ │ │ │ │ │ │ │ │ └─────────────────┘ └─────────────────┘ │ │ │ │ veth 特点: │ │ - 成对出现的虚拟网卡 │ │ - 一端在容器,一端在宿主机 │ │ - 数据包在两端直接转发 │ │ │ └─────────────────────────────────────────────────────────────┘
# 查看 veth pair# 创建容器dockerrun-d--nametestnginx# 获取容器 PIDPID=$(dockerinspect-f'{{.State.Pid}}'test)# 查看容器的网络接口nsenter-t$PID-niplink# 查看宿主机上的 vethiplink|grepveth# 查看 veth 配对关系# 方法1:通过索引dockerexectestcat/sys/class/net/eth0/iflinkiplink|grep$(dockerexectestcat/sys/class/net/eth0/iflink)# 方法2:使用 ethtoolethtool-SvethXXXX

8. iptables 与端口映射

8.1 NAT 原理

# 容器访问外网:SNATdockerrun-d--nameweb nginxdockerexecwebcurlgoogle.com# 查看 SNAT 规则sudoiptables-tnat-LPOSTROUTING-n-v# MASQUERADE 规则# 外网访问容器:DNATdockerrun-d-p8080:80 nginx# 查看 DNAT 规则sudoiptables-tnat-LPREROUTING-n-vsudoiptables-tnat-LDOCKER-n-v# 查看具体映射iptables-tnat-LDOCKER --line-numbers iptables-tfilter-LDOCKER --line-numbers

8.2 端口映射详解

# 映射到指定端口dockerrun-d-p8080:80 nginx# 映射到随机端口dockerrun-d-p80nginxdockerport container_name# 映射 UDP 端口dockerrun-d-p53:53/udp nginx# 映射特定 IPdockerrun-d-p127.0.0.1:8080:80 nginx# 映射端口范围dockerrun-d-p8080-8082:80-82 nginx# 查看端口映射dockerport container_namedockerinspect container_name|grep-A10PortBindings

9. 容器间通信

9.1 同一网络通信

# 创建网络dockernetwork create app-net# 启动服务dockerrun-d--networkapp-net--namemysql-eMYSQL_ROOT_PASSWORD=123mysqldockerrun-d--networkapp-net--nameapp-p8080:8080 myapp# 通过容器名通信dockerexecapppingmysql# 通过网络别名通信dockernetwork create--subnet=10.10.0.0/16 app-net2dockerrun-d--networkapp-net2 --network-alias api myapp

9.2 不同网络通信

# 容器连接到多个网络dockernetwork create net1dockernetwork create net2dockerrun-d--namerouter--networknet1 alpinedockernetwork connect net2 router# 使用 docker network connect 连接dockernetwork connect net1 container2

10. 网络命名空间操作

# 进入容器网络命名空间CONTAINER_PID=$(dockerinspect-f'{{.State.Pid}}'container_name)sudonsenter-t$CONTAINER_PID-nbash# 查看网络配置ipaddriproutecat/etc/resolv.conf# 使用 ip netns(需要链接)PID=$(dockerinspect-f'{{.State.Pid}}'container_name)sudoln-s/proc/$PID/ns/net /var/run/netns/$PIDipnetns listipnetnsexec$PIDipaddr

11. 网络故障排查

11.1 常用命令

# 检查容器网络配置dockerinspect container_name|grep-A20Networks# 在容器内测试网络dockerexeccontainer_namepinggoogle.comdockerexeccontainer_namecurl-vhttp://example.comdockerexeccontainer_namenslookupgoogle.com# 检查宿主机网络dockernetworklsdockernetwork inspect bridge brctl showiproute# 检查 iptablessudoiptables-L-n-vsudoiptables-tnat-L-n-v# 跟踪网络包dockerexeccontainer_name tcpdump-ieth0 tcpdump-idocker0

11.2 常见问题解决

# 问题1:容器无法访问外网# 检查 NAT 规则sudoiptables-tnat-LPOSTROUTING-n-v# 检查 IP 转发sysctlnet.ipv4.ip_forward# 开启转发sudosysctl-wnet.ipv4.ip_forward=1# 问题2:端口映射不生效# 检查 docker-proxypsaux|grepdocker-proxy# 检查 iptables 规则sudoiptables-tnat-LDOCKER-n-v# 问题3:容器间无法通信# 检查 docker0 网桥iplinkshow docker0# 检查防火墙规则sudoufw status

12. 网络性能优化

# 使用 host 网络模式(性能最优)dockerrun-d--networkhostnginx# 使用 macvlan 模式(直接使用物理网络)dockernetwork create-dmacvlan\--subnet=192.168.1.0/24\--gateway=192.168.1.1\-oparent=eth0\macnetdockerrun-d--networkmacnet--ip=192.168.1.200 nginx# 调整网桥 MTUdockernetwork create--optcom.docker.network.driver.mtu=1450mynet# 禁用 iptables(不推荐)# /etc/docker/daemon.json{"iptables":false}

13. 常用命令速查

操作命令
查看网络docker network ls
创建网络docker network create
查看详情docker network inspect
连接网络docker network connect
断开网络docker network disconnect
删除网络docker network rm
查看端口docker port
查看网桥brctl show
查看规则iptables -L -n -v

14. 常见问题

Q1: 容器如何访问宿主机服务?

# 使用 host.docker.internal(Mac/Windows)# 使用宿主机 IP(Linux)# 或使用 --network host 模式

Q2: 两个容器如何共享网络?

# 使用 container 模式dockerrun--networkcontainer:container2

Q3: 容器重启后 IP 会变吗?

默认 bridge 网络会变,自定义网络使用 --ip 固定 IP。

15. 小结

  • Bridge 模式:默认网络,通过 docker0 网桥通信
  • Host 模式:共享宿主机网络,性能最佳
  • None 模式:无网络,完全隔离
  • Container 模式:共享其他容器网络
  • veth pair:实现容器与网桥的连接
  • iptables:实现 NAT 和端口映射
  • 自定义网络支持容器名解析
  • 掌握网络排查工具和命令

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

相关文章:

  • 2026年5月新消息:汕头智能热成型机优质厂家路百拓机械深度解析 - 2026年企业推荐榜
  • Spring 参数验证使用示例(基于 RuoYi 项目)
  • 如何截断SQL小数位数_使用TRUNCATE函数控制精度.txt
  • 2026年最新降AI软件排行:深度揭秘降AI原理,选降AI工具不踩坑! - 我要发一区
  • 如何理解 Kubernetes 的架构设计与实现原理?
  • 2026年至今,连云港天然朱砂实力门店盘点与优选分析:小白家高含量朱砂 - 2026年企业推荐榜
  • 将地址转换为可点击的 Google Maps 链接(类似 tel- 协议).txt
  • 关于hopfield 网络和受限玻尔兹曼机,其如何为现代深度学习奠基?
  • 别再瞎调WPF Grid布局了!Auto和*的实战用法,看完这篇就够了
  • Cortex-M调试连接器技术解析与应用实践
  • 同一件事的哪一层?——跨文化概念对勘的三阶校准法则
  • 四川盛世钢联国际贸易有限公司型钢频道 -螺纹钢|盘螺|盘圆|高线|高强钢 - 四川盛世钢联营销中心
  • 从“想”到“做”:手把手教你实现AI Agent Loop循环机制,解锁智能体进阶玩法!
  • 测试左移+AI:质量内建的终极形态?
  • FreeIPA容器化部署指南:从镜像选择到生产环境配置
  • 16.【Verilog】Verilog 时钟分频
  • Sonatype Nexus Repository Pro本地软件制品仓库
  • 3401黄大年茶思屋榜文保姆级全落地解法「34期 1题」全系统可编程安全易用高效统一架构重构与原约束双路径落地解法
  • 从机械转行互联网CV后,我决定再转多模态大模型,我的GitHub学习日志,带你避坑多模态转型之路!
  • 论文AIGC检测超标?一键去除论文AI率,只需要几分钟! - 我要发一区
  • 哪个降AI率工具好用?2026年5月最新测评,深度拆解降AI原理! - 我要发一区
  • 全网盘点降AI率工具:实测知网降AI效果,嘎嘎降遥遥领先! - 我要发一区
  • 基于JSP内置对象的服务器端表单验证实验
  • 我们训练了一个专测金融软件的AI模型,结果出乎意料
  • 当AI写小说——一个被严重低估的工程化战场
  • 别把 `temperature`、`top-k`、`top-p`、`beam search` 当成四个并列旋钮:很多生成问题,先调错的是“分布”还是“搜索”
  • 如何使用AI从文档中准确提取所有内容
  • 多模态情感分析中的模态缺失挑战与PRLF框架
  • 视频预测与深度估计的联合优化方法解析
  • AI率高于80%?2026年top10降AI软件汇总,3分钟降AI率? - 我要发一区