一、什么是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. Python subprocess中的run方法

    调用subprocess的推荐方法是对于它可以处理的所有使用场景都使用run()函数. run()函数是在Python 3.5中添加的,如果在老版本中使用,需要下载并扩展. 扩展安装方式: $ pip ...

  2. SUBLIME必备插件FOR PHP

    Sublime Text真是一款写代码的利器,轻巧快捷,而且功能强大,用来写PHP代码再好不过了,告别以前用的笨重臃肿的Zend Studio,感觉一身轻松,PHP代码也更加优雅.但是PHP开发也经常 ...

  3. 04点睛Spring MVC 4.1-拦截器

    转发地址:https://www.iteye.com/blog/wiselyman-2214292 4.1 拦截器 拦截器实现了对每一个请求处理之前和之后进行相关的处理,类似于Servlet的filt ...

  4. Ubuntu14.04一直进入guest session解决办法

    按ctrl+alt+F2进入命令行切换用户 进入用户后 sudo vi /usr/share/lightdm/lightdm.conf.d 的50-unity-greeter.conf 添加 allo ...

  5. php设计模式;抽象类、抽象方法

    设计模式 什么叫设计模式 所谓设计模式,就是一些解决问题的“常规做法”,是一种认为较好的经验总结.面对不同的问题,可能会有不同的解决办法,此时就可以称为不同的设计模式. 工厂模式 在实际应用中,我们总 ...

  6. js控制数量包含截取

    <div class="usermes_index_line"> 进行中的单 <div id="usermes_index_line_i2"& ...

  7. pycharm设置开发模板/字体大小/背景颜色(3)

    一.pycharm设置字体大小/风格 选择 File –> setting –> Editor –> Font ,可以看到如上界面,可以根据自己的喜好随意调整字体大小,字体风格,文字 ...

  8. 为nologin用户开一个terminal

    昨天,我在设置zabbix-agent的时候,发现agent机器上的zabbix用户并不能读取某文件信息.我就想跳到zabbix用户,后来失败,发现在/etc/passwd中,zabbix被设置为 z ...

  9. 《ucore lab7》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 练习1: 理解内核级信号量的实现和基于内核级信号量的哲学家就餐问题(不需要编码) 题目 完成练习0后,建议大家比较一下(可用meld等文件dif ...

  10. Python02之continue,break语句

    Python中的break和continue用法基本一样 break和continue都是用在while和for循环中,而不是跳出if...elif..else的判断语句中,跳出是直接跳出语句所在的w ...