07. Docker网络通信模式

news2024/9/23 21:23:21

目录

1、前言

2、基本原理

3、Docker网络配置

3.1、查看网络配置

3.2、4种网络模式

3.3、bridge模式

3.3.1、使用bridge网络

3.3.2、自定义bridge网络

3.4、host模式

3.5、container模式

3.6、none模式

4、小结


1、前言

前面我们介绍了Docker容器的相关内容,Docker 的容器运行在宿主机的虚拟机上。这些虚拟机彼此独立,彼此之间没有任何接口,即容器彼此之间是逻辑隔离的。那么,如何实现容器的相互通信?这个就是我们今天要讲的内容。

2、基本原理

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

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

3、Docker网络配置

3.1、查看网络配置

我们可以通过以下命令查看Docker的网络配置信息。

docker network

通过以下命令可以查看Docker的几种网络通信模式。

docker network ls

0

可以看到有3中模式:bridge,host,none。而默认情况下为bridge。

我们随便启一个docker容器,容器名称为myapp,且不指定任何网络模式:

docker run -d -p 18080:8899  myapp

0

启动成功后,我们查看网络Bridge的详情:

docker network inspect bridge

可以看到Container里面包含了我们的myapp容器,这说明我们刚启动的myapp容器默认使用的就是bridge网络模式。

0

而默认的子网地址是“172.17.0.0/16”。容器IP为172.17.0.2,是属于bridge网络的子网络。

3.2、4种网络模式

Docker一共提供了4种网络通信模式: bridge、container、host 和 none。通过上述的docker network ls看到的bridge,host,none以外,还有container模式。

模式

是否支持多主机

纵向通信机制

横向通信机制

bridge

绑定宿主机端口

通过 Linux 桥接进行通信

container

绑定宿主机端口

通过 Linux 连接进行通信

host

通过宿主机网络进行通信

通过宿主机网络进行通信

none

无法通信

只能通过 Linux 连接进行通信

由于 Docker 容器彼此之间是逻隔离的,所以,在安装 Docker 时会在容器中创建隔离的网络环境。在隔离的网络模式环境中,运行在宿主机上的各个容器具有完全独立的网络栈,并且Docker 容器的网络环境与宿主机相互隔离。通过使用 Docker 的不同网络模式,可以使 Docker容器共享宿主机的网络命名空间,也可以实现 Docker 容器间的相互访问。

3.3、bridge模式

前面提到了bridge模式是 Docker 默认的网络通信模式,也是开发者最常用的模式。在 bridge 模式下,Docker引擎会创建独立的网络命名空间。这样就可以保证运行在每一个命名空间中的容器具有独立的网卡等网络资源。

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

简单实验一下:

3.3.1、使用bridge网络

创建一个busybox镜像的容器。

BusyBox 是一个集成了三百多个最常用Linux命令和工具的软件。BusyBox 包含了一些简单的工具,例如ls、cat和echo等等,还包含了一些更大、更复杂的工具,例grep、find、mount以及telnet。

docker run -it busybox /bin/sh

使用ifconfig查看网络信息:

可以看到容器的内网ip为172.17.0.3。

3.3.2、自定义bridge网络

默认情况下,docker引擎会自动创建一个bridge网络。但是通常生产环境种,我们都会自定义一个bridge网络,当然docker也是支持我们自定义的。

1)创建一个自定义的bridge网络。

创建一个名为mybridge的网络模式,网关ip为172.19.0.1,子网IP范围是172.19.0.0/24。

docker network create -d bridge  --ip-range=172.19.0.0/24 --gateway=172.19.0.1 --subnet=172.19.0.0/24 mybridge
  • -d:指定网络通信模式,默认是bridge。
  • --ip-range:子网IP地址范围。
  • --gateway:网关的IP地址。
  • --subnet:子网的IP地址。
  • mybridge:自定义bridge网络名称

2)查看Docker网络。

docker network ls

可以看到多了一个mybridge的网络通信模式。

3)使用mybridge创建容器。

docker run -it --network=mybridge --ip=172.19.0.33 busybox

  • --ip:指定容器的IP地址。
  • --network:使用的网络通信模式,这里指定刚创建的mybridge。

4)查看容器IP。

5)删除自定义网络。

docker network rm mybridge

3.4、host模式

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

由于在 host 模式下不再需要宿主机的转发,因此其性能得到了极大的提高。

1)使用host模式创建容器。

docker run -it --net=host busybox /bin/sh

