【云原生】Docker 的网络通信

Docker 的网络通信

  • 1.Docker 容器网络通信的基本原理
    • 1.1 查看 Docker 容器网络
    • 1.2 宿主机与 Docker 容器建立网络通信的过程
  • 2.使用命令查看 Docker 的网络配置信息
  • 3.Docker 的 4 种网络通信模式
    • 3.1 bridge 模式
    • 3.2 host 模式
    • 3.3 container 模式
    • 3.4 none 模式
  • 4.容器间的通信
    • 4.1 通过 IP 地址进行通信
    • 4.2 通过 Docker DNS Server 进行通信
    • 4.3 通过 Joined 方式进行通信
    • 4.4 容器间的跨节点通信
      • 4.4.1 三种方式
      • 4.4.2 Overlay 网络与注册中心
  • 5. 容器的网络访问控制
    • 5.1 容器内的应用访问外部网络
    • 5.2 从外部网络访问容器内的应用

在这里插入图片描述

Docker 的容器运行在宿主机的虚拟机上。这些虚拟机彼此独立,彼此之间没有任何接口,即容器彼此之间是 逻辑隔离 的。

那么,如何实现容器的相互通信呢?容器又如何访问外部的网络呢?外部的网络如何才能访问部署在容器内的应用呢?本篇博客将带领大家了解这些问题。

1.Docker 容器网络通信的基本原理

Docker 容器中的网络接口默认都是 虚拟接口。虚拟接口的最大优势是转发效率极高。这是因为 Linux 通过在内核中进行数据复制来实现虚拟接口之间的数据转发,即发送接口缓存中的数据包会被直接复制到接收接口的缓存中,而无需通过外部的物理网络设备进行交换。

⭐ 虚拟接口和一个正常的以太网卡并无太大区别,只是它的速度比以太网卡快的多。

Docker 的网络很好地利用了 Linux 虚拟网络技术,在宿主机的物理网卡和容器内分别创建一个虚拟接口(veth),并让它们通过宿主机的 docker0 网桥进行连接,我们把这样的一对 veth 叫做 veth pair

在这里插入图片描述

1.1 查看 Docker 容器网络

基于 CentOS 的镜像创建一个容器,并进入该容器内。

docker run -it centos /bin/bash

为了查看容器的网络信息,在容器内安装 net-tools 网络工具。

yum install -y net-tools

在宿主机打开一个命令行窗口,执行以下命令查看宿主机的 docker0 网桥信息。

ifconfig

在容器内执行以下命令查看容器网络信息。

ifconfig

容器内的网络地址和宿主机的网络地址具有相同的 flag。这说明在创建容器时,会成对地创建 veth pair,并且它们通过宿主机的 docker0 网桥进行通信。

1.2 宿主机与 Docker 容器建立网络通信的过程

在这里插入图片描述

2.使用命令查看 Docker 的网络配置信息

利用以下命令查看 Docker 的网络通信模式。

docker network ls

查看 bridge 模式的详细信息。

docker network inspect 20ca9d84d5b4

3.Docker 的 4 种网络通信模式

3.1 bridge 模式

bridge 模式是 Docker 默认的网络通信模式,是开发者最常用的模式。

bridge 模式下,Docker 引擎会创建独立的网络命名空间。这样就可以保证运行在每一个命名空间中的容器具有独立的网卡等网络资源。

利用 bridge 模式可以非常方便地实现容器与容器之间、容器与宿主机之间的网络隔离。通过使用宿主机上的 docker0 网桥,可以实现多个容器与宿主机(乃至外部网络)的网络通信。

3.2 host 模式

在使用 host 模式时,容器与宿主机共享同一个网络命名空间,容器的 IP 地址与宿主机的 IP 地址相同。如果宿主机具有公网的 IP 地址,则容器也拥有这个公网的 IP 地址。即这时容器可以直接使用宿主机的 IP 地址与外界进行通信,且容器内服务的端口也可以直接使用宿主机的端口,无需进行任何的转换。

由于在 host 模式下不再需要宿主机的转发,因此其性能得到了极大的提高。
在这里插入图片描述
尽管使用 host 模式可以很方便的通过 localhost 或者 127.0.0.1 实现容器与宿主机的相互访问,并且性能也比较好,但是这种模式也存在以下两个问题:

  • 由于容器使用了宿主机的网络环境,因此网络环境的隔离性功能被减弱,从而造成宿主机和容器争用网络资源。容器本身也不再拥有所有的网络资源,而是与宿主机共享网络资源。
  • 宿主机和容器使用了相同的 IP 地址,这不利于网络的配置和管理。

