虚拟化容器技术与Docker

虚拟机(virtual machine)

虚拟机就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在 Windows 系统里面运行 Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。

虚拟机缺点:资源占用多;冗余步骤多;启动慢


Linux容器

针对虚拟机容器的缺点,另一种虚拟化技术:Linux容器(Linux Containers,缩写为 LXC),依赖于Linux内核特性:NameSpace(命名空间) 和 Cgroups(控制组),只能运行Linux系统,而不能运行Windows系统,它包含了基本的文件系统、进程、网络设备。


NameSpace 和 Control Groups

理解NameSpace和Control Groups有助于理解Docker的资源分配和管理

NameSpace
PID:(Process ID),进程隔离
NET:(NetWork),管理网络接口
IPC:(InterProcess Communication),管理跨进程通信的访问
MNT:(Mount),管理挂载点,文件系统的隔离
UTS:(Unix Timesharing System),隔离内核和版本标识

这些隔离的资源怎么管理起来?使用Cgroups

Control Groups
是Linux内核提供的可以记录、限制、隔离进程族所使用的物理资源的机制,来源于Google,用来分配资源,没有Cgroups就没有容器技术
—提供的功能:
资源限制,例如:限制进程族的内存上限。
优先级设定,例如:设定哪些进程族使用更大的CPU或磁盘IO
资源计量,例如计算进程族使用了多少资源
资源控制,例如:将进程族挂起或恢复

Docker 容器的能力
文件系统隔离:每个容器都有自己的root文件系统
进程隔离:每个容器都运行在自己的进程环境中
网络隔离:容器间的虚拟网络接口和IP地址都是分开的
资源的隔离和分组:使用Cgroups将CPU和内存之间的资源独立分配给每个Docker容器


Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。
或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。

由于容器是进程级别的,相比虚拟机有很多优势:启动快;资源占用少;体积小


Docker

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口,将应用程序自动部署到容器的开源引擎,使用Go语言开发。
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

Docker用途
(1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
(2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
(3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。

Docker的基本组成

  1. Docker Client 客户端
  2. Docker Daemon 守护进程

Docker 是 C/S 架构,Docker Client 向 Docker Daemon 服务端发出请求,服务端守护进程处理完所有的工作并返回结果。

虚拟化容器技术与Docker

  1. Docker Image 镜像
    Image 镜像是容器的基石,就像容器的源代码一样,它是一个层叠的只读文件系统。
    最底端是一个引导文件系统——bootfs,当一个容器启动后,容器将会移动到内存中,而引导文件系统将被卸载。
    第二层是 root 文件系统——rootfs,rootfs是一种操作系统,例如 Ubuntu/CentOS ,rootfs 永远是只读状态,Docker使用联合加载技术(union mount,一次同时加载多个文件系统) 在 rootfs 之上加载更多的只读文件系统,联合加载会将多个文件系统叠加在一起,这样最终的文件系统会包含所有的底层文件和目录。Docker 将这样的文件系统称为镜像,一个镜像可以位于另一个镜像的顶部,下面的镜像称为父镜像。
    虚拟化容器技术与Docker

  2. Docker Container 容器
    容器通过镜像来启动,Docker 容器是 Docker 的执行单元,容器中可以运行客户的一个或多个进程。如果说镜像是Docker 生命周期中的构建和打包阶段,那么容器就是启动和执行阶段。
    容器怎么通过镜像来启动?当 Docker 启动一个容器时会在该镜像的最顶层加载一个读写文件系统,也就是一个可写的文件层。当 Docker 第一次启动这个容器时,初始的读写层是空的,当文件系统发生变化时,这些变化都会应用到这一层上,例如:要修改一个文件,这个文件首先会从该读写层下面的只读层复制到该读写层,改文件的只读版本依然存在,但是已经被该读写层中的文件副本所隐藏,这就是 Docker 中的一个重要技术:写时复制(copy on write)。
    虚拟化容器技术与Docker

  3. Docker Registry 仓库
    仓库来保存用户构建的镜像。分为 公有私有 两种。Docker 公司提供了一个公有的仓库—— Docker Hub,可以在 Docker Hub 上注册账号,分享并保存自己构建的镜像,可以查找需要的镜像。可以搭建自己私有的仓库。
    虚拟化容器技术与Docker