浅谈Docker容器的网络通信原理

文章目录

    • 1、回顾容器概念
    • 2、容器网络
    • 3、容器与主机之间的网络连通
    • 4、交换机的虚拟实现---虚拟网桥(Bridge)
    • 5、Docker 守护进程daemon管理容器网络

1、回顾容器概念

我们知道容器允许我们在同一台宿主机(电脑)上运行多个服务(可以把服务当作一个或者多个进程),每个服务之间互相隔离。一个容器里运行的进程实际上是运行在宿主机的操作系统之上的,就像其他所有进程一样(而与之相比,虚拟机中的进程是运行在不同的操作系统之上的)。但是在容器中的进程和本容器之外的进程是隔离的,对于它来说,仿佛自己是在此机器上运行的唯一进程。

容器将代码和依赖项打包在一起。多个容器可以在同一台计算机上运行,并与其他容器共享操作系统内核,每个容器在用户空间中作为隔离进程运行。

在这里插入图片描述

2、容器网络

Linux的namespace机制为容器提供了隔离的功能,使得我们在容器中看到了一个新的天地,好像进入了一个新的操作系统,这个时候我们查看网络信息,会发现也是全新的(包括网卡、本地回环设备、路由表和 iptables 规则),这是怎么做到的呢?这就是利用了namespace中的Network namespace实现了网络的隔离,使得每个容器都拥有了自己的网络体系(学名叫做网络栈)

在这里插入图片描述

3、容器与主机之间的网络连通

如何连通容器的网络空间与主机的网络空间呢?Linux中有一种虚拟设备叫做veth pair,它是一种成对出现的网络设备,数据从一个veth设备发送出去,可以直接到达配对的另一个veth设备,可以简单理解为它们之间是由网线连接的,如下图所示。它们的两端可以放到不同的网络空间,实现连通两个network namespace的目的。

在这里插入图片描述

4、交换机的虚拟实现—虚拟网桥(Bridge)

veth pair 可以连通两个网络空间,如果我们想要将多个 namespace连通的话 ,就不能只使用 veth pair 了。我们可以类比生活中的物理网络,把网络空间比作不同的主机,在物理网络中,如果需要连接多个主机,我们一般会使用交换机。而Linux 提供了交换机的虚拟实现,叫做虚拟网桥(Bridge),我们可以在主机上创建一个虚拟网桥,然后将各个容器网络空间通过veth pair 与Bridge连接,这样就实现了各个容器网络空间的打通,如下图所示:
在这里插入图片描述

veth在容器中的一端就可以作为本容器网络空间的网卡,有了虚拟网桥,同一个宿主机的容器之间就可以相互通信了,容器内的应用也可以通过虚拟网桥,再经由宿主机网卡访问外部服务。

以上也就是Docker桥接模式的网络原理(桥接模式是Docker主要的网络模式),Docker创建的虚拟网桥有自己的名字:docker0。

可以通过ip address 查看docker0的信息。

ip address 

在这里插入图片描述

5、Docker 守护进程daemon管理容器网络

在 Docker 中,管理容器的网络的是Docker 守护进程(daemon)。在桥接网络模式下,Docker 守护进程会执行以下主要任务:

  1. 创建和管理虚拟网络桥(docker0):Docker 守护进程在启动时会创建 docker0 虚拟网络桥,守护进程负责管理这个网桥的配置和状态,确保容器能够正常通过这个网桥进行通信。

  2. 分配容器的虚拟网络接口和 IP 地址:当用户创建一个新的容器时,Docker 守护进程会为该容器创建一对虚拟的网络接口,并为其容器中的一端分配一个唯一的 IP 地址,另一端连接到docker0 网桥。

在Linux下,我们通过“ifconfig”命令就可以看到,宿主机出现了以下网络接口,他们就是docker0网桥以及容器“插在”docker0网桥上的veth设备。

ifconfig

在这里插入图片描述

  1. 执行网络地址转换(NAT):当容器需要与外部网络通信时,Docker 守护进程会执行网络地址转换。NAT 允许容器使用宿主机的 IP 地址访问外部网络,同时也允许外部网络访问容器提供的服务。