3.3 container 模式

container 模式下,容器之间会共享网络环境。即一个容器会使用另一个容器的网络命名空间。因此,在这种模式下,容器之间可以通过 localhost 或者 127.0.0.1 进行互相间的访问,从而提高了传输的效率。

container 模式节约了网络资源,但是运行在这种模式下的容器不存在网络隔离。Container 网络的隔离性处于 bridge 网络与 host 网络之间。

container 模式在一些特殊场景中非常有用。例如,在 K8s 中创建 Pod 时,会首先创建 Pod 基础容器;而 Pod 中的其他容器则采用 container 模式与基础容器进行通信。Pod 中的各个容器采用 localhost 或者 127.0.0.1 进行通信,从而将 Pod 中的所有容器形成一个逻辑整体。
在这里插入图片描述

3.4 none 模式

none 模式下的容器具有独立的网络命名空间,但不包含任何网络配置。只能通过 Local Loopback 网卡与容器进行通信,即只能使用 localhost 或者 127.0.0.1 访问容器。

none 模式下需要手动进行网络配置,例如使用 pipwork 工具指定容器的 IP 地址等。

4.容器间的通信

4.1 通过 IP 地址进行通信

在宿主机上创建一个容器时,Docker 守护进程会为每一个新创建的容器自动分配一个虚拟的 IP 地址。但是,外部的网络是无法通过这个虚拟 IP 地址访问容器内的应用的。

⭐ 这个虚拟 IP 地址只提供 Docker 内部各个容器相互通信使用。即通过这个 IP 地址实现了 Docker 内容器之间的互相连通。

4.2 通过 Docker DNS Server 进行通信

在实际的使用过程中,通过容器的虚拟 IP 地址进行容器间的相互通信非常不利于管理和维护。

从 Docker 1.10 版本开始,Docker 引擎自带了一个内嵌的 DNS Server。有了它,容器之间可以直接通过容器名称进行通信。这种通信方式的使用方法也非常简单,在启动容器时,使用 --name 参数为容器命名即可。

docker run -it --network=bridge2 --name box1 busybox
docker run -it --network=bridge2 --name box2 busybox
  • bridge2 是一个 bridge 模式的自定义网络。
  • busybox 是一个集成了一百多个最常用 Linux 命令和工具的软件工具箱。
  • box1box2 是容器名称。

例如,在容器 box1 内执行 ping 命令,以确认是否能使用容器名称与对方进行通信。

ping box2

4.3 通过 Joined 方式进行通信

Joined 是 Docker 引擎提供的一种特殊的容器间通信方式,其本质上使用了 container 模式。因为在 container 模式下,多个容器共享同一个网络环境,也共享网卡的配置。因此,在 container 模式下,容器之间可以直接通过 localhost 或者 127.0.0.1 进行通信。

例如,在 box2 容器中,通过 wget 127.0.0.1 命令可以直接访问 box1 容器的 HTTP 服务。

4.4 容器间的跨节点通信

在同一台宿主机中,不同的多个容器可以借助 docker0 网桥直接进行通信。而在实际的项目中,一个复杂的系统往往需要部署多个组件,而为了提高组件的运行效率,往往将这些组件部署到不同的主机上。那么在 Docker 中如何实现容器间的跨节点通信呢?

4.4.1 三种方式

  • 通过容器在宿主机上的端口映射来实现通信。使用这种方式实现容器间的跨节点通信,需要宿主机进行转发,所以使用起来非常不方便。
  • 通过 Docker Overlay 网络来实现通信。这种方式可以直接使用容器本身的虚拟 IP 地址进行相互通信,这与运行在同一台宿主机上的不同容器间的通信方式完全一样。Docker 原生的 Overlay 网络是目前实现容器跨节点通信的主流方式。要使用 Overlay 网络,需要注册中心的支持。
  • 通过第三方网络来实现容器间的跨节点通信

4.4.2 Overlay 网络与注册中心

Overlay 网络是在不改变现有网络的前提下,对 IP 报文进行数据的封装,从而利用 IP 路由协议实现数据的转发功能。在 Overlay 网络中,通过拓展标识符可以支持 16M 的用户。

Docker 的 Swarm 集群便是 Overlay 网络的一个实现,而使用 Overlay 网络需要注册中心的支持。注册中心能够提供服务的注册与发现功能。Docker 支持的注册中心有 ZookeeperConsulETCD

5. 容器的网络访问控制

5.1 容器内的应用访问外部网络

