docker 网络原理-元一软件
Docker 网络原理容器是相对独立的环境相当于一个小型的 Linux 系统外界无法直接访问那他是怎么做的呢这里我们先了解下 Linux veth pair。1. Linux veth pairveth pair 是成对出现的一种虚拟网络设备接口一端连着网络协议栈一端彼此相连。如下图所示veth pair将两个网络veth0和veth1连通。2. 理解Docker0我们先查看本地ip这里我们分析可得有三个网络lo127.0.0.1# 本机回环地址eth0172.31.179.120# 阿里云的私有IP如果你是虚拟机就是虚拟机的ipdocker0172.17.0.1# docker网桥lo和eth0在我们的虚拟机启动的时候就会创建但是docker0在我们安装了docker的时候就会创建。docker0用来和虚拟机之间通信。问题Docker 是如何处理容器网络访问的我们先启动一个 tomcat 容器来说明。[rootjiangnan tomcat1]# docker pull tomcat[rootjiangnan tomcat1]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE tomcat latest fb5657adc8922months ago 680MB[rootjiangnan tomcat1]# docker run -d -p 8081:8080 --name tomcat01 tomcat914a7d82b017f63f81c6eba49af5471441f1946c9d45509b69ab2c50c2713b6f[rootjiangnan tomcat1]#这里启动了tomcat01我们再来查看网络发现我们前面查看的时候还是三组网卡当启动了一个tomcat容器之后多了一组网卡201: vethad33778if200而且还是成对的。同样我们再来启动一个tomcat02会又多出一对网卡。进入了 tomcat01 容器内可以看到 tomcat01 对应的 ip 地址为172.17.0.2在宿主机上也可ping通。说明tomcat02对应的ip为172.17.0.3也可以ping通。结论我们每启动一个容器就会多出一对网卡同时他们被连接到docker0上而docker0又和虚拟机之间连通。也可以通过inspect查看。[rootjiangnan tomcat1]# docker network lsNETWORK ID NAME DRIVER SCOPE 4d3e75606593 bridge bridgelocal# 这个就是docker08e92ee24e5f6hosthostlocale85ffb1f2cc3 none nulllocal[rootjiangnan tomcat1]# docker inspect 4d3e75606593IPAM:{Driver:default,Options:null,Config:[{Subnet:172.17.0.0/16,Gateway:172.17.0.1# 网关}]},Containers:{# 容器15910ee083965d60c46bf9b3b292570fef9b8925905aa4df90c6d48142bb2eee:{Name:tomcat01,EndpointID:9c7a5ab65f1fc91b1d92ad61dec9b2f518f67f69f662522483dca789616f42aa,MacAddress:02:42:ac:11:00:02,IPv4Address:172.17.0.2/16,IPv6Address:},6c9a6a5d8eca9ad52926008c7b30516d23293ff8ad1f38947957d571431d5297:{Name:tomcat02,EndpointID:f83c1e643236cd65f50fba03929ca14d5df8d135b1f6cb8adf203cf96084f7aa,MacAddress:02:42:ac:11:00:03,IPv4Address:172.17.0.3/16,IPv6Address:}},我们可以抽象为这样一个网络模型。在这里我们可以看到Docker0相当于一个路由器的作用任何一个容器启动默认都是docker0网络。docker默认会给容器分配一个可用ip并把它同docke0相连。使用到的就是veth pair技术。3. 容器互联–Link在网络模型图中可以看出容器和容器之间不能直接连通。前面我们启动的两个 tomcat 对应的 hosts 如下[rootjiangnan tomcat1]# docker exec -it tomcat01 cat /etc/hosts127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters172.17.0.2 3ecb3204e2dc root3ecb3204e2dc:/usr/local/tomcat#[rootjiangnan tomcat1]# docker exec -it tomcat02 cat /etc/hosts127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters172.17.0.3 6c9a6a5d8eca[rootjiangnan tomcat1]#发现他们的 hosts 中只有各自的ip地址。但是在实际的工作中容器使用的是虚拟ip每次启动ip都会变化思考一个场景我们编写一个微服务数据库连接地址原来是使用ip的如果ip变化就不行了那我们能不能使用服务名访问呢我们在启动一个tomcat03使用—link绑定到tomcat02上。然后看它的hosts是什么样的。[rootjiangnan tomcat1]# docker run -d -p 8083:8080 --name tomcat03 --link tomcat02 tomcatdb75c42f7f7f609218deb290d3e923e3c7da6bcf8c0b38cde27962fb2b9e9a54[rootjiangnan tomcat1]# docker exec -it tomcat03 cat /etc/hosts127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters172.17.0.3 tomcat02 e4060ea4ee28# 发现tomcat2直接被写在这里172.17.0.4 db75c42f7f7f rootdb75c42f7f7f:/usr/local/tomcat#发现使用了–link不但有了自己的ip而且还有了tomcat02的服务名。但是tomcat02中并没有tomcat03的因为–link是单向的。这样就实现了容器和容器之间的连通。不需要通过ip地址连通而是通过服务名就可以。但是使用—link的方法过时了我们一般使用自定义网络。4.自定义网络推荐docker0的特点它是默认的域名访问不通–link 域名通了但是删了又不行docker为我们提供了三种网络模式[rootjiangnan tomcat1]# docker network lsNETWORK ID NAME DRIVER SCOPE 4d3e75606593 bridge bridgelocal8e92ee24e5f6hosthostlocale85ffb1f2cc3 none nulllocal[rootjiangnan tomcat1]#这其中默认使用的是 bridge也就是我们的docker0网卡。在我们启动容器的时候实际上是如下命令[rootjiangnan tomcat1]# docker run -d -P --name tomcat01 --net bridge tomcat这个—net是默认的所以被省略了。下面我们自定义一个网络 mynet。# 自定义创建的默认default bridge[rootjiangnan tomcat1]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet3136d64109c6f285bc69d3ee4be901524292d0e5ddd9e414d49197dfa6c19ba1[rootjiangnan tomcat1]# docker network lsNETWORK ID NAME DRIVER SCOPE 4d3e75606593 bridge bridgelocal8e92ee24e5f6hosthostlocal3136d64109c6 mynet bridgelocal# 多了一个mynete85ffb1f2cc3 none nulllocal[rootjiangnan tomcat1]# docker network inspect mynet[{Name:mynet,Id:3136d64109c6f285bc69d3ee4be901524292d0e5ddd9e414d49197dfa6c19ba1,Created:2022-02-27T14:15:44.67669395808:00,Scope:local,Driver:bridge,EnableIPv6:false,IPAM:{Driver:default,Options:{},Config:[{Subnet:192.168.0.0/16,# 子网地址Gateway:192.168.0.1# 网关}]},Internal:false,Attachable:false,Ingress:false,ConfigFrom:{Network:},ConfigOnly:false,Containers:{},Options:{},Labels:{}}][rootjiangnan tomcat1]#查看网络[rootjiangnan tomcat1]# docker inspect mynet[{Name:mynet,Id:3136d64109c6f285bc69d3ee4be901524292d0e5ddd9e414d49197dfa6c19ba1,Created:2022-02-27T14:15:44.67669395808:00,Scope:local,Driver:bridge,EnableIPv6:false,IPAM:{Driver:default,Options:{},Config:[{Subnet:192.168.0.0/16,Gateway:192.168.0.1}]},Internal:false,Attachable:false,Ingress:false,ConfigFrom:{Network:},ConfigOnly:false,Containers:{31f12c9332e8b4b6e66619dc988533f2863b80e71dbf490c8313694637814ca1:{Name:tomcat-net-02,EndpointID:1c0e9dbffff295f2326bfd1e2847c0f1d9136ff00519101bb11d922e7da4f818,MacAddress:02:42:c0:a8:00:03,IPv4Address:192.168.0.3/16,IPv6Address:},675439c851dc29355c03f82bb163f9e5a326e230447d86d40d53ff08766cfd06:{Name:tomcat-net-01,EndpointID:2653da0a25d166f0d7222235e85d8231d9424e19949b6e6b7cfa1a3eddcc462b,MacAddress:02:42:c0:a8:00:02,IPv4Address:192.168.0.2/16,IPv6Address:}},Options:{},Labels:{}}][rootjiangnan tomcat1]## 我们来测试ping容器名和ip试试都可以ping通[rootjiangnan ~]# docker exec -it tomcat-net-01 ping 192.168.0.3PING192.168.0.3(192.168.0.3)56(84)bytes of data.64bytes from192.168.0.3:icmp_seq1ttl64time0.093ms[rootjiangnan ~]# docker exec -it tomcat-net-01 ping tomcat-net-02PING tomcat-net-02(192.168.0.3)56(84)bytes of data.64bytes from tomcat-net-02.mynet(192.168.0.3):icmp_seq1ttl64time0.063ms64bytes from tomcat-net-02.mynet(192.168.0.3):icmp_seq2ttl64time0.066ms发现不用—link也可以直接通过服务名ping通了。5.网络连通docker0和自定义网络肯定不通我们使用自定义网络的好处就是网络隔离。但是在实际的工作中比如我们部署了mysql使用了一个网段。部署了tomcat使用了另一个网段两个网段之间肯定是不能相互连通的但是tomcat和mysql又需要相互连通我们就要使用网络连通。原理图如下网络连通就是将一个容器和一个网段之间的连通。比如我前面使用的默认docker0的tomcat01需要连接到mynet网络。# docker network connect 网络 容器[rootjiangnan tomcat1]# docker network connect mynet tomcat01[rootjiangnan tomcat1]# docker network inspect mynet[{Name:mynet,Id:3136d64109c6f285bc69d3ee4be901524292d0e5ddd9e414d49197dfa6c19ba1,Created:2022-02-27T14:15:44.67669395808:00,Scope:local,Driver:bridge,EnableIPv6:false,IPAM:{Driver:default,Options:{},Config:[{Subnet:192.168.0.0/16,Gateway:192.168.0.1}]},Internal:false,Attachable:false,Ingress:false,ConfigFrom:{Network:},ConfigOnly:false,Containers:{2e709013935463c29caf28771bb49925fee4e02842459b339d7dd1ad5dedf9b7:{Name:tomcat-net-01,EndpointID:9f3a46bad37ade7935e283715caa5699e9a7e22175b592f4a4792a37c351d969,MacAddress:02:42:c0:a8:00:02,IPv4Address:192.168.0.2/16,IPv6Address:},5c0c544f2507d9f5f456feceddbd853ebccc07cea8c39c8479693731e480bf55:{Name:tomcat01,EndpointID:d05abb2d31af4067c5a45f299ce7b4401b1fa81638a44b6c09f3de7f8f4221fe,MacAddress:02:42:c0:a8:00:04,IPv4Address:192.168.0.4/16,IPv6Address:},d6066db5fdd0b508514107a896ed20b639eaa47dbd97a025ad0c52250766c8a4:{Name:tomcat-net-02,EndpointID:3a5f6f2a07d900303382b290825c9f52640689c859608c741c7c7d81031e107e,MacAddress:02:42:c0:a8:00:03,IPv4Address:192.168.0.3/16,IPv6Address:}},Options:{},Labels:{}}][rootjiangnan tomcat1]#通过这种方式直接将tomcat01加到了mynet网络中。6.总结veth pair是成对出现的一种虚拟网络设备接口一端连着网络协议栈一端彼此相连。docker中默认使用docker0网络。docker0相当于一个路由器的作用任何一个容器启动默认都是docker0网络。docker0是容器和虚拟机之间通信的桥梁。推荐使用自定义网络更好实现使用服务名的连通方式避免ip改变的尴尬。网络之间不能直接连通网络连通是将一个容器和一个网络之间的连通实现跨网络操作。