为什么要进行NAT呢?让我们考虑一种场景:假如容器要访问百度首页,百度的Server要返回给容器数据,如果百度的Server将目的地址设置为容器的IP,由于容器的IP在外部是不可见的,就会导致结果的数据包无法返回,所以在发送请求给百度Server时需要将源IP转换为宿主机的IP。

  1. 管理端口映射(Port Mapping):Docker 守护进程负责管理容器内部端口与宿主机上的端口之间的映射关系。当用户定义了端口映射规则时,守护进程会在宿主机的网络命名空间中设置相应的转发规则,以实现外部网络与容器内部服务的通信。

为什么要进行端口映射呢?因为容器内部的端口在外部也是无法访问的,需要将宿主机的端口与之进行映射。

如下图所示:

在这里插入图片描述
Docker的桥接模式下,同一宿主机的容器之间是可以相互通信的,容器也可以访问外部网络,但在这种模式下,不同宿主机的容器之间是没有关联的,他们无法进行直接通信。

这里通常的做法是通过集群把多个宿主机上的容器组织起来,使得它们之间的网络可以连通,具体集群中容器之间的通信请看下一篇文章。

在这里插入图片描述


行动是治愈恐惧的良药,而犹豫、拖延将不断滋养恐惧。


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

kali基本扫描工具(自带)

免责声明:本文仅做技术交流与学习...请勿非法破坏... 详细用法: 命令 -h/百度/翻译 fping 用法 hostlist 文件里面为ip fping -a -q -f hostlist -a 只看存活的 fping -g 202.100.1.1 202.100.1.255 -a -q > Ahost 输出到Ahost文件上 nping nping -c 1 201.100.2.155-244 …

ES 查询踩坑-全字段匹配

