【Docker】Docker网络及容器间通信详解

news2024/11/26 0:38:56

目录

背景

默认网络

1、bridge 网络模式

2、host 网络模式

3、none 网络模式

4、container 网络模式

自定义网络

容器间网络通信

IP通信

Docker DNS server

Joined容器


前言

本实验通过docker DNS server和joined 容器两种方法实现Docker容器间的通信。Docker容器间通信可用于监控其他容器的网络流量、不同容器中程序如web server和app server的高效通信等场景。通过实验进一步熟悉Docker的架构和基本操作,了解Docker容器间通信的方式。

背景

当项目大规模使用 Docker 时,容器通信的问题也就产生了。要解决容器通信问题,必须先了解很多关于网络的知识。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,也有着很多不完善的地方,网络方面就是 Docker 比较薄弱的部分。因此,我们有必要深入了解 Docker 的网络知识,以满足更高的网络需求。

默认网络

安装 Docker 以后,会默认创建三种网络,可以通过 docker network ls 查看。

image.png

我们有必要先来了解一下这几种网络模式都是什么意思。

网络模式参数说明
host模式-net=host容器和宿主机共享 Network namespace。
container模式–net=container:NAME_or_ID容器和另外一个容器共享 Network namespace。 kubernetes 中的pod就是多个容器共享一个 Network namespace。
none模式–net=none容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接,配置IP等。
bridge模式–net=bridge默认为该模式,通过 -p 指定端口映射。

1、bridge 网络模式

在该模式中,Docker 守护进程创建了一个虚拟以太网桥 docker0,新建的容器会自动桥接到这个接口,附加在其上的任何网卡之间都能自动转发数据包。

默认情况下,守护进程会创建一对对等虚拟设备接口 veth pair,将其中一个接口设置为容器的 eth0 接口(容器的网卡),另一个接口放置在宿主机的命名空间中,以类似 vethxxx 这样的名字命名,从而将宿主机上的所有容器都连接到这个内部网络上。

比如运行一个基于 busybox 镜像构建的容器 bbox01,查看 ip addr:

busybox是一个软件工具箱,集成了linux中几百个常用的linux命令以及工具。

docker run -it --name bbox01 busybox

其中:

-i:以交互模式运行容器,通常与 -t 同时使用,表示开启了input功能

-t:为容器重新分配一个伪输入终端,通常与-i同时使用,表示开启了连接容器里的terminal(终端)

-d:指定容器在后台运行

image.png

然后宿主机通过 ip addr 可以发现:守护进程会创建一对对等虚拟设备接口 veth pair,将其中一个接口设置为容器的 eth0 接口(容器的网卡),另一个接口放置在宿主机的命名空间中,以类似 vethxxx 这样的名字命名。

image.png

同时,守护进程还会从网桥 docker0 的私有地址空间中分配一个 IP 地址和子网给该容器,并设置 docker0 的 IP 地址为容器的默认网关。也可以安装 yum install -y bridge-utils 以后,通过 brctl show 命令查看网桥信息。

yum install -y bridge-utils

image.png

对于每个容器的 IP 地址和 Gateway 信息,我们可以通过 docker inspect 容器名称|ID 进行查看,在 NetworkSettings 节点中可以看到详细信息。

image.png

我们可以通过 docker network inspect bridge 查看所有 bridge 网络模式下的容器,在 Containers 节点中可以看到容器名称。

docker network inspect bridge

image.png

关于 bridge 网络模式的使用,只需要在创建容器时通过参数 --net bridge 或者 --network bridge 指定即可,当然这也是创建容器默认使用的网络模式,也就是说这个参数是可以省略的。

image.png

Bridge 桥接模式的实现步骤主要如下:

  • Docker Daemon 利用 veth pair 技术,在宿主机上创建一对对等虚拟网络接口设备,假设为 veth0 和 veth1。而veth pair 技术的特性可以保证无论哪一个 veth 接收到网络报文,都会将报文传输给另一方。

  • Docker Daemon 将 veth0 附加到 Docker Daemon 创建的 docker0 网桥上。保证宿主机的网络报文可以发往 veth0;

  • Docker Daemon 将 veth1 添加到 Docker Container 所属的 namespace 下,并被改名为 eth0。如此一来,宿主机的网络报文若发往 veth0,则立即会被 Container 的 eth0 接收,实现宿主机到 Docker Container 网络的联通性;同时,也保证 Docker Container 单独使用 eth0,实现容器网络环境的隔离性。

