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

第二部分-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直接使用物理网卡需要物理网络 IP3. 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-A20Networks3.3 自定义 bridge 网络# 创建自定义 bridge 网络dockernetwork create--driverbridge--subnet10.10.0.0/16--gateway10.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# 删除网络dockernetworkrmmynet4. Host 网络模式# 使用 host 网络模式dockerrun-d--networkhost--nameweb nginx# 容器直接使用宿主机网络没有独立 IP# 容器内的 localhost 就是宿主机的 localhostdockerexecwebcurllocalhost:80# 查看网络与宿主机相同dockerexecwebipaddr# 端口映射不需要 -p 参数容器端口直接绑定宿主机dockerrun-d--networkhostnginx# 占用宿主机 80 端口# 优点网络性能最佳# 缺点端口冲突隔离性差# 查看哪些容器使用 host 网络dockerps--formattable {{.Names}}\t{{.Ports}}|grep-v0.0.0.05. None 网络模式# 容器没有网络dockerrun-it--networknone alpinesh# 只有 lo 接口/# ip addr# 1: lo: ...# 适用场景# - 不需要网络的批处理任务# - 安全隔离要求高# - 自定义网络配置# 后续可以手动连接网络dockernetwork connect bridge container_name6. 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-SvethXXXX8. 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-numbers8.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-A10PortBindings9. 容器间通信9.1 同一网络通信# 创建网络dockernetwork create app-net# 启动服务dockerrun-d--networkapp-net--namemysql-eMYSQL_ROOT_PASSWORD123mysqldockerrun-d--networkapp-net--nameapp-p8080:8080 myapp# 通过容器名通信dockerexecapppingmysql# 通过网络别名通信dockernetwork create--subnet10.10.0.0/16 app-net2dockerrun-d--networkapp-net2 --network-alias api myapp9.2 不同网络通信# 容器连接到多个网络dockernetwork create net1dockernetwork create net2dockerrun-d--namerouter--networknet1 alpinedockernetwork connect net2 router# 使用 docker network connect 连接dockernetwork connect net1 container210. 网络命名空间操作# 进入容器网络命名空间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$PIDipaddr11. 网络故障排查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-idocker011.2 常见问题解决# 问题1容器无法访问外网# 检查 NAT 规则sudoiptables-tnat-LPOSTROUTING-n-v# 检查 IP 转发sysctlnet.ipv4.ip_forward# 开启转发sudosysctl-wnet.ipv4.ip_forward1# 问题2端口映射不生效# 检查 docker-proxypsaux|grepdocker-proxy# 检查 iptables 规则sudoiptables-tnat-LDOCKER-n-v# 问题3容器间无法通信# 检查 docker0 网桥iplinkshow docker0# 检查防火墙规则sudoufw status12. 网络性能优化# 使用 host 网络模式性能最优dockerrun-d--networkhostnginx# 使用 macvlan 模式直接使用物理网络dockernetwork create-dmacvlan\--subnet192.168.1.0/24\--gateway192.168.1.1\-oparenteth0\macnetdockerrun-d--networkmacnet--ip192.168.1.200 nginx# 调整网桥 MTUdockernetwork create--optcom.docker.network.driver.mtu1450mynet# 禁用 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 -v14. 常见问题Q1: 容器如何访问宿主机服务# 使用 host.docker.internalMac/Windows# 使用宿主机 IPLinux# 或使用 --network host 模式Q2: 两个容器如何共享网络# 使用 container 模式dockerrun--networkcontainer:container2Q3: 容器重启后 IP 会变吗默认 bridge 网络会变自定义网络使用 --ip 固定 IP。15. 小结Bridge 模式默认网络通过 docker0 网桥通信Host 模式共享宿主机网络性能最佳None 模式无网络完全隔离Container 模式共享其他容器网络veth pair实现容器与网桥的连接iptables实现 NAT 和端口映射自定义网络支持容器名解析掌握网络排查工具和命令

相关文章:

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

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

09-扩展知识——02. 初识 datetime 模块

02. 初识 datetime 模块 概述 datetime 是 Python 处理日期和时间的核心模块,提供了 date、time、datetime、timedelta、tzinfo 五个主要类。掌握这个模块是时间处理的基础。维度内容Whatdatetime 模块的五大核心类及其基本用法Why日常日期时间操作的首选模块When需…...

利用 workbuddy 小龙虾 对CodeBuddy开发历史对话 进行开发总结 提高以后的开发效果

利用 workbuddy 小龙虾 对CodeBuddy开发历史对话 进行开发总结 提高以后的开发效果 提示词 你能读取 CodeBuddy CN.历史记录吗 "C:\Users\yang\AppData\Local\Programs\CodeBuddy CN\CodeBuddy CN.exe" 和 F:\Programs\CodeBuddy\CodeBuddy.exe 每一个对话框 都总结…...

