【Docke笔记】Docker网络模式与容器间通信

2023-10-08 10:20

本文主要是介绍【Docke笔记】Docker网络模式与容器间通信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本篇主要是Docker网络模式与容器间通信。
上一篇:【Docker基础篇】Docker核心概念与指令

文章目录

  • 一、预备知识点
  • 二、Docker网络模式
    • 1、查看Docker网络模式
    • 2、bridge网络模式
      • - 原理
      • - 实现
      • - 图解
    • 3、host网络模式
      • - 原理
      • - 实现
      • - 图解
    • 4、none网络模式
      • - 原理:
      • - 实现:
    • 5、container 网络模式
      • - 原理:
      • - 实现:
      • - 图解:
  • 三、自定义网络
    • 1、用自定义网络实现容器互连
    • 2、网络的连接、断开与移除
    • 3、DNS

在这里插入图片描述

一、预备知识点

了解Docker网络模式前,先准备点计算机网络。

1、Veth:
Veth是Linux中一种虚拟出来的网络设备,veth设备总是成对出现,所以一般也叫veth-pair。veth模拟了在物理世界里的两块网卡,以及一条网线。通过它可以将两个虚拟的设备连接起来,让他们之间相互通信。

在这里插入图片描述
如:v-a和v-b是一对veth设备,v-a收到的数据会从v-b发出。相反,v-b收到的数据会从v-a发出。Veth就像一根网线。
在这里插入图片描述
Veth设备的特点:

  • veth和其它的网络设备都一样,一端连接的是内核协议栈
  • veth设备是成对出现的,另一端两个设备彼此相连
  • 一个设备收到协议栈的数据发送请求后,会将数据发送到另一个设备上去
    在这里插入图片描述

veth的2头都直接连着网络协议栈,所以创建一个veth对,主机上就会多2个网卡。
在这里插入图片描述
veth的实现和底层理解参考这里。

2、eth0:
ethernet的简写,以太网接口与网卡对应,每个硬件网卡(一个MAC)对应一个以太网接口,其工作完全由网卡相应的驱动程序控制。

如果物理网卡只有一个,而却有eth1,eth2等,则可能存在无线网卡或多个虚拟网卡,虚拟网卡由系统创建或通过应用层程序创建,作用与物理网卡类似。
在这里插入图片描述

3、网卡和网桥
在这里插入图片描述

参考这里。

二、Docker网络模式

1、查看Docker网络模式

docker network ps

安装 Docker 以后,会默认创建三种网络:bridge、host、none
在这里插入图片描述

网络模式特点
bridge为每个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,默认为bridge模式
host容器将不会虚拟出自己的网卡,也不会配置自己的IP,而是使用宿主机的IP和端口
none容器有独立的Network namespace ,但并没有对其进行任何网络设置,如分配veth和网桥连接、IP等
container新创建的容器不会创建自己的网卡、配置自己的IP,而是和一个指定的容器共享IP、端口范围等

2、bridge网络模式

- 原理

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

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

- 实现

首先以busybox为镜像创建容器net01(BusyBox 是一个集成了三百多个最常用Linux命令和工具的软件)

docker run -it --name net01 busybox

ip addr查看信息:
在这里插入图片描述
查看宿主机的ip addr信息:
在这里插入图片描述

可以看到:
守护进程创建的一对对等虚拟设备接口 veth pair,将其中一个接口设置为容器的 eth0 接口(容器的网卡),另一个接口放置在宿主机的命名空间中,即图中的veth7353413

同时,守护进程还会从网桥 docker0 的私有地址空间中分配一个 IP 地址和子网给该容器,并设置 docker0 的 IP 地址为容器的默认网关。

查看网桥信息
brctl show
#指令安装:
yum install -y bridge-utils

在这里插入图片描述
容器的IP地址和Gateway信息,可以docker inspect在NetworkSettings中查看

docker inspect 容器名 |grep  -i NetworkSettings -A 50|grep -Ei "Gateway|IPAddress

在这里插入图片描述
查看bridge网络模式下的所有容器信息:

docker network inspect bridge

在这里插入图片描述
因bridge是创建容器时默认使用的网络模式,所以docker run时不用加–net 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,实现容器网络环境的隔离性。

3、host网络模式

- 原理

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

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

- 实现

创建host网络模式的容器net02,注意这时要加–net host指定模式:

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

ip addr查看信息,和宿主机的ip addr信息完全一致

在这里插入图片描述
再查看host网络模式下的所有容器信息,可以看到net02容器

docker network inspect host

在这里插入图片描述

- 图解

在这里插入图片描述

4、none网络模式

- 原理:

none 网络模式是指禁用网络功能,只有 lo 接口。

none 网络模式即不为 Docker Container 创建任何的网络环境,容器内部就只能使用 loopback 网络设备,不会再有其他的网络资源。

lo,即locate,lo其实是一个系统虚拟的环回接口,它的IP地址是127.0.0.1,利用这个接口可以实现系统内部(一个本地进程为另一个本地进程)发送和接收数据。

- 实现:

–net none指定容器网络模式,创建net03容器

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

在这里插入图片描述
docker network inspect none 查看所有 none 网络模式下的容器:
在这里插入图片描述

5、container 网络模式

- 原理:

创建容器时通过参数 --net container:容器名称或ID。Container 网络模式即新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等

处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用 localhost 高效快速通信,两个容器除了网络方面相同之外,其他的如文件系统、进程列表等还是隔离的

- 实现:

基于容器net01创建container网络模式的容器net04

docker run -it --name net04 --net container:net01 busybox