2、host 网络模式

  • host 网络模式需要在创建容器时通过参数 --net host 或者 --network host 指定;

  • 采用 host 网络模式的 Docker Container,可以直接使用宿主机的 IP 地址与外界进行通信,若宿主机的 eth0 是一个公有 IP,那么容器也拥有这个公有 IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行 NAT 转换;

  • host 网络模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。

比如我基于 host 网络模式创建了一个基于 busybox 镜像构建的容器 bbox02,查看 ip addr:

docker run -it --name bbox02 --net host busybox

image.png

然后宿主机通过 ip addr 查看信息如下:

image.png

返回信息一模一样,我们可以通过 docker network inspect host 查看所有 host 网络模式下的容器,在 Containers 节点中可以看到容器名称。

docker network inspect host

3、none 网络模式

none 网络模式是指禁用网络功能,只有 lo 接口 local 的简写,代表 127.0.0.1,即 localhost 本地环回接口。在创建容器时通过参数 --net none 或者 --network none 指定;

none 网络模式即不为 Docker Container 创建任何的网络环境,容器内部就只能使用 loopback 网络设备,不会再有其他的网络资源。可以说 none 模式为 Docke Container 做了极少的网络设定,但是俗话说得好“少即是多”,在没有网络配置的情况下,作为 Docker 开发者,才能在这基础做其他无限多可能的网络定制开发。这也恰巧体现了 Docker 设计理念的开放。

比如基于 none 网络模式创建了一个基于 busybox 镜像构建的容器 bbox03,查看 ip addr:

docker run -it --name bbox03 --net none busybox

image.png

我们可以通过 docker network inspect none 查看所有 none 网络模式下的容器,在 Containers 节点中可以看到容器名称。

docker network inspect none

4、container 网络模式

Container 网络模式是 Docker 中一种较为特别的网络的模式。在创建容器时通过参数 --net container:已运行的容器名称|ID 或者 --network container:已运行的容器名称|ID 指定;

处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用 localhost 高效快速通信。

Container 网络模式即新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样两个容器除了网络方面相同之外,其他的如文件系统、进程列表等还是隔离的。

基于容器 bbox01 创建了 container 网络模式的容器 bbox04,查看 ip addr:

docker run -it --name bbox04 --net container:bbox01 busybox

image.png

容器 bbox01 的 ip addr 信息如下:

image.png

宿主机的 ip addr 信息如下:

image.png

通过以上测试可以发现,Docker 守护进程只创建了一对对等虚拟设备接口用于连接 bbox01 容器和宿主机,而 bbox04 容器则直接使用了 bbox01 容器的网卡信息。

这个时候如果将 bbox01 容器停止,会发现 bbox04 容器就只剩下 lo 接口了。

image.png

然后 bbox01 容器重启以后,bbox04 容器也重启一下,就又可以获取到网卡信息了。

image.png

自定义网络

虽然 Docker 提供的默认网络使用比较简单,但是为了保证各容器中应用的安全性,在实际开发中更推荐使用自定义的网络进行容器管理,以及启用容器名称到 IP 地址的自动 DNS 解析。

从 Docker 1.10 版本开始,docker daemon 实现了一个内嵌的 DNS server,使容器可以直接通过容器名称通信。方法很简单,只要在创建容器时使用 --name 为容器命名即可。

【说明】 Docker DNS 限制:只能在 user-defined 网络中使用。也就是说,默认的 bridge 网络是无法使用 DNS 的,所以我们就需要自定义网络。

通过 docker network create 命令可以创建自定义网络模式

进一步查看 docker network create 命令使用详情,发现可以通过 --driver 指定网络模式且默认是 bridge 网络模式,提示如下:

image.png

创建一个基于 bridge 网络模式的自定义网络模式 custom_network,完整命令如下:

docker network create custom_network

image.png

通过 docker network ls 查看网络模式:

docker network ls

image.png

通过自定义网络模式 custom_network 创建容器:

docker run -di --name bbox08 --net custom_network busybox

image.png

通过 docker inspect 容器名称|ID 查看容器的网络信息,在 NetworkSettings 节点中可以看到详细信息。

docker inspect  bbox08

image.png

接下来通过 docker network connect 网络名称 容器名称 为容器连接新的网络模式。

docker network connect bridge bbox08

