Docker-一文详解容器通信的基础网络模式及衍生的自定义网络模式

news2024/11/14 14:55:27

启动容器时,通过-p 宿主机端口:容器端口,就可以通过访问宿主机端口访问到容器,这种原理机制是啥,有没有其它方式可以让宿主机和容器通信,以及容器与容器之间如何通信。带着这几个问题开始学习Docker的网络知识。

文章目录

  • 容器通信必备网络知识
    • Linux的network namespace网络命名空间
    • veth虚拟以太网卡
    • 虚拟以太网桥
  • Docker容器默认三种基础网络模式
    • bridge模式
      • bridge模式通信机制
      • bridge模式基础操作
        • 创建容器指定bridge模式
        • 查看容器的ip地址和网关信息
        • 查询所有bridge模式下的容器
    • host网络模式
      • host模式通信机制
      • host模式基础操作
        • 创建容器指定host模式
        • 查看host网络模式下容器
    • none网络模式
      • none模式通信机制
      • none网络基础操作
        • 创建容器指定none网络模式
        • 查询none网络模式下的容器
  • Container网络模式
    • Container模式通信机制
    • Container模式基础操作
      • 容器启动时指定使用另一个容器的网络
  • 自定义网络模式
    • 自定义网络机制
    • Docker-自定义网络基础操作
      • 创建自定义网络
      • 创建容器指定自定义网络
      • 新增连接网络
      • 断开网络
      • 移除网络
  • 总结

容器通信必备网络知识

Linux的network namespace网络命名空间

linux的内核namespacesj 它在Linux内核2.6版本引入,作用是隔离Linux系统的设备,以及IP地址、端口、路由表、防火墙规则等网络资源。因此,每个网络namespace里都有自己的网络设备(如IP地址、路由表、端口范围、/proc/net目录等)

这么做的好处就是隔离,直观的例子就是由于每个容器都有自己的(虚拟)网络设备,并且容器里的进程可以放心地绑定在端口上而不必担心冲突,这就使得在一个主机上同时运行多个监听80端口的Web服务器变为可能,如下图:
在这里插入图片描述

veth虚拟以太网卡

是虚拟以太网卡[Virtual Ethernet]缩写,veth设备总是成对的,因此我们称之为veth pairveth pair一端发送的数据会在另外一端接收,是双向通道。根据这一特性,veth pair常被用于跨network namespace之间的通信,即分别将veth pair的两端放在不同的namespace里

在这里插入图片描述

虚拟以太网桥

两个network namespac可以通过veth pair连接,但是要做到两个以上network namespace相互连接,veth pair就显得捉襟见肘。它正如字面意思描述的那样,有牵线搭桥的意思,用于连接网络设备,它是一台虚拟的网络交换机,任意物理设备比如veth0和虚拟设备(比如降到的veth pair)都可以连接到这个设备上。

在这里插入图片描述

Docker容器默认三种基础网络模式

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

apple@bogon ~ % docker network ls

NETWORK ID     NAME      DRIVER    SCOPE
c38043cc6113   bridge    bridge    local
b15c29da9f0f   host      host      local
c22f88bafff0   none      null      local

接下来我们讲解这三种网络的基本使用和原理

bridge模式

bridge模式通信机制

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

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

  1. Docker Daemon 利用 veth pair 技术,在宿主机上创建一对对等虚拟网络接口设备,假设为 veth0 和 veth1。而 veth pair 技术的特性可以保证无论哪一个 veth 接收到网络报文,都会将报文传输给另一方
  2. Docker Daemon 将 veth0 附加到 Docker Daemon 创建的 docker0 网桥上。保证宿主机的网络报文可以发往 veth0
  3. Docker Daemon 将 veth1 添加到 Docker Container 所属的 namespace 下,并被改名为 eth0。如此一来,宿主机的网络报文若发往 veth0,则立即会被 Container 的 eth0 接收,实现宿主机到 Docker Container 网络的联通性;同时,也保证 Docker Container 单独使用 eth0,实现容器网络环境的隔离性

未启动任何容器前,先通过指令ip addr 查询出目前所有的网卡接口,目前有三个网卡接口,分别是

  • docker0虚拟以太网桥
  • enX0表示宿主机物理网卡接口
  • lo是本地回环地址,有这个可以使用127.0.0.1连接本地
    在这里插入图片描述
    启动mysql容器
sudo docker run -di --name mysql01 -e MYSQL_ROOT_PASSWORD=root -d mysql

宿主机上执行ip addr多了一个网卡接口veth3ff2d31,这个就是mysql容器启动后docker通过linux的veth pair技术创建的成对的网卡接口,宿主机的网卡接口是veth3ff2d31,容器的网卡接口veth0。
在这里插入图片描述
登陆上容器上sudo docker exec -it mysql01 /bin/bash,可以在容器/sys/class/net路径下看到网卡eth0,lo可以忽略,它是本地回环接口,有它可以ping通127.0.0.1
在这里插入图片描述
其中27:veth3ff2d31@if26其中27和26成对出现,可以在目标容器中通过cat /sys/class/net/eth0/ifindex知道容器网卡的veth0的ifindex是26,执行/sys/class/net/eth0/iflink知道网卡配对的一端ifindex是27
在这里插入图片描述
退出容器后,在宿主机上通过cat /sys/class/net/veth3ff2d31/ifindex知道网卡veth3ff2d31的ifindex是27,执行/sys/class/net/veth3ff2d31/iflink知道veth3ff2d31网卡配对的一端ifindex是26
在这里插入图片描述

bridge模式基础操作

创建容器指定bridge模式

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

# 1.启动mysql,不添加--net bridge,默认是bridge
sudo docker run -di --name mysql01 -e MYSQL_ROOT_PASSWORD=root -d mysql

# 2.启动mysql,不添加--net bridge,默认是bridge
sudo docker run --net bridge -di --name mysql01 -e MYSQL_ROOT_PASSWORD=root -d mysql
查看容器的ip地址和网关信息

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

查询所有bridge模式下的容器

通过 docker network inspect bridge 查看所有 bridge 网络模式下的容器,在 Containers 节点中可以看到容器名称。
在这里插入图片描述

host网络模式

host模式通信机制

采用 host 网络模式的 Docker Container,可以直接使用宿主机的 IP 地址与外界进行通信,若宿主机的 eth0 是一个公有 IP,那么容器也拥有这个公有 IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行 NAT 转换;
host 网络模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性
在这里插入图片描述

host模式基础操作

创建容器指定host模式

host 网络模式需要在创建容器时通过参数 --net host 或者 --network host 指定,例如:启动mysql使用host模式

# 启动mysql容器
sudo docker run  --name mysql02 -it  --net host -e MYSQL_ROOT_PASSWORD=root -d mysql

然后宿主机通过ip addr查看信息如下:只有lo,exX0,docker0,没有新建任何网卡接口
在这里插入图片描述

查看host网络模式下容器

可以通过 docker network inspect host查看所有 host 网络模式下的容器,在 Containers 节点中可以看到容器名称
在这里插入图片描述

none网络模式

none模式通信机制

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

none网络基础操作

创建容器指定none网络模式

在创建容器时通过参数 --net none 或者 --network none 指定;
启动mysql容器指定none网络模式

sudo docker run  --name mysql03 -it  --net none -e MYSQL_ROOT_PASSWORD=root -d mysql
查询none网络模式下的容器

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

Container网络模式

Container模式通信机制

Container 网络模式是 Docker 中一种较为特别的网络的模式。在创建容器时通过参数--net container:已运行的容器名称|ID或者 --network container:已运行的容器名称|ID 指定;
处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用 localhost 高效快速通信
在这里插入图片描述

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

Container模式基础操作

容器启动时指定使用另一个容器的网络

自定义网络模式

自定义网络机制

虽然 Docker 提供的默认网络使用比较简单,但是为了保证各容器中应用的安全性,在实际开发中更推荐使用自定义的网络进行容器管理,以及启用容器名称到 IP 地址的自动 DNS 解析
从 Docker 1.10 版本开始,docker daemon 实现了一个内嵌的 DNS server,使容器可以直接通过容器名称通信。方法很简单,只要在创建容器时使用 --name 为容器命名即可。
但是使用 Docker DNS 有个限制:只能在user-defined网络中使用。也就是说,默认的 bridge 网络是无法使用 DNS 的,所以我们就需要自定义网络

