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

embedded/2024/11/14 23:01:33/

文章目录

    • 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的桥接模式下,同一宿主机的容器之间是可以相互通信的,容器也可以访问外部网络,但在这种模式下,不同宿主机的容器之间是没有关联的,他们无法进行直接通信。

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

在这里插入图片描述


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



http://www.ppmy.cn/embedded/43296.html

相关文章

HTML静态网页成品作业(HTML+CSS)——宠物狗介绍网页(3个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有3个页面。 二、作品演示 三、代…

Golang框架HTTP客户端框架zdpgo_resty发送表单请求

核心代码 这里通过字典传递了一个简单的表单数据。 发送的是POST请求。 resp, err : client.R().SetFormData(map[string]string{"username": "jeeva","password": "mypass",}).Post("http://127.0.0.1:3333/login")fmt.P…

安徽京准、子母钟系统(网络时钟系统)在机场应用方案

安徽京准、子母钟系统(网络时钟系统)在机场应用方案 安徽京准、子母钟系统(网络时钟系统)在机场应用方案 摘要:某机场指挥调度、离港系统、航显广播等多个重要信息系统之间的时钟同步,对机场的正常运营和安…

成都青年AI人才崭露头角,知了汇智科技助力孵化营大放异彩

5月18日-19日,为期两天的成都国际商贸城青年(大学生)AI应用孵化营活动在热烈的氛围中圆满落幕。本次活动由成都国际商贸城、成都成商数字科技有限公司、成都知了汇智科技有限公司及成都电商职教集团联合举办,旨在为青年&#xff0…

Jetpack架构组件_1.基本知识

1.什么是Jetpack? Jetpack 是一个由多个库组成的套件,可帮助开发者遵循最佳做法、减少样板代码并编写可在各种 Android 版本和设备中一致运行的代码,让开发者可将精力集中于真正重要的编码工作。Jetpack 包含一系列 Android 库,它…

点击登录按钮先检测输入框的规则检测(vue组合式)

<template><el-form :model"user" :rules"rules" ref"loginForm" label-width"auto" style"max-width: 600px"><el-form-item label"用户名" prop"name"><el-input v-model"…

GoldenEye-v1(vulnhub)靶机练习实践报告

GoldenEye-v1****靶机练习实践报告 一、安装靶机 靶机是.ova文件&#xff0c;需要用VirtualBox打开&#xff0c;但我习惯于使用VMWare,因此修改靶机文件&#xff0c;使其适用于VMWare打开。 解压ova文件&#xff0c;得到.ovf文件和.vmdk文件。 用记事本打开.ovf文件并修改“…

[Halcon学习笔记]Halcon窗口进行等比例显示图像

目录 需求分析Halcon显示原理显示实现具体实现Halcon代码 需求分析 在使用Halcon加载图像时&#xff0c;点击Halcon的适应窗口&#xff0c;图像都会按照窗口大小对图像进行拉伸后显示&#xff0c;实际项目中&#xff0c;需要等比例显示图像&#xff0c;体现图像原本的尺寸细节…