通过 docker inspect 容器名称|ID 再次查看容器的网络信息,多增加了默认的 bridge。

image.png

通过 docker network disconnect 网络名称 容器名称 命令断开网络。

docker network disconnect custom_network bbox08

image.png

通过 docker inspect 容器名称|ID 再次查看容器的网络信息,发现只剩下默认的 bridge。

image.png

可以通过 docker network rm 网络名称 命令移除自定义网络模式,网络模式移除成功会返回网络模式名称。

docker network rm custom_network

image.png

容器间网络通信



通常,容器间的通信方式有以下三种:

  • IP通信

  • Docker DNS server

  • Joined容器


IP通信

当docker容器启动的时候,docker会默认给当前容器被分配一个随机的ip。需要分别进入两个容器,通过容器的本地host文件,查看两个容器自身的ip,再经过指定后进行互通。采用IP通信的前提是两个容器必须要属于同一个网络的网卡,但是因为部署过后再指定应用的ip很麻烦,所以ip通信方式就不再过多赘述。


Docker DNS server

Docker DNS Server 是 Docker 容器运行时环境中的一种内置 DNS 服务器。它提供容器间的域名解析服务,使得容器可以通过域名进行网络通信,而无需关注底层的 IP 地址和网络配置。

Docker DNS Server 的主要特点和工作原理如下:

(1)内置 DNS 服务器:Docker 在创建容器时会在每个容器上运行一个内置的 DNS 服务器,该服务器负责处理容器内部的域名解析请求。DNS 服务器默认监听在容器的 loopback 网络接口上。

(2)自动解析容器名:Docker DNS Server 使用容器名作为域名的一部分,因此容器可以通过使用其他容器的名称来访问对应的服务。例如,一个名为 web 的容器可以通过将其他容器的域名设置为 http://XXXXX.com 来访问该服务。

(3)容器间通信:当一个容器需要与另一个容器进行通信时,它可以使用目标容器的名称作为域名进行解析。Docker DNS Server 会将容器名解析为容器的 IP 地址,并将通信请求转发给目标容器。

(4)自动更新记录:当容器创建、销毁或重新调度时,Docker DNS Server 会自动更新容器名与 IP 地址之间的映射关系。这样可以确保容器名始终能够正确解析到对应的 IP 地址。

(5)自定义网络:Docker 允许创建自定义网络,容器可以加入特定的网络中。在自定义网络中,Docker DNS Server 会为该网络中的所有容器提供域名解析服务,使得容器可以相互之间通过容器名进行通信。


Joined容器

joined 容器可以使两个或多个容器共享一个网络栈,共享网卡和配置信息, joined 容器之间可以通过 127.0.0.1直接通信。当一个容器加入到另一个容器的命名空间中时,它可以访问和共享该容器的网络、文件系统和其他资源。这种容器间的连接方式称为容器的链接(Container Linking)。

下面是 Joined 容器的主要特点和使用方式如下:

(1)共享命名空间:Joined 容器会与目标容器共享相同的网络命名空间,这意味着它们可以直接通过本地的 localhost 地址进行通信。同时,Joined 容器还可以共享其他命名空间,如文件系统、进程等,使得它们能够访问和操作彼此的资源。

(2)便捷的通信机制:通过容器的链接,Joined 容器之间可以通过容器名称进行网络通信。这样可以简化容器间的通信配置,并且无需暴露端口给外部网络。

(3)灵活的应用部署:将容器加入到另一个容器中,可以方便地将多个容器组合成一个应用程序的部署单元。这种方式允许开发者以模块化的方式构建和管理复杂的应用程序。

看完这些介绍,接下来我们首先明确一点,容器之间要互相通信,必须要有属于同一个网络的网卡。

我们先创建两个基于默认的 bridge 网络模式的容器。

docker run -di --name default_bbox01 busybox
docker run -di --name default_bbox02 busybox

image.png

通过 docker network inspect bridge 查看两容器的具体 IP 信息。

docker network inspect bridge

image.png

然后测试两容器间是否可以进行网络通信。

docker exec -it default_bbox01 ping 172.17.0.3

image.png

经过测试,从结果得知两个属于同一个网络的容器是可以进行网络通信的,但是 IP 地址可能是不固定的,有被更改的情况发生,这时就需要用到DNS server了。

从 Docker 1.10 版本开始,docker daemon 实现了一个内嵌的 DNS server,使容器可以直接通过容器名称通信。方法很简单,只要在创建容器时使用 --name 为容器命名即可。

