深入解析Docker网桥模式:从docker0到容器网络的完整通信链路

1. 简介docker 网桥模式

在这里插入图片描述
Docker 启动时默认创建 docker0 虚拟网桥(Linux bridge),并分配私有 IP 地址范围(如 172.17.42.1/16),它的作用相当于一个虚拟交换机,让宿主机和多个容器之间可以通信。

Docker 创建容器时,会分配一对虚拟以太网设备(veth pair),一端放在容器内(通常命名为 eth0)另一端连接到 docker0 网桥,Docker 会从子网中为容器分配一个 IP 地址,容器内的默认网关设置为 docker0 的 IP 地址,通过 iptables 设置 NAT 规则实现容器与外部网络通信。

2. 采用网桥模式创建redis容器

docker run -d --name redis -p 6379:6379 redis:6.2.5

ps: 网络模式默认就是网桥模式

3. 分析docker0 与容器的网卡映射关系

查看redis容器的网卡:

docker exec -it 450b2337fc1c  ip addr

输出如下:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
256535: eth0@if256536: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0valid_lft forever preferred_lft forever

可以看到容器网卡接口索引是256535:网卡名称是:eth0,@if256536表示这个网卡接口的对端接口索引是256536

执行以下命令,查找接口索引为256536的网卡接口:

ip link | grep 256536

输出如下:

256536: veth4a50f5e@if256535: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default 

这里,256536是宿主机上,虚拟网卡 veth4a50f5e 接口的接口索引;veth4a50f5e 是宿主机端的 veth 接口名称;@if256535 表示这个接口的对端接口索引是 256535(即容器内的 eth0 的接口索引)。

执行以下命令查看连接到docker0的虚拟网卡接口:

ip link show master docker0

得到如下输出:

256536: veth4a50f5e@if256535: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default link/ether 02:ac:01:6c:71:d8 brd ff:ff:ff:ff:ff:ff link-netnsid 0

这里,veth4a50f5e 就是连接到docker0的虚拟网卡接口

4. 分析 iptables 转发规则

iptables-save -t nat

输出如下:

-A DOCKER ! -i docker0 -p tcp -m tcp --dport 6379 -j DNAT --to-destination 172.18.0.2:6379

这条规则的意思是:把所有 不是从 docker0 网卡 进入、目标端口为 6379 的 TCP 流量,重定向到容器 IP 172.18.0.2 的 6379 端口。

为什么加 ! -i docker0?这相当于只处理来自“外部(宿主机或外网)”的流量,而不是容器内部之间的通信。如果不加 ! -i docker0,Docker 容器之间通信也会被错误重定向,可能导致死循环或转发混乱。通过排除 docker0 网卡,确保这条规则只匹配从宿主机外部来的连接请求(例如本地开发机访问 localhost:6379)。

5. 分析docker-proxy 代理

执行以下命令看宿主机上的 6379 端口所属进程:

netstat -tulnp | grep 6379

输出如下:

tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      20010/docker-proxy  
tcp6       0      0 :::6379                 :::*                    LISTEN      20015/docker-proxy  

其中,pid为20010,进程名为docker-proxy的进程监听ipv4的6379端口, pid为20015,进程名为docker-proxy的进程监听ipv6的6379端口,

查看进程20010的命令行参数:

ps -ef  |grep 20010

输出如下:

root     20010 27367  0 21:27 ?        00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 6379 -container-ip 172.18.0.2 -container-port 6379

这个结果的意思是:
Docker 启动了一个代理程序 docker-proxy,它监听宿主机的 0.0.0.0:6379,并将所有进入该端口的 TCP 流量转发到容器内的 172.18.0.2:6379。

查看进程20015的命令行参数:

ps -ef  |grep 20015

输出如下:

root     20015 27367  0 21:27 ?        00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 6379 -container-ip 172.18.0.2 -container-port 6379

这个结果的意思是:

Docker 启动了一个代理程序 docker-proxy,它监听宿主机的 :::6379,并将所有进入该端口的 TCP 流量转发到容器内的 172.18.0.2:6379。

6. 从外部进入容器的流量是通过docker-proxy还是iptables的DNAT?

