一、什么是docker,docker的概念

Docker是一个用Go语言开发的一个开源容器引擎,开发时可以让开发者很方便将他们的应用以及依赖包和当前的容器中环境打包到一个轻量级、可以移植的容器中,然后发布到任何流行Linux系统上,只要该系统也安装了docker,那么就可以对该开发者环境进行还原;在容器和容器之间不会有任何的接口,更重要的是容器性能开销非常低,并且对分配到的资源可以最大限度的利用到。

二、docker中的镜像

docker中的镜像是只读的,它是创建容器的基础,类似于VMware虚拟机中的快照概念,镜像可以自己制作,也有官方提供的镜像仓库中的镜像

三、docker中的容器

这里的容器指的是从镜像创建的运行中的实例,可以启动、停止、删除。容器之间相互隔离、互不可见,保证安全性。可以把容器看做一个简易版的Linux环境。

  • 不过我想的是,比如我们从仓库下载了一个centos7镜像,然后基于镜像运行容器,那么该容器对我们来说应该和真实centos7使用感受是差不多的。
  • 如果我们下载了一个Nginx镜像,然后基于镜像创建容器,那么该容器的一切都是围绕着被Nginx需要,以便达到体积小、速度快等特性。
  • 同理,其它针对于某个服务的镜像也是如此。只是在运维层面的角度,并没有去深究,究竟有什么不同而已。

四、docker中的仓库

docker中的仓库一般所指的都是我们所用到的镜像仓库,有在互联网上各大站点的发布的公有仓库,也可以搭建自己公司内部的私有仓库。

搭建自己公司私有仓库,使用时和公有仓库没什么差别,只是指定不同的仓库就好了

互联网上最大的公共镜像仓库就是 Docker HUB ,这是官方镜像仓库

五、docker的网络通信

果然,任何一个技术,都有其津津乐道之处,也有其薄弱之处,那么对于docker来说,网络通信绝对算是其弱点之一。

  • docker内置默认存在的网络模式
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
114a818f4abf bridge bridge local
8e522feee15d host host local
58751ced4364 none null local

如上,这是docker中默认存在的集中网络模式,但是我们在使用docker run创建Docker容器时,可以用 --net 选项指定容器的网络模式,Docker可以有以下4种网络模式:

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

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

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

container模式:使用 --net=container:NAME_or_ID 指定。

下面对这些网络模式原理,以及工作方式逐个梳理

bridge模式

  1. 相当于Vmware中的Nat模式,容器使用独立network Namespace,并连接到docker0虚拟网卡(默认模式)。通过docker0网桥以及Iptables nat表配置与宿主机通信;bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。
  2. 在创建容器时没有使用docker run --network=<NETWORK>指定的话,模式是连接到此网络
  3. 当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
  4. 接下来就要为容器分配IP了,Docker会从RFC1918所定义的私有IP网段中,选择一个和宿主机不同的IP地址和子网分配给docker0,连接到docker0的容器就从这个子网中选择一个未占用的IP使用。如一般Docker会使用172.17.0.0/16这个网段,并将172.17.0.1/16分配给docker0网桥(在主机上使用ifconfig命令是可以看到docker0的,可以认为它是网桥的管理接口,在宿主机上作为一块虚拟网卡使用)。单机环境下的网络拓扑如下,主机地址为192.168.111.3/24。RFC1918解释

如上图,启动docker服务之后,就会在宿主机创建一个名为docker0的虚拟网桥,然后我们创建容器时,如果没有指定网络,那么模式出于此网络模式;docker和宿主机通信通过虚拟网桥进行通信。

host模式

  1. 该模式的简单理解:相当于VMware产品的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
  2. 个人对于命名空间(name space)的一点理解:我们把Linux操作系统比喻成一个大房子,那么命名空间指的就是这个房子中的一个个房间;而我们现在所提到的network namespace(网络命名空间),这时我们将整个linux网络比喻为一个大房子,Network Namespace指的就是一个个房间。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。但是,在host模式下工作的容器,不会获得一个独立的网络命名空间,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
  3. 当我们在容器中执行任何类似ifconfig命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用宿主机地址:端口即可,不用任何NAT转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
  4. 关于命名空间详细介绍看这里

container模式

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

None模式

  1. 如果将容器设置为此网络模式,那就相当于关闭了容器的网络功能,该模式将容器放置在它自己的网络栈中,但是并不进行任何配置。
  2. 此模式在以下两种情况下是有用的:
    1. 容器并不需要网络(例如只需要写磁盘卷的批处理任务)。
    2. overlay网络功能,1.8新增加的功能,现在先不总结,后面会独立出来写。

本文参考文章