相关新闻

TVA与世界模型共创具身智能“类脑想象力”(11)

TVA与世界模型共创具身智能“类脑想象力”(11)

前沿技术探索:AI智能体视觉(TVA,Transformer-based Vision Agent)是依托Transformer架构与“因式智能体”理论所构建的颠覆性工业视觉技术,是集深度强化学习(DRL)、卷积神经网络(CNN…

2026/10/12 19:26:58 阅读更多 →
为什么选择Diplomat?解析Rust FFI工具的性能与安全优势

为什么选择Diplomat?解析Rust FFI工具的性能与安全优势

为什么选择Diplomat?解析Rust FFI工具的性能与安全优势 【免费下载链接】diplomat Rust tool for generating FFI definitions allowing many other languages to call Rust code 项目地址: https://gitcode.com/gh_mirrors/dipl/diplomat Diplomat是一款强大…

2026/10/12 18:40:39 阅读更多 →
【单片机毕业设计】基于 STM32/51 单片机的蓝牙遥控智能小车设计与实现,基于手机 APP 的 L293D 驱动蓝牙小车控制系统开发(022202)

【单片机毕业设计】基于 STM32/51 单片机的蓝牙遥控智能小车设计与实现,基于手机 APP 的 L293D 驱动蓝牙小车控制系统开发(022202)

文章目录20 个相关毕业设计备选题目项目研究背景摘要总体方案一、核心硬件清单及选型说明二、硬件整体架构逻辑三、开发运行硬件环境核心功能一、基础供电功能(辅助功能)二、底层电机差速驱动功能(核心功能)三、无线通信交互功能&…

2026/10/9 11:15:47 阅读更多 →

最新新闻

可靠性数据统计方法与R语言实战:从配套数据集到Weibull建模

可靠性数据统计方法与R语言实战:从配套数据集到Weibull建模

简介:《Statistical Methods for Reliability Data》配套数据集面向可靠性建模学习者和从业者,是这本经典著作的实操补充。包内围绕寿命分布、生存分析、故障率函数、可靠性增长、多组件系统可靠性、寿命试验设计与统计推断等核心知识点,提供…

2026/10/12 20:07:21 阅读更多 →
AI编程agent失控?用最小规格驱动工作流守住代码边界

AI编程agent失控?用最小规格驱动工作流守住代码边界

我本来是想抄作业的。Spec Kit、OpenSpec、Superpowers 这三个名字,我在搜索框里来回扫了不止一遍。原因很简单:最近一段时间的 AI 编程 agent 越来越难控制,改一个登录模块,它能顺手把我另一个文件的变量名也改了;说好…

2026/10/12 20:07:21 阅读更多 →
自建技术博客的完整实践:从静态站点生成到命令行发布

自建技术博客的完整实践:从静态站点生成到命令行发布

1. 起点:为什么要自建博客,而不是继续躺在平台里我相信每个写过一段时间技术博客的人,都会在某一天产生一个念头:我写的内容到底属于谁?这个念头在我身上盘旋了很久。平台给流量、给推荐、给了现成的排版和读者&#x…

2026/10/12 20:07:21 阅读更多 →
开放代码评审实践:从零搭建轻量级评审工具与流程

开放代码评审实践:从零搭建轻量级评审工具与流程

1. 为什么“代码评审”这件事值得单独拿出来做一套工具代码评审(Code Review)是研发流程里最容易被口号化、也最容易被敷衍的一环。几乎每个团队都声称自己在做评审,但真正落到日常,往往是三种状态:要么是“橡皮图章式…

2026/10/12 20:07:21 阅读更多 →
open-code-review:让代码评审有据可查、有果可闭环的工程实践

open-code-review:让代码评审有据可查、有果可闭环的工程实践

1. 项目概述:open-code-review 到底要解决什么代码评审这件事,但凡在团队里待过一两年的人,都经历过那种“评审2小时,改动3行”的尴尬局面。评审邮件发出去没人理,约了个会议大家对着屏幕沉默,等终于有人说…

2026/10/12 20:07:21 阅读更多 →
贷中风险预测竞赛级Python源码解析:从多表合并到LightGBM建模

贷中风险预测竞赛级Python源码解析:从多表合并到LightGBM建模

简介:面向计算机专业毕业设计、期末大作业及金融风控入门实践,这份完整项目包以贷中风险预测为核心任务,基于Python机器学习完整覆盖数据清洗、特征工程、模型训练与效果评估流程,适合需要从零构建实际项目的初中级学习者。资源共…

2026/10/12 20:06:21 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →