docker学习笔记
引入
虚拟化
虚拟化就是通过虚拟化技术将一台计算机虚拟为多台逻辑计算机操作系统。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统(如linux、windows等),并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。
虚拟化的分类
全虚拟化和半虚拟化
全虚拟化中不需要对GuestOS操作系统软件的源代码做任何的修改,就可以运行在这样的VMM中,全虚拟化的VMM会虚拟出OS所能操作的cpu、内存、外设等物理设备,并将虚拟出来的虚拟设备交给GusetOS操作,所以GuestOS不知道自己是一台虚拟机,会认为自己就是该机器的主机
半虚拟化中需要对GuestOS的内核代码做一定的修改,才能够将GuestOS运行在半虚拟化的VMM中。通过在GuestOS的源代码级别上修改特权指令来回避上述的虚拟化漏洞。且修改内核后的GuestOS也知道自己就是一台虚拟机。所以能够很好的对核心态指令和敏感指令进行识别和处理,但缺点在于GuestOS的镜像文件并不通用。
寄居虚拟化、裸机虚拟化、容器虚拟化
寄居虚拟化中虚拟机对各种物理设备(CPU、内存、硬盘等)的调用,都是通过VMM层和宿主机的操作系统一起协调才完成的
结构图如下:
裸机虚拟化中,VMM安装在硬件设备与物理硬件之间,此时的VMM常称为Hypervisor。结构图如下:
容器虚拟化中容器没有自己的OS,直接共享宿主机的内核,也没有hypervisor这一层进行资源隔离和限制,因此对容器的控制都是操作系统本身去控制的,结构图如下:
docker基础知识
概念
官网上面的解释是“Docker是一个用于开发,交付和运行应用程序的开放平台”。Docker本身并不是容器,它是创建容器的工具,是应用容器引擎,docker swarm是docker提供的容器编排工。
与半虚拟化相比,docker是一个更轻量化的方式,docker镜像中只隔离并安装服务器运行所需的程序与库,与主机共享OS资源,因此能够大大的降低镜像体积,docker本质上是一个轻量级的虚拟机。
docker的本质是一个进程。docker是轻量级的虚拟化软件模式,是用go语言开发的一个工具。相比较vmware而言消耗更少的资源(如cpu、磁盘、内存等)。docker是由google公司开源发布的一个工具。
docker机制
封装机制
docker是完全使用沙箱机制,沙箱的本质就是一个虚拟化系统,沙箱内的变化不会对沙箱外产生任何影响。因此应用组件经过Docker的封装,可以随意移植到服务上。
隔离机制
docker的隔离机制是通过LXC实现的,LXC是Linux Container的缩写,即linux内核虚拟化技术,它可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。所以是轻量级的
LXC在资源管理方面依赖于Linux内核的cgroups子系统,cgroups子系统是Linux内核提供的一个基于进程组的资源管理的框架,可以为特定的进程组限定可以使用的资源。
LXC在隔离控制方面依赖于Linux内核的namespace特性,具体而言就是在隔离时,创建与主机不同的空间。
特点
docker和虚拟机的区别
容器和虚拟机具有相似的资源隔离和分配优势,但是功能不同,因为容器虚拟化了操作系统,而不是硬件。容器更加便携和高效。
附上官网上面的对比图(左边为docker容器,右边为虚拟机):
1.dokcer不需要安装客户OS,与主机共享OS,因此能够大大地降低镜像的体积。但是由于与主机共享OS,因此隔离性不如虚拟机强
2.docker没有硬件虚拟化层,其内存访问、文件系统、网络速度上网等速度快
3.docker特地提供了创建并部署镜像的功能,因此在容器的部署与扩展方面更为便捷
4.资源消耗方面:docker资源消耗少
docker使用的技术
1.一个原生的linux容器格式
2.linux内核的命名空间(Namespqce),用于隔离文件系统、网络和进程
3.文件系统隔离:每个容器都有自己的root文件系统
4.进程隔离:每个容器都运行在自己的进程环境中
5.网络隔离:容器间的虚拟网络接口和IP地址都是分开的
6.资源隔离和分组:使用cgroups将CPU和内存之类的资源独立分配给每个docker容器
7.写时复制:文件系统都是通过写时复制创建的,即文件系统是分层的,因此占用磁盘空间小
8.日志:容器产生的STDIN、STDOUT、STDERR会被收集并计入日志,用来分析故障和排错
9.交互式shell:用户可以创建一个伪tty终端,提供了一个交互式的shell
docker中的虚拟网络类型
docker启动时会分配给docker网桥一个默认的虚拟ip,通常是172.17.0.1,该接口作为所有容器的网关。docker里面的容器的ip地址依次为172.17.0.2,172.17.0.3。…。每一个对外面发布的容器都需要通过ip映射。宿主机的ens33网卡就想当于WAN口,docker的网卡口相当于LAN口。
网络模式:
1.host模式:容器不会虚拟自己的网卡,容器的网卡和宿主机的网卡在同一个命名空间中,直接使用宿主机的ip。优点:网络性能好,缺点:独立性差,因为共用一个命令空间。host也可以跨主机通信
2.none模式:docker容器有自己的网络命名空间,该空间中只有回环地址(127.0.0.0),没有网卡,ip地址,路由信息等,需要docker手动去配置。
3.container模式:所有的容器共用同一个ip地址(ip的命名空间),然后连接到docker网桥上。适用于集群
4.bridge模式:隔离性好,与外界通信需要DNAT装换。每个容器都会虚拟出自己的网卡,且网卡都有自己ip地址,与宿主机进行DNAT地址转换,从而和外界通信
5.overlay模式:实现不同docker机器上的通信。可以实现容器跨节点(主机)通信。需要自己创建,在第二层(数据链路层)
前4种模式,只能在一同主机上面进行通信。
默认情况下,docker采用的网络类型,就是bridge类型。
docker组成
1.镜像
镜像的本质就是文件,镜像可分为基础镜像和docker镜像,基础镜像就是指linux发行版userland中安装的文件(通常包括启动所需要的可执行文件、库、以及原有的包系统),也可以理解成一个地基。
镜像可以自己制作,自己制作镜像通常是在一个基础镜像的基础上面进行改进,添加一些内容,从而达到自己的需求。docker镜像只将基础镜像中变化的部分创建为镜像,然后继续引用基础镜像,运行时将基础镜像与可变部分合并运行即可,因此可以避免大量镜像重复创建。
Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变,正是由于这一特性,因此镜像可以很方便的进行部署和移植。
docker里面的镜像不是一个完整的操作系统,但是是一个微型的操作系统,里面有最基础的系统服务。
2.仓库
仓库是存放docker镜像的地方,常用的有Docker Hub
3.容器
dokcer容器就是处于运行状态的docker镜像,也可以看成一个进程。
docker容器可以看成是镜像+可写层,因此,区分docker镜像和容器只需要看顶层是否是可写层即可。一旦docker容器被销毁,则顶层的可写层也被销毁了