Docker网络背后的原理探究

别再踩坑了!Docker Compose里配置DNS不生效?试试加上network_mode: bridge 本文深入解析Docker Compose中DNS配置不生效的问题,揭示其与network_mode的关联。通过对比bridge与自定义网络的DNS处理机制,提供三种实用解决方案:强制使用bridge网络、挂载自定义resolv.conf及修改Docker守护进程配置,帮助开发者高效解决容器DNS解析难题。 阅读详情

转子:https://www.cnblogs.com/bakari/p/8971772.html

Docker默认的网络环境下,单台主机上的Docker容器可以通过docker0网桥直接通信,而不同主机上的Docker容器之间只能通过在主机上做端口映射进行通信。这种端口映射方式对很多集群应用来说极不方便。如果能让Docker容器之间直接使用自己的IP地址进行通信,会解决很多问题。按实现原理可分别直接路由方式、桥接方式(如pipework)、Overlay隧道方式(如flannel、ovs+gre)等。

在单主机环境下有四种网络模式:

主要看两种:Nat网络和Host网络模式

在Nat网络模式下,是一些私网,容器不能直接跨主机通信!

Host模式下容器公用主机的网络!

 

知其然而不知其所以然,不知也。老古人说得多好,学知识不懂得知识背后的原理,等于白学。

通过前面两篇文章,我们知道了容器的单主机网络和多主机网络,对于这么多网络方案,我们看到对 Docker 的整体网络结构好像没有改动,都是水平扩展的,那 Docker 网络究竟是怎么集成这么多网络方案而不改变自身原有的结构呢?本文就来一探究竟。

Docker 的总体框架#

要回答这个问题,得从 Docker 的总体框架说起。

 

容器和虚拟机一样,都是虚拟化的产品,都包括计算虚拟化,存储虚拟化和 IO 虚拟化。容器作为轻量级的进程,不像虚拟机那般复杂,这三块分别靠三个 Driver 来完成的,execdriver 负责计算虚拟化,networkdriver 负责网络虚拟化,graphdriver 负责存储虚拟化。由此可见,Docker 靠 Driver 这种设计思想来支撑起它的基础平台,再往深了挖,它的每个子模块都随处可见这种设计思想,就网络这个子模块来看,也是如此。

Docker 的网络模型#

docker engine + libcontainer#

期初的 Docker 网络子模块的代码是分散在 docker daemon 和 libcontainer 中的,libcontainer 是一个独立的容器管理包,execdriver 和 networkdriver 都是通过 libcontainer 来实现对容器的具体操作。

随着业务场景越来越复杂,这种内嵌的方式很难针对不同的网络场景进行扩展。后来,Docker 收购了一个做多主机网络解决方案的公司 SocketPlane,然后让那帮人专门来解决这个问题。这就是接下来要介绍的 libnetwork。

libnetwork && CNM#

libnetwork 起初的做法很简单,就是将 docker engine 和 libcontainer 中网络相关的代码抽出来,合并成一个单独的库,做成网络抽象层,并对外提供 API。Docker 的愿景就是希望 libnetwork 能够做像 libcontainer 那样,成为一个多平台的容器网络基础包。