别再只用默认密码了!手把手教你用Hydra和Burp Suite搞定SSH、Web后台的弱口令检测(附实战避坑指南)

企业安全自查实战:Hydra与Burp Suite弱口令检测全流程解析 当你的服务器突然被植入挖矿程序,或是客户数据在暗网明码标价出售时,80%的情况都始于一个被忽视的弱口令。这不是危言耸听——2023年Verizon数据泄露调查报告显示,弱口令…...

别再只接SWDIO和SWCLK了!STM32 SWD下载电路完整接线指南(含NRST、3.3V、GND详解)

STM32 SWD调试接口全解析:从基础接线到高速信号完整性设计 引言 第一次使用ST-Link给STM32下载程序时,我也曾天真地以为只要连接SWDIO和SWCLK两根线就够了。结果在连续三次下载失败后,我才意识到自己犯了一个典型的新手错误——忽略了完整的S…...

锁相环(PLL)核心原理、设计调试与应用场景全解析

1. 从“锁相”到“锁频”:一个经典电路的深度拆解如果你在通信、数字电路或者射频领域摸爬滚打过几年,那么“锁相环”这三个字对你来说,绝对不是一个陌生的概念。它就像电路世界里的瑞士军刀,从你手机里的射频收发器,到…...

Myco:为AI智能体设计的“活”认知基板,实现可持续知识管理

1. 项目概述:Myco,一个为AI智能体而生的“活”认知基板如果你和我一样,在过去一年里频繁地在LangChain、LangGraph、CrewAI、DSPy这些框架之间切换,每次新框架发布都意味着一次痛苦的迁移和重构,那么你一定能理解那种“…...

液压风力涡轮机:用流体传动重构风电系统架构的工程实践

1. 风力发电的“常规”与“另类”:为什么我们要重新审视机舱设计?干这行十几年,跟各种发电设备打交道,风力涡轮机算是老朋友了。大家现在看到的绝大多数风电机组,结构都差不多:高高的塔筒顶上,有…...

科技晚报|2026年5月8日:AI 开始争夺默认入口与治理层

科技晚报|2026年5月8日:AI 开始争夺默认入口与治理层 一句话导读:今晚最值得看的,不是哪家又把模型做大了一点,而是谁正在把 AI 变成默认入口和默认配置。Google 把 Fitbit 升级成 Google Health 并接入 Gemini 教练&a…...

别把 `temperature`、`top-k`、`top-p`、`beam search` 当成四个并列旋钮:很多生成问题,先调错的是“分布”还是“搜索”

别把 temperature、top-k、top-p、beam search 当成四个并列旋钮:很多生成问题,先调错的是“分布”还是“搜索” 很多人一看到模型输出太飘、太保守,第一反应就是一起改 temperature、top-k、top-p,最后再顺手试 beam search。但这四个名字根本不在同一层:前三个改的是下…...

在 Taotoken 控制台回顾与分析团队月度大模型用量消耗

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在 Taotoken 控制台回顾与分析团队月度大模型用量消耗 对于项目管理者或团队负责人而言,清晰、透明地掌握大模型 API 的…...

硬件开发如何对抗延迟:构建高速度创新体系的策略与实践

1. 项目概述:当“延迟”成为创新的头号杀手在硬件工程和半导体设计领域,我们常常陷入一个误区:认为项目的成败取决于一个绝妙的架构、一颗顶级的芯片,或是一支由天才工程师组成的团队。然而,二十多年的从业经验告诉我&…...

基于云端OpenClaw的情绪互动机器人系统-Milk-V Duo S + 机器人 端开发(5)

上周我打通了Milk-V Duo S和机器人的串口控制的脉络,同时制作了两个动作组:下蹲、自由飞翔。 阶段状态环境搭建✅ 完成网络配置✅ 完成串口控制✅ 完成动作调度✅ 完成序列执行控制✅ 完成时间控制✅ 完成部分动作组制作✅ 完成线程执行锁✅ 完成云端接…...

力扣-最后一个单词长度(58)

重点:1.循环初始值:注意不能越界。如果直接取字符串长度则下标会溢出,所以要减1.2.循环条件:注意等于号,i >0,等号不成立的话会遗漏没有空格的情况3.循环中判断条件:考虑字符串最后面为空格的情况。clas…...

如何使用AI从文档中准确提取所有内容

如何使用AI从文档中准确提取所有内容 作者:AI拉呱(Errol Yan) 定位:AI领域深度内容与实战方法分享 TL;DR 文档解析器在处理现实文档中常见的复杂布局时面临困难,例如具有合并单元格的表格、跨页符号和错位的文本。此外,大量信息存在于图表或图形中,需要准确提取。本文将…...