docker-proxy 和 iptables 都可以实现流量转发到容器,那么从外部进入容器的流量是通过docker-proxy还是iptables的DNAT呢?
这取决于 Docker 的网络配置和系统环境:现代 Docker(默认)主要使用的是 iptables DNAT,而 docker-proxy 是作为某些场景的补充或兼容机制存在,比如容器需要访问宿主机本身的公开端口(特殊回环场景),或者某些旧版 Docker 或特殊配置下作为备用路径。

7. 分析容器网络空间

查看redis容器内的进程:

docker top redis

输出如下:

UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
polkitd             20048               20029               0                   21:27               ?                   00:00:00            redis-server *:6379

查看容器进程命令行参数:

ps -ef  |grep 20015

输出如下:

polkitd  20048 20029  0 21:27 ?        00:00:01 redis-server *:6379

进入redis容器网络空间:

nsenter -t $container_pid -n /bin/sh

ps : container_pid 即 20048

执行命令:

netstat -tunlp

输出如下:

sh-4.2# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      20048/redis-server  
tcp6       0      0 :::6379                 :::*                   LISTEN      20048/redis-server 

可以发现在容器的网络空间中,可以查看容器启动的进程监听的端口,而在宿主机上则看不到。这是因为在 Docker 容器中,每个容器默认会被分配一个独立的网络命名空间,容器内的所有进程共享同一个网络命名空间。

8.分析宿主机与容器之间的通信过程

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/86640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Proof of Talk专访CertiK联创顾荣辉:全周期安全方案护航Web3生态

6月10日&#xff0c;CertiK联合创始人兼CEO顾荣辉在Proof of Talk 2025举办期间&#xff0c;接受大会官方专访&#xff0c;分享了他对Web3安全现状的观察以及CertiK的安全战略布局。 顾荣辉指出&#xff0c;虽然安全的重要性被广泛认可&#xff0c;但许多创业者和开发者仍存在…

再说一说LangChain Runnable接口

之前我们介绍过LangChain通过Runnable和LCEL来实现各个组件的快捷拼装&#xff0c;整个过程就像拼积木一样。 今天我们深入剖析Runnable接口的底层实现逻辑。 往期文章推荐: 16.Docker实战&#xff1a;5分钟搞定MySQL容器化部署与最佳实践15.Ollama模板全解析&#xff1a;从基…

LLaMA-Factory微调Qwen3模型完了,怎么直接用vllm推理模型?

环境&#xff1a; LLaMA-Factory vllm0.8.5 Qwen3-8b 问题描述&#xff1a; LLaMA-Factory微调Qwen3模型完了,怎么直接用vllm推理模型&#xff1f; 解决方案&#xff1a; 一、合并 LoRA 权重与基础模型 vLLM 需要完整的模型文件&#xff08;含合并后的权重&#xff09;…

C#AES加密

一、AES 加密概念 定义 &#xff1a;AES&#xff08;Advanced Encryption Standard&#xff0c;高级加密标准&#xff09;是一种对称加密算法&#xff0c;由美国国家标准与技术研究院&#xff08;NIST&#xff09;于 2001 年发布&#xff0c;用于替代之前的 DES&#xff08;数据…

搞了两天的win7批处理脚本问题

目录 问题 原因&#xff1a; 经过各种对比 解决方法 问题 比如 echo "yes" | find /c /v "" 这个统计非空串的行数&#xff0c;在其它系统都是 1&#xff1b;但在win7里非正常的反应&#xff0c;为空。 原因&#xff1a; 在wvpCheckStart.bat 首…

手阳明大肠经之温溜穴

个人主页&#xff1a;云纳星辰怀自在 座右铭&#xff1a;“所谓坚持&#xff0c;就是觉得还有希望&#xff01;” 温溜又名&#xff1a; 1.《针灸甲乙经》&#xff1a;逆注、蛇头。 2.《资生》&#xff1a;池头。 所属经络&#xff1a;手阳明大肠经 定位 屈肘&#xff0c;在前臂…

传统Web应用和RESTful API模式

传统Web应用和RESTful API 传统模式 传统模式没有实现前后端分离&#xff0c;服务器处理完业务后直接返回完整的HTML页面&#xff0c;每次操作都要刷新整个页面。类似下面的情况&#xff1a; Controller public class UserController {RequestMapping("/addUser")…

JS开发node包并发布流程

开发一个可发布到 npm 的 JavaScript 插件&#xff0c;需要遵循标准的开发、测试、打包和发布流程。以下是详细步骤指南&#xff1a; 1. 初始化项目 创建项目目录并初始化 package.json mkdir my-js-plugin cd my-js-plugin npm init -y手动修改 package.json&#xff0c;确保…