简而言之就是自定义网络是基于前文提到的bridge,none,host模式创建,并且拥有了通过网络名称通信的特征

Docker-自定义网络基础操作

创建自定义网络

通过 docker network create 命令可以创建自定义网络模式
docker network create 命令使用详情,发现可以通过 --driver 指定网络模式,网络模式只有三种是前文提到的bridge,host,none模式,默认是 bridge 网络模式,提示如下:
在这里插入图片描述
创建一个基于 bridge 网络模式的自定义网络模式 cyl_network,完整命令如下:

sudo docker network create cyl_network

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

创建容器指定自定义网络

sudo docker run -di --name bbox05 --net custom_network busybox

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

新增连接网络

通过 docker network connect 网络名称 容器名称 为容器连接新的网络模式。
在这里插入图片描述
执行以下指令,可以为容器bbox05新增bridge网络

sudo docker network connect bridge bbox05

断开网络

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

sudo docker network disconnect cyl_network bbox05

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

移除网络

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

sudo docker network rm cyl_network

再次执行sudo docker network ls发现cyl_network已经移除

注意:如果通过某个自定义网络模式创建了容器,则该网络模式无法删除。

总结

上文讲解了docker默认的三种网络模式bridge、host、none的通信机制和基本操作,再此基础上又延伸了container网络模式和自定义网络,这五种网络模式原理总结如下:

网络模式原理隔离性
bridge为每一个容器分配、设置 IP 等,并将容器连接到一个 docker0 虚拟网桥,默认为该模式
host容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口
none容器有独立的 Network namespace,但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接,IP 等无网络
container新创建的容器不会创建自己的网卡和配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等跟随指定容器的网络模式而定,若指定容器是bridge则高,host则低
自定义网络只有自定义网络,才启用容器名称到 IP 地址的自动 DNS 解析,才能通过容器名称进行网络通信根据指定的模式而定

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

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

相关文章

浅谈路由器转发数据包

当路由器转发数据包时,它会经历一系列步骤,包括接收数据包、路由表查询、以及转发数据包。以下是详细的步骤描述: 1. 接收数据包 以太网帧到达端口:当一个以太网帧到达路由器的某个网络接口(端口)时&#…

STL库--stack

目录 stack的定义 stack容器内元素的访问 stack常用函数实例解析 stack的常见用途 stack的定义 其定义的写法和其他STL容器相同&#xff0c;typename可以任意基本类型或容器&#xff1a; stack<typename> name; stack容器内元素的访问 由于栈本身就是一种后进先出…

成都欣丰洪泰文化传媒有限公司助力品牌快速崛起

在当今数字化浪潮汹涌的时代&#xff0c;电商行业作为新经济的代表&#xff0c;正以其独特的魅力和无限的潜力&#xff0c;引领着商业模式的创新与变革。在这个充满机遇与挑战的领域里&#xff0c;成都欣丰洪泰文化传媒有限公司凭借其专业的电商服务能力和前瞻性的战略眼光&…

【Python】解决Python报错:TypeError: ‘int‘ object is not iterable

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

[测试开发]如何让IDEA实时显示内存

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

GoFly框架快速新增接口/上手写代码

拿到一个新框架大家可能无从下手&#xff0c;因为你对框架设计思路、结构不了解&#xff0c;从而产生恐惧&#xff0c;所以我们框架是通过简单可视化界面安装&#xff0c;安装后即可看到效果&#xff0c;然后点击先点点看各个功能&#xff0c;看现有的功能是怎么写的&#xff0…

[双指针] --- 快乐数 盛最多水的容器

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 算法Journey 本篇博客我们分享一下双指针算法中的快慢指针以及对撞双指针&#xff0c;下面我们开始今天的学习吧~ &#x1f3e0; 快乐数 &#x1f4d2; 题…

如何让你的网站能通过域名访问

背景 当我们租一台云服务器&#xff0c;并在上面运行了一个Web服务&#xff0c;我们可以使用云服务器的公网IP地址进行访问&#xff0c;如下&#xff1a; 本文主要记录如何 实现让自己的网站可以通过域名访问。 买域名 可以登录腾讯云等主流公有云平台的&#xff0c;购买域名…

【保姆级介绍下Foxmail 邮箱】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