后来受一个 GitHub issue ( https://github.com/moby/moby/issues/9983) 的启发,libnetwork 引入容器网络模型(Container Network Model,CNM),该模型进一步对 Docker 的网络结构进行了细分,提出了三个概念:network、sandbox 和 endpoint。

network

network 是一个抽象的概念,你可以把它理解成一个网络的插件,或者是网络的 Driver,比如说单主机网络的 Driver 就有 none、host、bridge,joined container 这四种,多主机网络就有 overlay、macvlan、flannel 这些。network 可以独立出去做,只需调用 Docker 对外提供的 API 就可以作为插件集成到 Docker 网络中使用。

sandbox

sandbox 实现了容器内部的网络栈,它定义容器的虚拟网卡,路由表和 DNS 等配置,其实就是一个标准的 linux network namespace 实现。

endpoint

network 实现了一个第三方的网络栈,sandbox 则实现了容器内部的网络栈,那这两者怎么联系起来呢?答案就是通过 endpoint,endpoint 实现了 veth pair,一个 endpoint 就表示一对 veth pair,一端挂在容器中,另一端挂在 network 中。

 

network、sandbox 和 endpoint 三者之间的关系:

  • 一个 network 可以包含多个 endpoint,自然也就包含多个 sandbox。

  • 一个 sandbox 可以包含多个 endpoint,可以属于多个 network。

  • 一个 endpoint 只可以属于一个 network,并且只属于一个 sandbox。

如上图显示三个容器,每个容器一个 sandbox,除了第二个容器有两个 endpoint 分别接入 network1 和 network2 之外,其余 sandbox 都只有一个 endpoint 分别接入不同的 network。

到此,我们就可以解答文章开篇提到的问题,“不同的网络方案如何集成到 Docker 网络模型中而不改变原有结构?”

答案就是基于 libnetwork CNM,将各个网络模型以插件或 Driver 的形式集成到 Docker 网络中来,与 docker daemon 协同工作,实现容器网络。Docker 原生的 Driver 包括单主机的 none、bridge、joined container 和 多主机的 overlay、macvlan,第三方 Driver 就包括多主机的 flannel、weave、calico 等。

总结

  1. libnetwork 基于 CNM 模型将 Docker 网络结构从原生方案中抽离出来,增强了网络扩展性,以至于现在各种网络方案层出不穷,都可以轻松集成到 Docker 中。

  2. network,sandbox,endpoint 三个概念。

 

 

 

 

 

 

 

 

 

 

Docker容器内核安全:Seccomp系统调用过滤原理与高级配置实践 在云原生和容器化部署中,系统调用作为用户空间与Linux内核交互的核心接口,是安全防护的关键层面。其原理在于通过内核机制对进程可执行的系统调用进行过滤,从而限制潜在的攻击面。这项技术的核心价值在于实现最小权限原则,从最底层加固容器安全。在容器安全领域,Seccomp(安全计算模式)是实现系统调用过滤的主流技术,通过定义白名单或黑名单规则,精细控制容器进程的内核访问权限。本文聚焦于Docker环境中Seccomp-BPF的高级配置,深入探讨如何为特定应用构建定制化系统调用白名单,并结合strace等工具进行依 阅读详情

相关推荐

Docker存储路径详解:从默认位置到安全迁移实战

在容器化技术中,存储管理是保障系统稳定运行的基础环节。Docker作为主流容器引擎,其数据存储机制采用分层架构,镜像层与容器层共同构成数据存储体系。理解存储原理对于优化磁盘空间、提升I/O性能及保障数据安全具有重要技术价值,尤其在持续集成、微服务部署等高频应用场景中。当默认存储路径(如/var/lib/docker)空间不足时,需通过修改data-root配置实现数据迁移。本文基于Docker镜像与容器存储的热点问题,结合存储驱动与数据迁移等高频搜索关键词,详解如何通过系统化操作完成存储路径的安全调整与优化

weixin_30219613的博客 305

Docker——网络原理

直接使用bridge模式,是无法支持指定IP运行docker的,例如执行以下命令就会报错 docker run -itd --name test1 --network bridge --ip 172.17 .0.10 nginx:latest /bin/bash。

weixin_67300995的博客 1510

手把手教你为FPGA项目集成HyperRAM IP核:从AXI接口封装到上板调试全流程

本文详细介绍了如何为FPGA项目集成HyperRAM IP核,涵盖从AXI接口封装到上板调试的全流程。通过对比DDR3L、PSRAM和HyperRAM的性能指标,突出HyperRAM在低功耗和小封装尺寸方面的优势,并提供硬件连接、AXI4-Lite接口设计、状态机优化及调试技巧等实用内容,帮助开发者高效完成FPGA项目中的内存扩展。

weixin_32103009的博客 285

Docker网络原理

前言 Docker有4种网络通信模型,分别是:bridge、host、none、container,默认使用的网络模型是bridge,本文中用到的也是bridge网络模型 本文分享Docker网络原理,主要包含三部分内容: 容器之间通信 容器访问外网 外部访问容器 1、前置网络知识 1)、veth pair veth是虚拟以太网卡(Virtual Ethernet)的缩写。veth设备总是成对的,因此称之为veth pair。veth pair一端发送的数据会在另外一端接收。根据这一特性,veth pa

hxt的博客 4906

【电驱动】永磁同步电机工作原理及分类

永磁同步电机工作原理及分类

星Yeah 的博客 7325

Cocos2d-x手游逆向实战:Frida高阶Hook与动态解密技术

Cocos2d-x作为主流跨平台游戏引擎,其混合架构(C++核心+JNI桥接+Lua/JS脚本)和强加固策略(符号剥离、anti-frida、so加壳)使传统逆向方法失效。本文围绕‘无符号定位’‘C++函数硬编码地址识别’‘Lua层AST级劫持’‘OpenGL内存回溯解密’四大关键技术展开,深入解析如何在真实上线项目中稳定hook被strip的libcocos2d.so关键函数、绕过反调试心跳检测、从glTexImage2D参数逆向追踪明文资源,并结合熵值扫描实现零先验知识的内存明文发现。面向已掌握Frid

weixin_30345577的博客 673

