1  概述

linux容器是一类解决方案,如lxc,docker。lxc是容器管理功能。

lxc是容器解决方案较早的实现者,docker是后续的实现者。

docker进一步轻量化lxc需求,把做好的系统模板做成一个磁盘映像文件,安装的过程相当于是复制镜像文件。

可以做一个centos镜像,二级mysql镜像和php镜像。

docker的一个程序只用于运行一个进程。所以在docker里就不需要init进程(用来管理所有的进程,但是这里只有一个进程)。如果一个用户空间只有一个子进程,就不需要容器了。

应用程序的分发和发布

docker实现应用分发的结构。docker负责把集装箱安装和卸载。

lxc没有解决程序分发的问题,docker借助于镜像文件,把依赖的文件都打包到镜像文件里,实现更简单的安装过程。

docker把要启动的环境都打包成一个包,做成镜像文件,这个镜像文件只需要放到指定的路径下,就可以被启动,不需要释放文件。镜像文件启动后是在一个独立环境下运行的进程。

docker把最终需要运行的文件都放到了一起。让多个进程通信,即让容器间通信即可。

如果当前主机奔溃,要新建一个环境

依赖相同的文件,在用户空间来看。是不一样的,但是,在底层可能是同一个。

docker能重构程序分发的技术。

这里开发镜像就变成尤其重要。

任何一个物理主机down机,就需要用虚拟化的主机,如vsphere技术,或者是k8s。实现物理机的快速迁移。

实现弹性扩展和压缩。跨多主机的容器编排和框架,就PaaS,平台级服务。是一个云环境

一个docker容器只是用来运行一个程序。

分层构建,启动容器,在本地放置相应的镜像文件。分层构建可以复用。依赖于特殊的存储设备,本地不支持分层构建的存储机制,因此需要在内核的基础上用相应技术实现。

docker最开始是lxc的二次封装,引擎为lxc,提升了lxc的应用和便捷,但是,后续又重新研发了容器引擎,抛弃了lxc。之后,docker自有的容器技术为libcontainer,后续升级为runC,runC是开放式的工业化标准,容器标准为OCI,有两个规范,runtime-sepc和image-sepc,最新的docker遵循runC标准

Docker的竞争对手coreOS,coreOS也是一个容器技术,通过rkt实现

2  Docker架构

在一台主机上安装docker deamon 和docker client,启动守护进程,通过client的命令行工具,client发起命令,连接到docker deamon进程,deamon来接收命令,在本地启动一个容器,可以从互联网上拉一个镜像下来,后期可以根据自己的分发需求,封装镜像

相关名词解释如下

Docker host:运行容器的主机

registry:放置镜像的仓库集合的服务器,为docker的registry。docker有镜像托管的镜像,可以在docker hub上注册账号,账号可公共可私有。目前docker hub仓库没有收费。

client:是用来触发容器的运行

docker daemon为服务端,用来启动容器,接收远程的控制请求

docker是c/s架构的应用。docker即是客户端也是服务器端,重点是看哪个工具实现

Docker deamon 和docker基于http或者https协议进行通信

Docker架构如下

docker镜像文件是只读的,防止一个容器被修改影响另一个容器。由于镜像是分层构建的,可以临时构建一层可读可写的,覆盖在镜像的最上层。这里文件可以被删除或者更改,用户看到的任何修改都是在这一层修改的,对原生镜像没有任何的修改。

因此每个容器的读写操作都是在最上层的读写层上实现的。万一容器被删除,所有的数据都没有,包括这个读写层上的数据。但是这样不利于迁移和分发,因为过去运行过程的中间数据没有在镜像里,这个读写层尽量放临时文件,重要的文件,需要通过挂载到外部存储的卷来实现,这样迁移的时候,容器和重要数据都可以被正常的加载。

容器自身有生命周期,数据在卷上,关闭容器后,如果要重新打开,只需要把新的镜像关联到对应的卷即可加载相应的数据,将数据和镜像分离。