在默认情况下,容器内的应用访问外部网络是通过宿主机上的 docker0 网桥来实现的。当容器内的应用需要访问外部网络时,需要宿主机进行转发。

执行以下指令可以确定宿主机的 Linux 是否开启了 IP 数据包转发功能。

sysctl net.ipv4.ip_forward
  • 如果返回 1 1 1,则表示已开启。
  • 如果返回 0 0 0,则表示未开启。

可以执行以下语句开启此功能。

sysctl -w net.ipv4.ip_forward=1

开启此功能的另一种方式是,在启动 Docker 服务时指定参数 --ip-forward=true。这样 Docker 守护进程会自动将宿主机 ip_forward 参数设置为 1 1 1

5.2 从外部网络访问容器内的应用

运行在宿主机上的容器,允许从外部网络访问其内部的应用,这主要是通过 -p 参数来实现的。

通过在创建容器时指定 -p 参数,可以将容器内的某个端口与宿主机绑定,来完成宿主机与容器的端口映射。基本质是:在宿主机 iptable 表中添加相应的路由转发规则,对访问外部 IP 地址的数据包进行转换,将其访问的目标地址修改为容器的 IP 地址和容器内的端口。

基于 Nginx 的镜像创建一个容器,并将容器的 80 80 80 端口映射到宿主机的 1234 1234 1234 端口。

docker run -d -p 1234:80 nginx

在宿主机上,通过以下命令来查看 iptable 表中的路由转发规则。

iptables -t nat -L -n | grep 1234

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

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

相关文章

RabbitMQ之生产批量发送

为什么要用生产批量发送? 批量发送消息,可以提高MQ发送性能。但是 RabbitMQ 并没有提供了批量发送消息的 API 接口,使用 spring-amqp 的 BatchingRabbitTemplate 实现批量能力。 SimpleBatchingStrategy 发送策略满足以下规则会进行发送: ba…

开源模型应用落地-LangChain高阶-Tools工具-集成agents(四)

一、前言 LangChain 的 tools 是一系列关键组件,它们提供了与外部世界进行交互的能力。通过适当的使用这些组件,可以简单实现如执行网络搜索以获取最新信息、调用特定的 API 来获取数据或执行特定的操作、与数据库进行交互以获取存储的信息等需求。 本章…

图像处理的一些操作(1)

图像处理 1.安装PIL,skimage库1.1导入skimage库中的oi模块和data模块 2.读取图像文件2.1读取图像文件2.2 以灰度模式读取图像2.3 查看示例图像的目录路径2.4 读取chelsea图片2.5 加载示例图片并保存2.6 获得加载图片的信息2.6.1 输出图片类型2.6.2 输出图片尺寸2.6.…

idea生成双击可执行jar包

我这里是一个生成xmind,解析sql的一个main方法,可以通过配置文件来修改有哪些类会执行 我们经常会写一个处理文件的main方法,使用时再去寻找,入入会比较麻烦,这里就可以把我们写过的main方法打成jar包,放到指定的目录来处理文件并生成想要的结果 1.写出我们自己的main方法,本地…

Reactor模型详解

目录 1.概述 2.Single Reactor 3.muduo库的Multiple Reactors模型如下 1.概述 维基百科对Reactor模型的解释 The reactor design pattern is an event handling pattern for handling service requests delivered concurrently to a service handler by one or more inputs.…

《ElementUI 基础知识》el-tabs header 监听鼠标中键滚动时左右滑动(ElementPlus同样适用)

前言 收到需求,可监听 el-tabs 头在鼠标 hover 时。滑动鼠标中键,可左右滑动! 效果 鼠标中键上下滑动时;向上滑,向左移动;向下滑,向右移动; 实现 代码56 - 60行,添加…

服务器IP选择

可以去https://ip.ping0.cc/查看IP的具体情况 1.IP位置--如果是国内用,国外服务器的话建议选择日本,香港这些比较好,因为它们离这里近,一般延时低(在没有绕一圈的情况下)。 不过GPT的话屏蔽了香港IP 2. 企…

【数学建模】矩阵微分方程

一、说明 我相信你们中的许多人都熟悉微分方程,或者至少知道它们。微分方程是数学中最重要的概念之一,也许最著名的微分方程是布莱克-斯科尔斯方程,它控制着任何股票价格。 ​​ 股票价格的布莱克-斯科尔斯模型 微分方程可以由数学中的许多…

【Python项目】基于DJANGO的【医院体检预约系统】