非常干!聊聊几种主流Docker网络的实现原理

一、容器网络简介容器网络主要解决两大核心问题:一是容器的IP地址分配,二是容器之间的相互通信。本文重在研究第二个问题并且主要研究容器的跨主机通信问题。实现容器跨主机通信的...

1705

台达PLC DIAdesigner-AX 编程笔记

1、登陆台达思图软件网站,选择Download,登陆注册好的账号,下载DIAInstaller,下载后安装(安装目录不要修改);

weixin_45823621的博客 6675

Docker 网络深度详解(从原理到实战)

手动创建(),本质是独立的docker0网桥;内置DNS 解析,容器间可通过「容器名 / 别名」直接互通(核心优势);不同自定义网络隔离,互不干扰(比如项目 A 和项目 B 用不同网络);支持动态添加 / 移除容器。# 1. 创建自定义网络# 2. 启动 Tomcat(不暴露端口,仅容器内访问)# 3. 启动 Nginx(暴露80端口,配置反向代理到 Tomcat)# 4. 进入 Nginx 容器,修改配置(代理到 tomcat-web:8080)# 编辑配置文件echo '

returnthem的博客 320

STM32硬件SPI配置为全双工模式下不要单独使用HAL_SPI_Transmit API及HAL_SPI_TransmitReceive改造方法

STM32 HAL库中SPI全双工模式使用问题总结:当配置为全双工模式时,单独使用HAL_SPI_Transmit会导致后续接收数据异常,原因是该API未处理接收数据。改造HAL_SPI_TransmitReceive使其支持单纯的发送/接收模式:当pTxData为NULL时只关心接收数据,pRxData为NULL时只关心发送数据,但仍会保持全双工通信。建议在全双工模式下统一使用改造后的HAL_SPI_TransmitReceive函数。

kevin1499的博客 901

计算电磁学(三)有限差分方法

有限差分方法(FDM)是一种数值处理方法,通过将偏微分方程变换为一组代数方程,通过求解代数方程组来得到原边值问题的近似值。由于有限差分法非常简单,所以也特别的稳定高效。其中时域有限差分方法(FDTD)是电磁分析中的常用方法。在计算电磁学中,常用有限差分方法(finite difference equations)来替代微分方程。一个有限差分法通常包括三个步骤将求解域划分网格用有限差分方程逼近给定的微分方程求解在给定边界条件和初始状态下的方程常用的网格模型方阵斜方阵三角阵圆形阵。

CCC_B的博客 1639

Docker 网络原理

引言 学习docker网络,可以带着下面两个问题来探讨 容器之间可以相互访问的原理 容器暴露端口后,通过宿主机访问到容器内应用,并且对于访问端而言不用感知容器存在的原理 Docker 本身的技术依赖Linux的内核虚拟化技术,所以为了能够更好的理解Docker的网络实现,必须要对牵扯到的主要技术做些了解 用到的主要Linux技术点 网络命名空间(Network Namespace) veth设备对 网桥 bridge(docker0) iptables netfilter 路由 网络命名空间 ...

Unknowncheats的博客 959

STM32电机PID速度控制

2.3 STM32电机PID速度控制 之前的文章,完成了直流减速电机的PWM控制、电机测速。本篇文章,将实现电机的速度闭环控制。 在公众号:小白学移动机器人,发送:速度PID,即可获得本篇文章的STM32工程文件以及相关资料。 2.3.1 解决的问题 解决带编码器直流电机的速度闭环问题。 2.3.2 PID理论 将偏差的比例、积分、微分,通过线性组合构成控制量,用控制量对被控对象进行控制,这样的控制器称为PID控制器。在连续空间中,我们通常探讨模拟PID的控制原理,如图所示: 我们这里用电机速度控制为例,

「小白学移动机器人」一个专注分享移动机器人相关知识的公众号! 6万+

Docker容器化技术背后的操作系统原理

Docker容器化技术通过利用Linux内核的命名空间、控制组、联合文件系统等特性,实现了轻量级、高效率的应用部署与管理。与传统虚拟化技术相比,容器化技术具有资源占用低、启动速度快、便携性强等显著优势。然而,容器技术也面临着隔离性不足、权限管理、镜像安全等安全性挑战。通过严格的权限管理、镜像安全审查、网络安全配置等措施,可以有效提升容器化环境的安全性。随着技术的不断发展,容器化技术将在云计算、微服务架构等领域发挥越来越重要的作用。

木头大左的博客 1175

Altium Designer应用技巧5: Altium Live账号的获得