对比学习(Contrastive Learning)方法详解

对比学习&#xff08;Contrastive Learning&#xff09;方法详解 对比学习&#xff08;Contrastive Learning&#xff09;是一种强大的自监督或弱监督表示学习方法&#xff0c;其核心思想是学习一个嵌入空间&#xff0c;在这个空间中&#xff0c;相似的样本&#xff08;“正样…

1.6 http模块nodejs 对比 go

我们以go语言 原生实现 和浏览器交互.到现在学习 nodejs http模块. nodejs 对于请求分发,也需要我们自己处理. 我们应该也对 http 服务是建立在 tcp协议基础上.有更深入的体会了吧. 对于我们之后 学习 java web容器. 能有更深入的认知. 请求分发 请求分发是指 Web 框架或服务器…

护照阅读器在景区的应用

护照阅读器在景区的应用可以显著提升游客管理效率、增强安全性并优化游客体验。以下是其主要应用场景、优势及实施建议&#xff1a; 一、核心应用场景 快速入园核验 自动身份识别&#xff1a;通过扫描护照芯片&#xff08;MRZ码或NFC读取&#xff09;&#xff0c;1-3秒完成身份…

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…

什么是遥测数据?

遥测数据定义 遥测数据提供了关于系统性能的重要洞察&#xff0c;对主动解决问题和做出明智决策至关重要。要实现这一点&#xff0c;不能只依赖原始数据 —— 你需要实时的洞察&#xff0c;而这正是遥测数据提供的。 遥测是从远程来源&#xff08;如服务器、应用程序和监控设…

【JavaAPI搜索引擎】项目测试报告

JavaAPI搜索引擎测试报告 项目背景与项目介绍项目功能自动化测试单元测试测试ansj分词器测试能否获取到正确的URL测试能否正确解析文件中的正文 测试计划界面测试测试1 页面布局是否合理美观&#xff0c;元素是否正确显示测试2 测试是否可以正常显示出搜索结果测试3 点击搜索结…

如何选择合适的IP轮换周期

选择合适的IP轮换周期需综合业务目标、目标平台风控规则、IP类型与质量等多维度因素&#xff0c;以下是系统化决策框架及实操建议&#xff1a; &#x1f504; 一、核心决策要素 业务场景类型 高频操作型&#xff08;如数据采集、广告点击&#xff09;&#xff1a; 轮换周期短&a…

GO Goroutine 与并发模型面试题及参考答案

目录 什么是 Goroutine,它与线程有何区别? 如何创建一个 Goroutine?有哪些方式? Goroutine 执行函数时传递参数应注意什么问题? 使用 Goroutine 时如何确保主线程不会提前退出? 多个 Goroutine 写共享变量时会出现什么问题?如何解决? 如何用 sync.WaitGroup 管理 …

Leetcode-11 2 的幂

Leetcode-11 2 的幂&#xff08;简单&#xff09; 题目描述思路分析通过代码&#xff08;python&#xff09; 题目描述 给你一个整数 n&#xff0c;请你判断该整数是否是 2 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果存在一个整数…

【Java】【力扣】121.买卖股票的最佳时机

思路 所以后续的每次都是在&#xff1a;1-判断是否更新最低点 2-如果不需要更新最低点 则计算差值 代码 class Solution { public int maxProfit(int[] prices) { int minprices[0]; int max0; for (int i 1; i < prices.length; i) { //假设0就是最低点 // 判…

微服务架构下大型商城系统的事务一致性攻坚:Saga、TCC与本地消息表的实战解析

当用户在商城完成支付却看到"订单异常"提示时&#xff0c;背后往往是分布式事务一致性缺失导致的业务裂缝。在微服务拆分的商城系统中&#xff0c;如何保障跨服务的交易原子性&#xff0c;成为架构设计的生死线。 一、商城分布式事务的典型场景与痛点 在某家电品牌商…

深入理解 Vue.observable:轻量级响应式状态管理利器

目录 引言 一、什么是 Vue.observable&#xff1f; 二、为什么需要 Vue.observable&#xff1f;解决什么问题&#xff1f; 三、核心原理&#xff1a;响应式系统如何工作 四、如何使用 Vue.observable 功能说明 技术要点 五、关键注意事项与最佳实践 六、实际应用案例 …