Arm Cortex-A720 PMU与多核功耗管理实战解析

1. Cortex-A720 PMU架构解析在嵌入式系统开发中,性能监控单元(PMU)如同汽车的仪表盘,为开发者提供处理器运行状态的实时数据。Arm Cortex-A720的PMU架构采用内存映射寄存器设计,通过硬件计数器实现指令周期、缓存命中率等关键指标的采集。与早…...

别再瞎调WPF Grid布局了!Auto和*的实战用法,看完这篇就够了

WPF Grid布局实战:用Auto和*构建自适应界面的黄金法则 刚接触WPF开发时,我总被各种布局容器搞得晕头转向。直到有次接手一个企业级后台系统,在连续加班三天解决界面错位问题后,才真正明白Grid布局中Auto和的精妙配合有多重要。不同…...

Spring 参数验证使用示例(基于 RuoYi 项目)

一、触发方式 进入系统管理 → 角色管理,点新增,在权限字符里填入超过100个字符的内容,点确定。 二、前端现象 2.1 页面报错提示 前端弹出红色提示框,显示"权限字符长度不能超过100个字符"。 2.2 HTTP 请求信息 从浏…...

智象科技AI数智员工:重构运维效率的智能引擎

在企业数字化转型不断深入的今天,运维体系正从“被动响应”走向“智能驱动”。智象科技基于大语言模型与数据智能能力,推出全新“AI数智员工”,以“全栈智能协同”为核心理念,构建覆盖感知、分析、决策与执行的智能运维闭环&#…...

大模型---LangGraph的循环与迭代

目录 1.LangGraph的循环 2.典型的迭代方式 3.循环退出条件 1.LangGraph的循环 LangGraph的循环可以分为3个部分:① State:保存迭代过程中的状态,② node:每轮执行的逻辑,③ conditional edge:判断继续循环还是结束。 最简单的循环方法就是固定迭代次数,即让一个节点…...

马拦过河卒

棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。 棋盘用坐标表示,A点&#xff08…...

软考中级数据库系统工程师考试大纲

数据库系统工程师考试大纲一、考 试 说 明1.考试目标通过本考试的合格人员能参与信息系统的规划、设计、 构建、运行和管理,能按照用户需求,设计、建立、运行、 维护数据库系统;能管理信息系统中的数据资源,建立和维 护…...

关于hopfield 网络和受限玻尔兹曼机,其如何为现代深度学习奠基?

0 感知机、hopfield网络、受限玻尔兹曼机、mlp之间的历史关系 近几年入门深度学习的大多数学习者,可能已经很少听说hopfield网络、受限玻尔兹曼机了,很多书籍和博客在讲解深度学习基础的时候也只会讲到感知机和mlp这种结构,而提及hopfield网…...

SON自动添加邻站功能

该功能主要依赖于ANR自动添加邻区。在邻区添加完成后,源基站会从邻区的CGI信息中解析出目标基站的eNB ID,然后向核心网(MME)发送一条eNB Configuration Transfer消息,用于请求该eNB ID对应的X2接口传输层地址。若核心网…...

普通机床改造成键槽铣床

普通机床在机械加工领域应用广泛,但功能相对单一,若想拓展其加工范围,将其改造成键槽铣床是个不错的选择。改造的核心在于通过加装特定部件,让机床具备铣削键槽的能力。普通机床原本的直线运动和旋转运动基础,为改造提…...

如何高效阅读c语言函数(形成线思维和面思维)

最近,我在阅读linux内核源码,由于代码量太大了,有成百个源文件,源文件中有成千上万的函数,我本来的计划是对每一个源文件中的函数自上而下粗略读一遍(不会跳转到子函数中去看子函数是如何实现的&#xff09…...

机器学习40讲-10:特征预处理

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程​​​https://www.captainai.net/troubleshooter 华盛顿大学教授、《终极算法》(The Master Algorithm)的作者佩德罗多明戈斯曾在Communications of The ACM…...

探讨CSS复合属性的实际应用与交互设计

在CSS中,我们经常使用到的一些复合属性包括:font(字体)、border(边框)、background(背景)、padding(内边距)以及margin(外边距)等。接…...

常用代码知识

一、算法题常用 1.1 CSTL中哈希表(std::unordered_map和std::unordered_multimap) unordered_map和unordered_multimap区别在与mult的值可以重复。 方法insert、erase、size、count(统计出现次数) 其他操作: unorder…...

当AI写小说——一个被严重低估的工程化战场

当AI写小说——一个被严重低估的工程化战场本文收录于《工程化AI人机协同方法论》系列专栏,对应系列第54篇核心文章 核心结论前置:AI写小说从来不是「一句prompt生成全文」的创意魔法,而是一套涵盖设定治理、记忆管理、文风校准、节奏管控、合…...