为了更好的应用Altium Designer,我们需要得到一个Altium Live账号,但从其英文或者中文官方网站取得,都需要7个工作日的时间,而且对于个人用户来说,并不是100%都能够获取到。本文介绍一种,从俄罗斯Altium官方网站获取账号的方法,可以立即使用。     1、点击http://live.altium-ru.com/#Join网址进入俄罗斯Altium官方网站,Altiu

snmplink的博客 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Docker网络架构深度解析:从原理到实战

Docker 容器技术的普及改变了软件交付的方式,而网络作为容器化应用交互的基础设施,其重要性不言而喻。Docker 提供了多种网络驱动,以适应不同的应用场景。本文将深入剖析 Docker 的核心网络模式,包括 Bridge(桥接模式)、Host(主机模式)、Container(容器模式)以及 None(无网络模式),并结合实际操作案例,详细解读每一个网络配置环节及其背后的技术原理。Docker 默认的bridge网络虽然方便,但存在局限性(如不支持自动 DNS 解析,隔离性较差)。

2301_80863610的博客 2万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Docker08: docker网络

理解Docker 0 清空下前面的docker 镜像、容器 # 删除全部容器 $ docker rm -f $(docker ps -aq) # 删除全部镜像 $ docker rmi -f $(docker images -aq) 我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要按照了docker,就会有一个docker0桥接模式,使用的技术是veth-pair技术! https://www.cnblogs.com/bakari/p/10613710.html

qq_43378019的博客 157

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Docker 的底层工作原理

它的设计初衷是为开发者打造一个平台,让他们可以在自己的机器上完成所有操作:构建镜像、运行容器、查看日志、配置网络——只需一条 Docker 命令,世界尽在掌握。过去您使用的是单体式 Docker 系统,而现在您拥有一套独立的工具(Docker、containerd、runc、CRI-O),它们通过清晰定义的 API(CRI、OCI)进行通信。它是一个精妙而极简的适配器,它汲取了容器生态系统的精华,并针对 Kubernetes 的特定需求进行了定制。Kubernetes 的出现带来了真正的难题。

2501_93209230的博客 902

万字长文带你探究 Docker 容器化技术背后的黑科技

公众号关注「奇妙的 Linux 世界」设为「星标」,每天带你玩转 Linux !容器的优势传统模式的部署,直接将多个应用运行在物理服务器上,如果其中一个应用占用了大部分资源,可能会导致其他应用的性能下降。虚拟化部署时代,可以在单个物理服务器的 CPU 上运行多个虚拟机(VM),每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件(包括了操作系统)。因此,可以让不...

easylife206的专栏 516

k8s技术预研11--kubernetes网络原理

关于k8s网络,我们通常有以下问题需要回答:k8s的网络模型是什么Docker背后的网络基础是什么Docker自身的网络模型和局限k8s的网络组件之间是怎么通信的外部如何访问k8s的集群有哪些开源的组件支持k8s的网络模型接下来的内容,就对以上问题的答案进行深入探究。1、k8s网络模型Kubernetes 网络模型设计的一个基础原则是:每个 Pod 都拥有一个独立的 IP 地址,而且假定所有 Po...

watermelonbig的专栏 1万+

Kubernetes网络模型原理

导语:Kubernetes目前看来已经成为了docker的应用最多的编排工具,所以学习使用docker容器的话,就免不了使用Kubernetes,但是其网络原理还是比较晦涩难懂,所以还是有必要专门解析关于Kubernetes的网络原理。 Kubernetes的网络模型组成1.Pod内部docker容器之间网络通信[基础docker网络理论]2.Pod所在...

weixin_34126557的博客 100

带你深入探究云原生时代的分布式操作系统 Kubernetes

过去几年,以 docker、kubernetes 为代表的容器技术已发展为一项通用技术,BAT、滴滴、京东、头条等大厂,都争相把容器和 k8s 项目作为技术重心,试图“放长线钓大鱼”。就...

dotNET跨平台 716

OpenClaw AI智能体框架部署:三套安装脚本背后的工程美学

在软件工程领域,部署脚本是连接开发与运维的关键桥梁,其设计直接影响用户体验与项目可维护性。从原理上看,优秀的部署方案需兼顾自动化与灵活性,通过分层设计实现关注点分离。其技术价值在于降低使用门槛、提升系统可调试性,并能适应从个人开发到生产环境的多样化需求。典型的应用场景包括本地AI应用部署、微服务架构的初始化以及DevOps流水线的集成。本文以OpenClaw AI智能体框架为例,深入剖析其面向不同用户群体设计的**一键安装脚本**、**分步指导方案**与**声明式配置**三套部署策略,展现如何通过**工程美

weixin_34152820的博客 389
上一篇: 访问docker-api
下一篇: 关于/var/run/docker.sock
runner668
博客等级 码龄11年 161粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值