但是使用 Docker DNS 有个限制:只能在 user-defined 网络中使用。也就是说,默认的 bridge 网络是无法使用 DNS 的,所以我们就需要自定义网络。

先创建自定义网络。

docker network create custom_network

然后创建两个基于自定义网络模式的容器。

docker run -di --name custom_bbox02 --net custom_network busybox
docker run -di --name custom_bbox03 --net custom_network busybox

通过 docker network inspect custom_network 查看两容器的具体 IP 信息。

image.png

然后测试两容器间是否可以进行网络通信,分别使用具体 IP 和容器名称进行网络通信。

docker exec -it custom_bbox02 ping 172.19.0.3

image.png

docker exec -it custom_bbox02 ping custom_bbox03

image.png

经过测试,从结果得知两个属于同一个自定义网络的容器是可以进行网络通信的,并且可以使用容器名称进行网络通信。

那如果此时希望 bridge 网络下的容器可以和 custom_network 网络下的容器进行网络又该如何操作?那就让 bridge 网络下的容器连接至新的 custom_network 网络即可。

docker network connect custom_network default_bbox01

至于最后提到的通过joined 容器通信就是一种基于容器网络(Container Network)实现的方式。通过加入容器的方式,我们可以轻松地实现容器间的通信,而无需依赖外部的网络设备或服务。这种方式适用于需要实现容器间紧密耦合的应用场景,例如一个容器用作数据库服务,另一个容器用作应用程序服务,它们之间需要进行数据交互和通信。

joined 容器可以使两个或多个容器共享一个网络栈,共享网卡和配置信息,joined容器之间可以通过 127.0.0.1直接通信。

创建一个 httpd 容器,名字为 web1

docker run -d -it --name=web1  httpd

image.png

创建一个busybox 容器并通过--network=container:web1指定joined 容器为web1。

docker run -it  --network=container:web1 busybox

image.png

在busybox容器中用 ip a命令查看网络配置信息,然后用命令exit退出。

image.png

进入web1容器:

docker exec -it web1 /bin/bash

image.png

查看web1的网络配置信息,可以看到这里web1容器 和busybox容器的网卡 mac 地址、IP 完全一样,它们共享了相同的网络栈。

image.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

12个VIM编辑器的高级玩法

vim 是一个很好用的编辑器,应用十分广泛。但关于 vim,总有一些你不知道的事情,我们需要持续不断的学习。 我经常使用 vim,也经常在各大社区、论坛看到 vim 专家用户分享经验,今天我们就总结其中常用的一部分&#xff…

语音识别whisper的介绍、安装、错误记录

介绍 Whisper是OpenAI于2022年9月份开源的通用的语音识别模型。它是在各种音频的大型数据集上训练的模型,也是一个可以执行多语言语音识别、语音翻译和语言识别的多任务模型。 论文链接:https://arxiv.org/abs/2212.04356 github链接:https:…

4d动感影院座椅5d动感影院体验馆大型7D互动影院

今天来讲一下市场上现在受欢迎的5d7d影院,组成部分,落地方案 5D影院的系统组成部分:1、动感座椅、2、投影幕(银幕)和投影机、3、音箱、4、各种的动感特效、5、5d影院眼镜,很简单的组成硬件,就可以组成一套的5d影院设备…

Windows工业三防平板全功能NFC近距离感应一维/二维扫描

Windows系统工业三防平板电脑是一种在智慧工厂仓储物流、MES数采、车载设备、设备检测、自动化控制等领域广泛应用的先进设备。此外,它还在公共服务领域,如高速交通、物流运输、电力检测、公务执法、银行金融、船舶装备、户外勘测、建筑工程、汽车检测、…

细说晶振元件HC49U的功能、应用及性能特点 | 百能云芯

在电子领域,晶振(Crystal Oscillator)是一种重要的元件,用于产生稳定的时钟信号。HC49U是一种常见的晶振型号,具有广泛的应用范围。云芯将带您深入探讨HC49U晶振的功能、应用领域,以及其性能特点&#xff0…

【算法-回溯法】N皇后问题

一、问题背景 N皇后问题是由八皇后问题引申而来的。八皇后是一个以国际象棋为背景的问题,国际象棋8*8. 怎么去放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜…

每日汇评:黄金的回调可能会在周五上涨3%之后延续