2)使用ifconfig看下网络信息。

容器内:

宿主机:

我们可以看到容器和宿主机的网络配置一摸一样,这就表示容器与宿主机共享了同一个网络命名空间。

如果使用host模式,我们在创建容器的时候就不需要-p 映射端口了,如果有映射端口,创建的时候会有警告提示。因为这个时候的IP和端口都是与宿主机共享的。

使用host模式的时候存在以下两个问题:

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

3.5、container模式

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

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

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

1)创建一个容器A,使用默认网络模式。

docker run -it busybox /bin/sh

查看网络信息:

2)创建一个容器B,使用container模式,并指向刚创建的容器A。

查看容器A的containerId为:0783212a7f4c。

开启容器B。

docker run -it --net=container:0783212a7f4c busybox /bin/sh

查看ifconfig:

可以看到容器A和B的IP信息相同,表示容器A和容器B使用了相同的网络命名空间。

因为容器B创建的时候,使用了container模式,这样容器B就不用创建自己的网络命名空间,而直接使用容器A的。

3.6、none模式

none模式下容器具有独立的网络命名空间,但不包含任何的网络配置,只能通过localhost或127.0.0.1访问容器。

docker run -it --net=none busybox /bin/sh

一般来说none模式用于一些对安全性要求高但是不需要联网的情况下。让自己的网络处于一个封闭的空间,可以排除外界其他网络的干扰。

4、小结

一般来讲,生产中用到最多的还是bridge模式,container和host模式也有自己相应的使用场景,可以根据实际情况选择。了解几种不同的网络通信模式,可以帮助我们更容易学习后续关于不同容器或者容器和宿主机间通信。一起学习吧~

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

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

相关文章

刷题学算法

刷题学算法 数据结构 一、数组 1. 数组创建: // 方式1:先创建,再逐个存储元素 String[] cityArray1 new String[5]; cityArray1[0] "北京"; cityArray1[1] "上海"; cityArray1[2] "广州"; cityArray1[3…

Metric3D:Towards Zero-shot Metric 3D Prediction from A Single Image

参考代码:Metric3D 介绍 在如MiDas、LeReS这些文章中对于来源不同的深度数据集使用归一化深度作为学习目标,则在网络学习的过程中就天然失去了对真实深度和物体尺寸的度量能力。而这篇文章比较明确地指出了影响深度估计尺度变化大的因素就是焦距 f f f…

【Docker】Docker安装Kibana服务_Docker+Elasticsearch+Kibana

文章目录 1. 什么是Kibana2. Docker安装Kibana2.1. 前提2.2. 安装Kibana 点击跳转:Docker安装MySQL、Redis、RabbitMQ、Elasticsearch、Nacos等常见服务全套(质量有保证,内容详情) 1. 什么是Kibana Kibana 是一款适用于Elasticse…

Qt之进程通信-共享内存(含源码+注释)

文章目录 一、内存共享示例图读取文本读取图片 二、界面操作共享内存示例图文本读取示例图图片读取示例图弹窗示例图 二、个人理解与一些心得三、源码简易内存共享Demo创建者接收者 界面共享内存Demo创建者读取者 总结 一、内存共享示例图 读取文本 下图是读取文本的操作&…

TCP的三次握手以及四次断开

TCP的三次握手和四次断开,就是TCP通信建立连接以及断开的过程 目录 【1】TCP的三次握手过程 ---- TCP建立连接的过程 【2】TCP的四次挥手 ---- TCP会话的断开 注意: 【1】TCP的三次握手过程 ---- TCP建立连接的过程 三次握手的过程&#xff1a…

1.初识typescript

在很多地方的示例代码中使用的都是ts而不是js,为了使用那些示例,学习ts还是有必要的 JS有的TS都有,JS与TS的关系很像css与less ts在运行前需要先编译为js,浏览器不能直接运行ts 目录 1 编译TS的工具包 1.1 安装 1.2 基本…

【BASH】回顾与知识点梳理(二)

【BASH】回顾与知识点梳理 二 二. Shell 的变量功能2.1 什么是变量?2.2 变量的取用与设定: echo, 变量设定规则: set/unset2.3 环境变量的功能用 set 观察所有变量 (含环境变量与自定义变量)export: 自定义变量转成环境变量那如何将环境变量转成自定义变…

Openlayers实战:loadstart和loadend事件