六、总结

  1. 要想玩转docker,首先要深入理解docker的网络通信
  2. 加油,依然不要忘记或抛弃,对生命的真实和对自己的真实

Docker基础理论整理(精简)的更多相关文章

  1. Docker指令整理

    date: 2018-11-18 11:09:28 updated: 2018-11-18 11:09:28 Docker指令整理 管理员权限!!! 查看docker版本 docker -v 启动 s ...

  2. Docker知识点整理

    目录 1. Docker简介 1.1 Docker是什么 1.2 在隔离的容器中运行软件 1.3 分发容器 2. Docker镜像 2.1 Docker镜像简介 2.2 Docker镜像常见操作 2. ...

  3. docker容器 如何精简镜像减小体积

    写在前面 我们在上篇<Docker容器 关于镜像构建的安全问题>一起学习了如何构建一个基于安全的镜像,这篇小作文我们会学习镜像构建的另一个关键性问题,为何别人打造的镜像只有10MB而我的有 ...

  4. docker学习整理

    1.安装 Docker 支持 CentOS6 及以后的版本 对于 CentOS6,可以使用 EPEL 库安装 Docker CentOS7 系统 CentOS-Extras 库中已带 Docker,可 ...

  5. docker面试整理

    为什么要使用docker  https://www.cnblogs.com/AshOfTime/p/10755479.html docker的使用场景 docker和虚拟机比较的优势   https: ...

  6. Docker配置整理

    目录: 以非root用户身份管理Docker 配置Docker以在启动时启动 配置Docker守护程序监听连接的位置 以非root用户身份管理Docker 默认情况下,Docker运行权限由用户roo ...

  7. Docker network整理

    一.简介 默认情况下容器与容器.容器与宿主机的网络是隔离开来的, 当你安装docker的时候,docker会创建一个桥接器docker0,通过它才让容器与容器.容器与宿主机之间通信. Docker安装 ...

  8. Docker使用整理

    Docker技术的基础: namespace,容器隔离的基础,保证A容器看不到B容器. 6个名空间:User,Mnt,Network,UTS,IPC,Pid cgroups,容器资源统计和隔离.主要用 ...

  9. docker入门整理(1)--安装

    1.安装批量命令: CentOS7操作系统下. 包含卸载旧版本.安装依赖包.添加最新Yum源.安装docker-ce最新稳定版本.启动docker等: sudo yum remove docker \ ...

随机推荐

  1. php 保留2位小数

    $num = 10.4567; //第一种:利用round()对浮点数进行四舍五入 echo round($num,); //10.46 //第二种:利用sprintf格式化字符串 $format_n ...

  2. 【JQuery Zepto插件】图片预加载

    屏幕滚动到图片当前位置加载图片,把图片的真实地址写到data-src属性里即可. <img src="占位图" data-src="img/foot.jpg&quo ...

  3. WPF 使用winform的webbrowser

    首先要添加如下引用: WindowsFormsIntegration System.Drawing System.Windows.Forms 然后在xaml中添加引用 xmlns:winform=&q ...

  4. Mui manifest.json文档说明

    Mui官方地址:https://ask.dcloud.net.cn/article/94 保存在这里,太难找了!!!!!! 以下是完整的manifest.json配置文件,在HBuilder|HBui ...

  5. Tuner工作原理详解

      1.TV自动搜台原理:https://wenku.baidu.com/view/3b771f8b84868762caaed514 2.彩电自动搜台的原理与维修:http://tv.baoxiu.c ...

  6. 6、rabbitmq&java代码操作

    记住四个注解 存: rabbitTemplate.convertAndSend("bw","我要红包"); 取: @Component @RabbitListe ...

  7. Spring Boot制作启动图案

    SpringBoot在启动时会有一个默认图案的,如果不喜欢可以自己制作一个. 在resources的目录下新建banner.txt文件. 制作图案地址:springboot启动图案定制 通过输入字符串 ...

  8. ASP.NET请求过程-视图如何返回客户端

    本文主要讲控制器返回ActionResult后怎么变成html到客户端的. 控制器返回的各种类型 返回所有类型的基类ActionResult // // 摘要: // 表示操作方法的结果. publi ...

  9. Python3之字符串格式化format函数详解(下)

    格式限定符 format通过丰富的的“格式限定符”(语法是 {}中带:号)对需要格式的内容完成更加详细的制定. 进制转换 我们可以再限定符中制定不同的字符对数字进行进制转换的格式化,进制对应的表格: ...

  10. Ubuntu 更换下载源

    Ubuntu将下载官方源更换为国内源 由于某些原因,在国内更新软件都很慢,可以改源为国内源 1.备份原始文件 sudo cp /etc/apt/sources.list /etc/apt/source ...