在连续两天的积极势头下,金价正挑战1880美元的关键水平; 美元跟随美债收益率走低,美联储持谨慎态度,情绪乐观; 黄金价格正处于关键时刻,等待美国通胀数据带来新的方向性走势; 金价正在回撤上周五…

C# OpenCvSharp 利用Lab空间把春天的场景改为秋天

效果 项目 代码 using OpenCvSharp; using System; using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.Windows.Forms;namespace OpenCvSharp_Demo {public partial class Form1 : Form{public Form1(){InitializeComponent();}st…

安捷伦N8974A分析仪

安捷伦N8974A分析仪 N8974A 是 Agilent 的二手分析仪。分析仪是测试工程、医疗、汽车和技术行业电子设备的关键工具。使用分析仪来监控许多不同类型的电子设备的性能。您可能需要分析仪来测量音频频谱、电压和电流、信号和频率等分量 频率范围:10 MHz 至 6.7 GHz 一…

前端代码优化之从系统区分处理的业务场景看如何优化代码中的if判断

最近有个三端统一的技术场景,主要是以前移动端的 hybrid 网页在不考虑 UI 适配的情况下、期望能够直接在 PC 客户端投放。在评估修改面的时候发现了一段可以深思的代码: if (platform iphone) {location.href iphoneClientUrl; } else {location.href…

白皮书 |得帆云低代码aPaaS X OA全新解决方案,解锁数字化协作新境界

进入正题之前,我们先看两个大厂案例: 10年IBM Lotes OA迁移 -来自国内500强发动机全链路制造公司 主要有如下几个痛点: 系统老旧,扩展性一般,无法集成现有的其他业务系统 随着人员的增加,经常性的出现卡…

linux U盘无法使用,提示“Partition table entries are not in disk order“

问题: U盘在Windows上使用正常,在linux下无法使用fdisk -l 命令提示:Partition table entries are not in disk order $ fdisk -l Disk /dev/sdb: 525 MB, 525336576 bytes 17 heads, 59 sectors/track, 1022 cylinders Units cyl…

ArkTS及openHarmony

补充 padding:内边距,也就是盒子边和盒子内部的距离 margin:外边距,也就是盒子和盒子的距离 openHarmony应用开发及UI界面 常用布局 Row 水平线性布局核心代码 子控件会共享同一行,也就是都在同一行内 Preview C…

扩展市场版图,美格智能5G智能模组SRM955集齐全球主流认证

AIoT时代来临,掀起新一轮智能化终端设备的变革,激发应用领域的新需求。AI等新兴技术应用,成为拉动智能终端产品变革和市场变迁的主要力量。智能模组是AIoT时代中的核心元器件,是实现万物智联的关键。 美格智能作为智能模组的创领…

SpringBoot学习日记

Spring程序与SpringBoot程序对比 SpringBoot程序优点 起步依赖(简化依赖配置)自动装配(简化常用工程相关配置)辅助功能(内置服务器,......) 内嵌Tomcat REST风格 REST简介 REST,表…

2023年主题教育专题组织生活会对照检查材料六个方面发言材料

组织生活会发言材料,很多人还没写完,可能写着写着就不知道怎么继续了,其实写这类材料需要有一个好的写作框架,结合我们的实际情况来写。 只有那些勇敢面对困难的人,才能找到成功的道路。生活并非总是一帆风顺&#xff…

ant design pro v6如何引入第三方js?如腾讯地图等!

由于ant pro隐藏.html,需要通过他们约定的方式引入即可。 1.配置config文件 /config/config.tsheadScripts: [// 解决首次加载时白屏的问题{ src: /scripts/loading.js, async: true },{ src: "https://map.qq.com/api/gljs?v1.exp&keyOB4BZ-D4W3U-B7VV…

CountDownLatch的原理

使用CountDownLatch可以实现等待多个线程执行完毕的功能,实现线程之间的协调,让它们按照我们期望的顺序执行,从而避免了可能出现的并发问题。 CountDownLatch是如何实现主线程等待子线程全部结束的呢? 代码用例 这里我们使用一段…

【TES720D】青翼科技基于复旦微的FMQL20S400全国产化ARM核心模块

板卡概述 TES720D是一款基于上海复旦微电子FMQL20S400的全国产化核心模块。该核心模块将复旦微的FMQL20S400(兼容FMQL10S400)的最小系统集成在了一个50*70mm的核心板上,可以作为一个核心模块,进行功能性扩展,特别是用…