当前位置: 首页 > 编程日记 > 正文

【Docker】容器的几种网络模式

当你使用Docker时,你会发现需要了解很多关于网络的知识。Docker作为目前最火的轻量级容器引擎,因此,我们有必要深入了解Docker的网络知识,以满足更高的网络需求。本文介绍了Docker的4种网络模式。

1、首先我们先简单描述一下容器的这几种网络模式:

Bridge: 此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。
none: 该模式关闭了容器的网络功能。
Host :容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
Container: 创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。

2、当我们安装好Docker引擎时默认会自动创建三个网络:Bridge;none;Host
在这里插入图片描述
3、我们在使用docker run创建Docker容器时,可以用 --net 参数指定容器的网络模式(如果不指定的话默认是Bridge模式)

Docker可以指定以下4种网络模式:

host模式:使用 --net host 指定。

none模式:使用 --net none 指定。

bridge模式:使用 --net bridge 指定,默认。

container模式:使用 --net container:NAME_or_ID 指定。
在这里插入图片描述
4、下面分别介绍一下Docker的各个网络模式。

一、none模式

   该模式将容器放置在它自己的网络栈中,但是并不进行任何配置。一旦 Docker 容器 采用了none 网络模式,那么容器内部就只能使用 loopback 网络设备,不会再有其他的网络资源。实际上,该模式关闭了容器的网络功能。