查看net04和net01的addr信息:
在这里插入图片描述
可以看到,容器net04直接使用了net01的网卡信息。此时,stop容器net01,容器net04就只剩下lo接口了:
在这里插入图片描述
接下来重启net01,再重启net04,可以看到网卡信息恢复正常了:
在这里插入图片描述

- 图解:

在这里插入图片描述


三、自定义网络

考虑到安全性问题,实际开发中,我们常使用自定义网络来进行容器间的通信。

从 Docker 1.10 版本开始,docker daemon 实现了一个内嵌的 DNS server,使容器可以直接通过容器名称(run的时候用–name指定)通信。但是使用 Docker DNS 有个限制:只能在 user-defined 网络中使用,即自定义网络,而不是安装Docker后自带的三个网络。

1、用自定义网络实现容器互连

第一步:新建网络,起名test–net

docker network create -d bridge test--net

参数:

  • -d:参数指定 Docker 网络类型,即–driver
  • 更多参数可docker network create --help查看

在这里插入图片描述


第二步:运行一个容器并连接到新建自定义网络 test–net

docker run -it --name net05 --net test--net busybox

docker inspect 查看容器的网络信息,在NetworkSettings中:
在这里插入图片描述


第三步:再创建一个容器,并连接到新建自定义网络 test–net,并ping上一步中创建的容器
在这里插入图片描述
当然,ping容器的Name和IP地址都可以,操作如下图:
在这里插入图片描述

可以看到容器net05和net06成功建立了互连关系!

2、网络的连接、断开与移除

  • 连接网络
docker network connect 网络名称 容器名称 

docker inspect 查看网络信息可以看到多了一个默认的bridge:
在这里插入图片描述

  • 断开网络
docker network disconnect 网络名称 容器名称

断开net05新增的bridge网络,再docker inspect 查看容器网络信息,只剩一个test–net网络了:
在这里插入图片描述

  • 移除网络
docker network rm 网络名称

删除某自定义网络,但当通过该自定义网络创建了容器,则该网络无法删除。

3、DNS

最后,关于DNS,可在宿主机的/etc/docker/daemon.json文件中来增加以下内容来设置全部容器的DNS:

{"dns" : ["114.114.114.114","8.8.8.8"]
}

设置后,启动容器的 DNS 会自动配置为 114.114.114.114 和 8.8.8.8.8。配置完成后,需要重启docker才能生效,重启所有docker直接systemctl restart docker


systemtl系列指令功能强大,了解更多可跳这里here。

这篇关于【Docke笔记】Docker网络模式与容器间通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/llg___/article/details/125674137
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/164601

相关文章

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

Linux网络配置之网桥和虚拟网络的配置指南

《Linux网络配置之网桥和虚拟网络的配置指南》这篇文章主要为大家详细介绍了Linux中配置网桥和虚拟网络的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、网桥的配置在linux系统中配置一个新的网桥主要涉及以下几个步骤:1.为yum仓库做准备,安装组件epel-re

SQL Server身份验证模式步骤和示例代码

《SQLServer身份验证模式步骤和示例代码》SQLServer是一个广泛使用的关系数据库管理系统,通常使用两种身份验证模式:Windows身份验证和SQLServer身份验证,本文将详细介绍身份... 目录身份验证方式的概念更改身份验证方式的步骤方法一:使用SQL Server Management S

python如何下载网络文件到本地指定文件夹

《python如何下载网络文件到本地指定文件夹》这篇文章主要为大家详细介绍了python如何实现下载网络文件到本地指定文件夹,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...  在python中下载文件到本地指定文件夹可以通过以下步骤实现,使用requests库处理HTTP请求,并结合o

ubuntu如何部署Dify以及安装Docker? Dify安装部署指南

《ubuntu如何部署Dify以及安装Docker?Dify安装部署指南》Dify是一个开源的大模型应用开发平台,允许用户快速构建和部署基于大语言模型的应用,ubuntu如何部署Dify呢?详细请... Dify是个不错的开源LLM应用开发平台,提供从 Agent 构建到 AI workflow 编排、RA

Docker安装MySQL镜像的详细步骤(适合新手小白)

《Docker安装MySQL镜像的详细步骤(适合新手小白)》本文详细介绍了如何在Ubuntu环境下使用Docker安装MySQL5.7版本,包括从官网拉取镜像、配置MySQL容器、设置权限及内网部署,... 目录前言安装1.访问docker镜像仓库官网2.找到对应的版本,复制右侧的命令即可3.查看镜像4.启

Linux高并发场景下的网络参数调优实战指南

《Linux高并发场景下的网络参数调优实战指南》在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃,本文基于真实案例分析,从参数解读、问题诊断到优... 目录一、问题背景:当并发连接遇上性能瓶颈1.1 案例环境1.2 初始参数分析二、深度诊断:连接状态与

debian12安装docker的实现步骤

《debian12安装docker的实现步骤》本文主要介绍了debian12安装docker的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录步骤 1:更新你的系统步骤 2:安装依赖项步骤 3:添加 docker 的官方 GPG 密钥步骤

SpringIOC容器Bean初始化和销毁回调方式

《SpringIOC容器Bean初始化和销毁回调方式》:本文主要介绍SpringIOC容器Bean初始化和销毁回调方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录前言1.@Bean指定初始化和销毁方法2.实现接口3.使用jsR250总结前言Spring Bea

Redis高可用-主从复制、哨兵模式与集群模式详解

《Redis高可用-主从复制、哨兵模式与集群模式详解》:本文主要介绍Redis高可用-主从复制、哨兵模式与集群模式的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录Redis高可用-主从复制、哨兵模式与集群模式概要一、主从复制(Master-Slave Repli