需求:name字段需要全匹配查询 name的映射 普通的must查询 GET power_engin/_search {"from": 0,"size": 10,"query": {"bool": {"must": [{"term": {"name": {"value": "尼…

数据结构--《二叉树》

二叉树 1、什么是二叉树 二叉树(Binar Tree)是n(n>0)个结点的优先集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两颗互不相交的、分别称为根结点的左子树和右子树的二叉树构成。 这里给张图,能更直观的感受二叉树&#xff1…

异步那些事01

首先我们肯定先说创建线程 1.继承Thread类 o定义一个类MyThread继承Thread类 o在MyThread类中重写run()方法 o创建MyThread类的对象 o启动线程 package Java.thread;public class first extends Thread{public void run(){for(int i0;i<50;i){System.out.println("我…

【MySQL】——并发控制

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

Vapor Mode:Vue.js 的速度与激情,代码界的闪电侠

大家好&#xff0c;我是宝哥。 在快速发展的网络开发世界中&#xff0c;创新的Vue.js团队给我们带来了Vapor Mode。这个新模式优化了Vue的核心渲染过程&#xff0c;帮助我们的应用程序像轻烟一样运行&#xff0c;开发者无需深入复杂的优化工作。 在这篇文章中&#xff0c;我们将…

贝叶斯算法:机器学习中的“黄金法则”与性能提升之道

&#x1f440;传送门&#x1f440; &#x1f50d;机器学习概述&#x1f340;贝叶斯算法原理&#x1f680;贝叶斯算法的应用✨文本分类✨医疗系统 &#x1f496;贝叶斯算法优化✨贝叶斯算法优化的主要步骤✨贝叶斯算法优化的优点✨贝叶斯算法优化的局限性 &#x1f697;贝叶斯算…

详细分析tcping的基本知识以及用法

目录 前言1. 安装配置2. 基本知识3. Demo 前言 针对ping的基本知识推荐阅读&#xff1a;详细分析ping的基本知识以及常见网络故障的诊断&#xff08;图文解析&#xff09; 1. 安装配置 针对Window的下载如下&#xff1a; 安装路径&#xff1a;tcping官网 下载tcping.exe&a…

【开源】大学生竞赛管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、系统介绍 学生管理模块 教师管理模块 竞赛信息模块 竞赛报名模块 二、系统截图 三、核心代码 一、系统介绍 基于Vue.js和SpringBoot的大学生竞赛管理系统&#xff0c;分为管理后台和用户网页端&#xff0c;可以给管理员、学生和教师角色使用&#xff0c;包括学…

STM32手写超频到128M函数

今天学习了野火的STM32教程学会了如何设置STM32的时钟频率&#xff0c;步骤比较详细&#xff0c;也很容易理解&#xff0c;就是视频教程不能跳着看&#xff0c;只能一节节的看&#xff0c;不然会知识不连贯&#xff0c;造成有些知识不理解&#xff0c;连续着看还是没有什么难度…

闲置商标转让出现这些状态时注意!

近日以前做转让的一个朋友的商标转让证明下来&#xff0c;正好是2个半月&#xff0c;普推知产老杨发现这个时间也太快&#xff0c;以前差不多四个月左右&#xff0c;有些朋友需要购买闲置商标&#xff0c;3个月内所有权就变成自己的。 在购买闲置商标时要注意有一些细节&#x…

创新实训2024.05.26日志:服务端接口实现——用户开启多个会话

1. 概念图 类似于Kimi&#xff0c;文心一言&#xff0c;chatGPT等市面上主流的大模型&#xff0c;我们的大模型也支持同一个用户的多个会话&#xff0c;并且提供支持联系上下文给出解答的能力。 2. 基于会话的对话 在langchain chatchat这个对langchain框架进行二次封装的第三…

GPT-4 与 GPT-4 Turbo有什么区别?

在不断发展的人工智能和自然语言处理领域&#xff0c;OpenAI 的 GPT 系列一直走在最前沿&#xff0c;彻底改变了机器理解和生成类人文本的方式。每一次迭代&#xff0c;进步都会突破可能性的界限。 最新的条目 GPT-4 和 GPT-4 Turbo 引起了人工智能社区内外的极大兴趣和争论。…

推荐13款常用的Vscode插件,提高前端日常开发效率

1. Live Server Live Server 插件是一个用于前端开发的扩展&#xff0c;它的主要作用是提供一个本地开发服务器&#xff0c;以便实时预览和调试网页应用程序。其最大特点在于热重载&#xff0c;即开发者可实时预览代码效果。 因为Live Server 允许开发者在浏览器中实时预览您正…

【C++】详解深浅拷贝的概念及其区别

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C ⚙️操作环境:Visual Studio 2022 目录 什么是拷贝 什么是浅拷贝 什么是深拷贝 深浅拷贝的区别及使用场景 结语 什么是拷贝 在C编程中&#xff0c;拷贝是一个非常重要的概念&#xff0c;对于理解和使用类和对象起…

浅谈JMeter体系结构

JMeter体系结构详解 JMeter是一款功能强大的开源性能测试工具&#xff0c;广泛应用于Web应用、数据库、FTP服务器等多种场景下的负载和压力测试。其灵活的体系结构设计使得测试计划的创建、执行与结果分析变得高效而直观。本文将深入解析JMeter的三维空间体系结构&#xff0c;…

C++实现定长内存池

项目介绍 本项目实现的是一个高并发的内存池&#xff0c;它的原型是Google的一个开源项目tcmalloc&#xff0c;tcmalloc全称Thread-Caching Malloc&#xff0c;即线程缓存的malloc&#xff0c;实现了高效的多线程内存管理&#xff0c;用于替换系统的内存分配相关函数malloc和fr…

基于UDP的TFTP文件传输-实现网盘上传下载功能

数据传输模式&#xff1a;octet(二进制模式) #include<head.h> char* down_up_request(char* buf,char* filename,int rw,int sockfd,struct sockaddr_in in); int download(struct sockaddr_in in,char* filename,char* buf,int sockfd); int upload(struct sockaddr_in…

数据结构(七)查找

2024年5月26日一稿(王道P291) 7.1 查找的基本概念 7.2 顺序查找和折半查找 7.2.1 顺序查找 7.2.2 折半查找 7.2.3 分块查找 7.3 树形查找 7.3.1 二叉排序树(BST)

FFmpeg+QT播放器实战1---UI页面的设计

1、播放器整体布局的设计 该部分使用QT的UI工具&#xff0c;进行整体页面设置&#xff0c;如下图1所示&#xff1a; 2、控制布局的设计 创建ctrBar的UI页面并进行页面布局设置&#xff0c;如下图2所示&#xff1a; 将图1中ctrBarWind对象提升为ctrBar类(该界面替代原先的控…