Openlayers开发的项目中,loadstart和loadend事件能很好的显示地图的加载状态,给人明示地图的加载情况,做到不急躁。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhuanlan),还是大剑师兰特(CSDN) * @此源代码版权归大剑师兰特所有,可供学习或商业项目中借鉴,未经授…

Pycharm配置Qt Designer、PyUIC、qrcTOpy

Pycharm配置Qt Designer、PyUIC、qrcTOpy 1 Pycharm配置Qt Designer2 Pycharm配置PyUIC3 Pycharm配置qrcTOpy 1 Pycharm配置Qt Designer 打开pycharm的设置栏,点击外部工具,点击“”: 名称:Qt Designer 程序:.....\e…

从0到1框架搭建,Python+Pytest+Allure+Git+Jenkins接口自动化框架(超细整理)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 接口测试是对系统…

纯css实现九宫格图片

本篇文章所分享的内容主要涉及到结构伪类选择器&#xff0c;不熟悉的小伙伴可以了解一下&#xff0c;在常用的css选择器中我也有分享相关内容。 话不多说&#xff0c;接下来我们直接上代码&#xff1a; <!DOCTYPE html> <html lang"en"><head>&l…

Java8实战-总结10

Java8实战-总结10 Lambda表达式类型检查、类型推断以及限制类型检查同样的Lambda,不同的函数式接口类型推断使用局部变量对局部变量的限制 Lambda表达式 类型检查、类型推断以及限制 Lambda表达式可以为函数式接口生成一个实例。然而&#xff0c;Lambda表达式本身并不包含它在…

Android如何用系统签名打包应用

前言 应用使用系统签名可以在用户不需要手动授权的情况下自动获取权限。适合一些定制系统中集成apk的方案商。 步骤 需要在AndroidManifest.xml中添加共享系统进程属性&#xff1a; android:sharedUserId"android.uid.system"如下图所示&#xff1a; 找到系统定制…

给中间固定位置的盒子左右两边添加对称图标方法

给中间固定位置的盒子左右两边添加对称图标方法 【html代码】&#xff1a; <div class"news-content-style mb40px ">//左侧图标盒子<div class"news-arrow left"><a href""><img src"assets/images/index/left-icon…

Nacos配置中心设置Mongodb

目录 1.common模块导入nacos config依赖 2.common模块新建bootstrap.yaml 3.在自己的模块导入common模块依赖 4.打开nacos新建配置&#xff0c;发布 5.运行服务并测试 效果&#xff1a;在部署完成后&#xff0c;其他人可以自动连接到你本地mongoDB数据库&#xff0c;无需再…

自定义el-slider 滑块的样式

最近用到了element组件中的滑块&#xff0c;翻看了官网和网上一些案例&#xff0c;感觉和我要的样式都不太一样&#xff0c;下面记录一下我用到的两种自定义滑块。 效果图 第一种自定义画过的间断点样式 起始样式 滑动的样式 第二种自定义拖动滑块的样式 起始样式 滑动的样…

将程序打包成单一一个可执行文件

最近做了一个界面交互渲染的小项目&#xff0c;项目主要的功能是通过TCP接收数据然后在界面中渲染出对应的状态。由于用户的最大需求是炫酷&#xff0c;于是为了方便实现特殊的交互逻辑&#xff0c;我选择用freeglut自行实现了界面的交互和渲染&#xff0c;又用OpenCV做了部分图…

小区智能电动汽车充电桩如何收费盈利?

摘要&#xff1a;智能用电小区是国家电网为了研究智能电网智能用电的先进技术如何运用于居民区&#xff0c;提高人民的生活水平&#xff0c;提高电网智能化水平以及提升用电服务质量而进行的一项尝试。电动汽车作为智能用电小区建设的一个组成部分同样也逐渐被纳入发展规划&…

kafka部署

1.kafka安装部署 1.1 kafaka下载 https://archive.apache.org/dist/kafka/2.4.0/kafka_2.12-2.4.0.tgz Binary downloads是指预编译的软件包,可供直接下载和安装,无需手动编译。在计算机领域中,二进制下载通常指预构建的软件分发包,可以直接安装在系统上并使用 "2.…

最长连续序列——力扣128

文章目录 题目描述法一 哈希表 题目描述 法一 哈希表 用一个哈希表存储数组中的数&#xff0c;这样查看一个数是否存在即能优化至 O(1) 的时间复杂度 每次在哈希表中检查是否存在 x−1 即能判断是否需要跳过 int longestConsecutive(vector<int>& nums){unordered_s…