精选10款手机必备精品APP,每一款都不容错过!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ ​1.二维码而设计的应用程序——二维码设计 二维码设计 App 是一款专为用户创建和定制二维码而设计的应用程序。该应用适用于iOS和Android平台…

QT截图程序,可多屏幕截图二,增加调整截图区域功能

上一篇QT截图程序&#xff0c;可多屏幕截图只是实现了最基本的截图功能&#xff0c;虽然能用但是缺点也有&#xff0c;没办法更改选中的区域&#xff0c;这在实际使用时不太方便。这篇增加了这个功能。先看看效果。 实现代码为&#xff1a; 头文件 #ifndef MASKWIDGET_H #de…

IEEE Latex模版踩雷避坑指南

参考文献 原Latex模版 \begin{thebibliography}{1} \bibliographystyle{IEEEtran}\bibitem{ref1} {\it{Mathematics Into Type}}. American Mathematical Society. [Online]. Available: https://www.ams.org/arc/styleguide/mit-2.pdf\bibitem{ref2} T. W. Chaundy, P. R. Ba…

价值飙升30%,AI PC拉动半导体出货潮

由于处理器和DRAM的升级&#xff0c;大摩预测每台AI PC的半导体价值将增长20%-30%&#xff0c;PC平均售价也将提高7%。 台北国际电脑展即将于6月2日隆重开幕。 随着展会的临近&#xff0c;各种现象级的AI PC也蓄势待发。 就在上周&#xff0c;联想在业绩会上&#xff0c;首次…

2024 五月份国内外CTF 散装re 部分wp

cr3CTF warmup 附件拖入ida main函数无法反汇编&#xff0c;仔细看&#xff0c;有花指令&#xff0c;jnz实际上必定跳转。有非常多处&#xff0c;可以写脚本patch程序去掉花指令&#xff0c;只要匹配指令&#xff0c;再获取跳转地址&#xff0c;nop掉中间的代码就行。但…

HAL库使用FreeRTOS实时操作系统时配置时基源(TimeBase Source)

需要另外的定时器&#xff0c;用systic的时候生成项目会有警告 https://blog.51cto.com/u_16213579/10967728

车载客流统计设备:双目3D还原智能统计算法的应用与优势

随着城市交通的日益繁忙和公共交通系统的不断完善&#xff0c;对公交车等交通工具的客流统计和分析变得越来越重要。传统的客流统计方法往往存在效率低下、精度不足等问题&#xff0c;难以满足现代城市交通管理的需求。而基于双目3D还原智能统计算法的车载客流统计设备&#xf…

开源一个工厂常用的LIMS系统

Senaite是一款强大且可靠的基于Web的LIMS/LIS系统&#xff0c;采用Python编写&#xff0c;构建在Plone CMS基础架构之上。该系统处于积极开发阶段&#xff0c;在灵活的定制空间中为开发人员提供了丰富的功能。其中&#xff0c;Senaite在处理REST的JSON API上做得出色&#xff0…

【busybox记录】【shell指令】readlink

目录 内容来源&#xff1a; 【GUN】【readlink】指令介绍 【busybox】【readlink】指令介绍 【linux】【readlink】指令介绍 使用示例&#xff1a; 打印符号链接或规范文件名的值 - 默认输出 打印符号链接或规范文件名的值 - 打印规范文件的全路径 打印符号链接或规范文…

如何更改SSH服务器端口以减少蛮力攻击

本周有一个客户&#xff0c;购买Hostease的独立服务器&#xff0c;询问我们的在线客服&#xff0c;如何更改SSH服务器端口以减少蛮力攻击&#xff1f;我们为用户提供相关教程&#xff0c;用户很快解决了遇到的问题。在此&#xff0c;我们分享这个操作教程&#xff0c;希望可以对…

Element-UI 入门指南:从安装到自定义主题的详细教程

Element-UI 是一个基于 Vue.js 的前端组件库&#xff0c;它提供了丰富的 UI 组件&#xff0c;可以帮助开发者快速构建高质量的用户界面。以下是使用 Element-UI 的快速入门指南&#xff1a; 安装 Element-UI Element-UI 是一个基于 Vue.js 的组件库&#xff0c;它提供了丰富的…