技术简介:使用Python技术、DJANGO框架、MYSQL数据库等实现。 系统简介:系统采用了在线预约和挂号的方式,用户可以通过网站进行预约和挂号操作。同时,系统还提供了医生的详细介绍和评价,方便用户选择医生。 研究背景&a…

Linux系统编程--信号与管道

1、信号与管道是什么? 首先了解信号与管道的意义,我们需要了解Linux系统中进程之间是如何通信的。Linux操作系统下,以进程为单位来分配或者管理资源,进程之间不能直接访问资源,因此,要求进程间的资源和信息…

word中取消分页符或分段符前后的空格

在Word中,有时候,我们添加分页符后,从分页符后面的文字就全部掉到了下一页,那么如何避免呢? 选择word选项--高级,然后下滑到下面,将“取消分页符或分段符前后的空格”选中,如下图所…

【Linux】进程间通信 - 管道

文章目录 1. 进程间通信介绍1.1 进程间通信目的1.2 进程间通信发展1.3 进程间通信分类 2. 管道2.1 什么是管道2.2 匿名管道2.3 用 fork 来共享管道原理2.4 站在文件描述符角度 - 深入理解管道2.5 站在内核角度 - 管道本质2.6 管道读写规则2.7 管道特点 3. 命名管道3.1 匿名管道…

C 408—《数据结构》图、查找、排序专题考点(含解析)

目录 Δ前言 六、图 6.1 图的基本概念 6.2 图的存储及基本操作 6.3 图的遍历 6.4 图的应用 七、查找 7.2 顺序查找和折半查找 7.3 树型查找 7.4 B树和B树 7.5 散列表 八、排序 8.2 插入排序 8.3 交换排序 8.4 选择排序 8.5 归并排序和基数排序 8.6 各种内部排序算法的比较及…

Meta Llama 3 使用 Hugging Face 和 PyTorch 优化 CPU 推理

原文地址:meta-llama-3-optimized-cpu-inference-with-hugging-face-and-pytorch 了解在 CPU 上部署 Meta* Llama 3 时如何减少模型延迟 2024 年 4 月 19 日 万众期待的 Meta 第三代 Llama 发布了,我想确保你知道如何以最佳方式部署这个最先进的&…

堆栈打印跟踪Activity的启动过程(基于Android10.0.0-r41),framework修改,去除第三方app的倒计时页面

文章目录 堆栈打印跟踪Activity的启动过程(基于Android10.0.0-r41),framework修改,去除第三方app的倒计时页面1.打印异常堆栈2.去除第三方app的倒计时页面3.模拟点击事件跳过首页进入主页 堆栈打印跟踪Activity的启动过程(基于Android10.0.0-r41)&#x…

UNI-APP_拨打电话权限如何去掉,访问文件权限关闭

uniapp上架过程中一直提示:允许“app名”拨打电话和管理通话吗? uniapp配置文件:manifest.json “permissionPhoneState” : {“request” : “none”//拨打电话权限关闭 }, “permissionExternalStorage” : {“request” : “none”//访…

深度解析Java 9核心新特性

码到三十五 &#xff1a; 个人主页 < 免责声明 > 避免对文章进行过度解读&#xff0c;因为每个人的知识结构和认知背景都不同&#xff0c;没有一种通用的解决方案。对于文章观点&#xff0c;不必急于评判。融入其中&#xff0c;审视自我&#xff0c;尝试从旁观者角度认清…

ruoyi漏洞总结

若依识别 黑若依 :icon hash"-1231872293 绿若依 :icon hash"706913071” body" 请通过前端地址访 " body" 认证失败&#xff0c;无法访问系统资源 " 如果页面访问显示不正常&#xff0c;可添加默认访问路径尝试是否显示正常 /login?redi…

.net6 webapi 部署到IIS

一、发布.net6 webapi 项目 1.1 visual studio 2022右键发布到文件夹。 二、增加IIS容器 2.1 控制面板 2.2 启用或关闭Windows功能 3.3 勾选Internet Information Services,点击确定进行安装 三、部署webapi到IIS 3.1 安装 dotnet-hosting-6.0.29-win.exe 3.2 创建应用…

基于高德 API 的自动获取气候数据的 Python 脚本

文章目录 高德申请 Key脚本介绍运行结果示例 源代码&#xff1a; https://github.com/ma0513207162/PyPrecip。pyprecip\reading\read_api.py 路径下。 项目介绍&#xff1a;PyPrecip 是一个专注于气候数据处理的 Python 库&#xff0c;旨在为用户提供方便、高效的气候数据处理…