![](https://img-blog.csdnimg.cn/20210128142201481.png
二、Host模式

    相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。众所周知,Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,NetworkNamespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。

在这里插入图片描述
二、Container模式

    这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。

三、Bridge模式

    相当于Vmware中的Nat模式,容器使用独立network Namespace,并连接到docker0虚拟网卡(Docker进程首次启动时会在当前节点上创建一个名为docker0的桥设备,并默认配置其使用172.17.0.0/16网络,改网络是Bridge模式的一种实现,也是创建容器是默认使用的网络),通过docker0网桥以及Iptables nat表配置与宿主机通信;bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。

图片
接下来介绍一下docker0虚拟网桥的工作方式:

    当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。接下来就要为容器分配IP了,Docker会从RFC1918所定义的私有IP网段中,选择一个和宿主机不同的IP地址和子网分配给docker0,连接到docker0的容器就从这个子网中选择一个未占用的IP使用。如一般Docker会使用172.17.0.0/16这个网段,并将172.17.0.1/16分配给docker0网桥(在主机上使用ifconfig命令是可以看到docker0的,可以认为它是网桥的管理接口,在宿主机上作为一块虚拟网卡使用)。单机环境下的网络拓扑如下,主机地址为10.10.0.186/24。

在这里插入图片描述
Bridge 桥接模式的实现步骤主要如下:
1、 Docker Daemon(守护进程) 利用 veth pair 技术,在宿主机上创建两个虚拟网络接口设备,假设为veth0 和 veth1。而 veth pair 技术的特性可以保证无论哪一个veth 接收到网络报文,都会将报文传输给另一方。
2、Docker Daemon 将 veth0 附加到 Docker Daemon 创建的 docker0 网桥上。保证宿主机的网络报文可以发往 veth0;
3、 Docker Daemon 将 veth1 添加到 Docker 容器所属的 namespace 下,并被改名为 eth0。如此一来,保证宿主机的网络报文若发往 veth0,则立即会被 eth0 接收,实现宿主机到Docker 容器网络的联通性,同时,也保证 Docker 容器单独使用 eth0,实现容器网络环境的隔离性。
bridge 桥接模式下的 Docker 容器在使用时,并非为开发者包办了一切。最明显的是,该模式下 Docker 容器不具有一个公有 IP,即和宿主机的 eth0 不处于同一个网段。导致的结果是宿主机以外的世界不能直接和容器进行通信。虽然 NAT 模式经过中间处理实现了这一点,但是 NAT 模式仍然存在问题与不便,如:容器均需要在宿主机上竞争端口,容器内部服务的访问者需要使用服务发现获知服务的外部端口等。另外 NAT 模式由于是在三层网络上的实现手段,故肯定会影响网络的传输效率。

相关文章:

微信推送模板消息的PHP代码整理

本文为本人原创,未经许可,不可转载。 博主长期从事微信开发,微信开发相关问题和业务请联系qq 2580234897 最近做过一个需要推送消息的系统,就研究了一下微信的模板消息的推送。由于认证过的微信号,就用测试号做的&…

Android studio Day01-23

AndroidDay01-2(Android studio安装) 步骤如下: (1)下载Android studio下载地址:www.developer.android.com./sdk/installing/studio.html (2)双击安装,建议在studio安…

Unity 3D学习视觉脚本无需编码即可创建高级游戏

在本课程中,您将学习如何在Unity中使用可视化脚本(以前称为Bolt)以及如何在不编写一行代码的情况下创建自己的高级游戏所需的一切。本课程将教你如何掌握可视化脚本,即使你以前没有任何关于unity或编程的经验。 课程获取:Unity 3D学习视觉脚…

树莓派siri homekit_利用树莓派Zero自制一款Homekit摄像头,看上去挺酷,手痒了吗?...

虽然最近相继有多款兼容homekit商用摄像头上市,如果您也和小编一样,喜欢动手,那么DIY一款Homekit摄像头,然后自己3D打印个外壳支架,是不是很酷?HKCam项目Home 4开发者Matthias提供了一个开源项目&#xff0…

如何释放电脑被限制的20%网速?

很多朋友不管是看电影还是玩游戏,总觉得自己的网速慢,这跟自己所办网络的带宽有一定关系,但我们也要知道,我们的电脑在买来时,默认是限制了20%网速的,如何释放这20%的网速,提高用户体验呢&#…

【Docker】registry部署docker私有镜像仓库

Docker Hub作为Docker默认官方公共镜像仓库,但是如果我们不想使用怎么办,第一我们可以替换默认镜像仓库为我们国内的一些镜像仓库,第二就是如我们自己搭建一个自己的私有镜像仓库,官方也提供docker registry镜像,使得搭…

JAVA 面向对象

1;什么叫面向对象:1;面向对象和面向过程是一种思想2;面向过程:强调的是功能行为3;面向对象:将功能进行封装,强调具备了功能的对象2;面向对象的特征:1&#xf…

Android studio Day02-1

AndroidDay02-1(project) 新建一个project,并选择一个自己project的存贮的位置 Android studio 2.3.1默认的最小的API为15 第一次使用并建立自己的project,软件进行相应的sdk其他的组建的安装 点击next进入下一个界面&#xff0c…

Unity Pro builder创建模块化仓库建筑学习教程

Unity内部的专业3D编辑工作室 你会学到: 直接在Unity内部学习3D建模 使用专业构建器的专业方法 为您的游戏创建模块化资产 了解如何为您的三维模型设置纹理 三维资产的模块化布局 专业后期制作和轻烤 Unity Pro Builder Warehouse MP4 |视频:h264,1280720 |音频:AA…

C++拾遗(五)语句相关

前缀格式与后缀格式 对于表达式:后缀如 i 表达式的值仍是 i,在遇到下一个顺序点后再将 i 加1。前缀 i 表达式的值就是(i1),先计算表达式的值,不需要等待      顺序点。 对于类:前缀函数效…

github里的默认域_GitMAD 一款扫描Github上的敏感信息和数据泄漏工具

GitMAD是一个用于发现Github上的敏感信息和数据泄漏的工具。通过给定关键字或域,GitMAD便会搜索Github上托管的代码,以查找是否存在匹配项。一旦找到了匹配项,GitMAD将克隆存储库并在文件中搜索一系列可配置的正则表达式。然后,Gi…

【Docker】Docker的三大核心组件

镜像(Image)、容器(Container)、仓库(Repository)是我们常说的Docker的三大组件,接下来就让我们一起详细地探索一番吧。 一、镜像(Image) 什么是Docker镜像?…

很高兴开始博客之旅

来到博客园!,开启我的博客之旅,感觉棒棒哒转载于:https://www.cnblogs.com/pbnull/p/4562230.html

Android Studio Day02-2

AndroidDay02-2(AVD) Android APP编译的过程之中总是会需要进行相应的功能的调试,以及界面的布局设置在不同手机上的效果的展示。相应的Android平台都包含有Android虚拟设备管理器,Android虚拟设备管理器允许用户自己创建自己的虚…

网络增强现实开发简介 Introduction to Web AR development

搭配webXR、mindAR、three.js和tensorflow.js 你会学到: 获得构建不同类型的网络增强现实应用程序的实践经验,包括图像效果、人脸效果和世界效果 获得关于增强现实如何在网络浏览器中工作的基本理解 掌握使用WebXR、mind-ar-js和threejs构建web AR应用程序 学习使用…

umi脚手架搭建的项目_15天零成本搭建静态博客,托管于Github Page

博客地址技术栈概览前台:Umi(路由) Antd(视图) TypeScript(增加项目可维护性以及规范性)后台:Umi(路由) Antd(视图) TypeScript(增加项目可维护性以及规范性) Rematch(数据管理)服务:Egg.js(基于koa的下一代企业级应用框架) MongoDB搭建…

[maven] 使用问题及思考汇总

(1)Maven坐标 maven坐标可以唯一标识一个项目,包含四个元素 groupId , artifactId, packaging, version。 groupId:一般为团体,公司,项目。如 oceanic-web, oceanic-dal, oceanic-biz 同属一个 groupId。 artifactId:在…

VS调试时提示此项目已经过期

问题出因: 1.先前卸载VS重新安装时不全面 解决办法: 1.VS应安装两个C的组件 2.首先在“生成”-》 “生成解决方案”完成编译,问题解决。

(DBA之路【五】)关于锁的故事

首先很抱歉:这篇文章我其实整合了很多别人的文章,但是因为太多,一开始被没留意出处所以很难声明来源,很抱歉,但是这篇文章只用来作为学习笔记,作为新手,我以后会注意的。(一&#xf…

Android Studio Day03-1(Android studio 系统界面简介)

IDE(integrated Development Environment)的主要的目的就是用来编辑文本的。 在界面中的分布如下(以下的两张图片均为的《Android studio实战快速高效地构建Android应用》一书中的)

全流程游戏模型制作学习教程

尤金彼得罗夫|时长:36小时 |视频:H264 19201080 |音频:AAC 44,1 kHz 2ch |大小解压后 35 GB 含课程文件 |语言:英语 (无字幕,) 在本教程中,我将介绍为现代FPS视频游戏创建游戏就绪武器资产的整个过程。我将展示我的工作管道,使用…

requirednew基于xml配置日志不回滚_Elasticsearch配置IK分词器的远程词库

在生活中很多很多地方都涉及到了全文检索,最常见的就好比日常使用到的百度搜索等搜索引擎,也都是基于全文检索来实现的;全文检索种类较多,就好比Elasticsearch、Sorl等。为Ealsticsearch配置词库,可以很好的解决生活中…

PS切图篇(一)---界面设置

#工作区设置 四大主要面板:信息 字符 图层 历史记录 打开必要属性: 选择工具设置 选择图层的方式:ctrl鼠标左击想选择的图层转载于:https://www.cnblogs.com/yinzf/p/5339873.html

简单解决用VS编写hello world时命令行一闪而过

一、在return 0;前一行加一个getchar(); 二、使用项目模板为 windows 桌面向导 c 3、命令行控制台一闪而过。这是我们使用空文件夹加载的项目,默认不是控制台应用程序,新建控制台程序,或者在代码中加入system(“pause”);这种通过代码人为的…

粒子群算法(1)----粒子群简要

一、历史粒子群算法从复杂适应系统衍生PSO算法(Complex Adaptive System,CAS)。CAS理论于1994年正式提出,CAS中的成员称为主体。比方研究鸟群系统,每一个鸟在这个系统中就称为主体。主体有适应性,它能够与环境及其它的…

Android Studio Day03-2(常用操作)

(1)选择文本 1.CtrlA 选中全文 2.在将光标置于任意的单词中时按住CtrlW,选中整个词 继续按CtrlW 选中的区域将扩大,扩大至包含任意数量的相邻的单词 按CtrlwShift 进行区域的缩小 (2)Undo和Redo&…

Blender数字雕刻终极指南学习教程

CGBoost–Blender中的3D雕刻大师–数字雕刻终极指南 大小:29G 含课程项目文件 Master 3D Sculpting in Blender – The Ultimate Guide to Digital Sculpting 本课程教你所有重要的Blender雕刻基础知识,以及如何仅使用免费工具从头开始创建令人惊叹的3D雕…

生产指挥调度系统_市安全生产应急救援指挥中心将大型装载机械设备储备信息纳入应急指挥调度系统...

为拓展应急救援力量体系,发挥社会力量在开展全市重特大突发事件应急救援中的重要作用,近日,市安全生产应急救援指挥中心在加强应急指挥信息平台“一网七库”建设的基础上,成功对接甘肃省非道路移动机械监管平台,做到数…

java.sql.Exception:setString 只能处理少于 32766 个字符的字符串

java.sql.Exception:setString 只能处理少于 32766 个字符的字符串 解决方式是 : 升级ojdbc的版本, 将原来的 ojdbc14_10.2.0.2.0.jar 升级到 ojdbc6_11.2.0.1.0.jar这边行方用的是 oracle版本是 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0maven 安装到本地…

无需自己输入include这些的方法

使用项目模板为 windows 桌面向导 c 不用空白项 直接默认 不用勾选其他