1 概述php
linux容器是一类解决方案,如lxc,docker。lxc是容器管理功能。mysql
lxc是容器解决方案较早的实现者,docker是后续的实现者。linux
docker进一步轻量化lxc需求,把作好的系统模板作成一个磁盘映像文件,安装的过程至关因而复制镜像文件。sql
能够作一个centos镜像,二级mysql镜像和php镜像。docker
docker的一个程序只用于运行一个进程。因此在docker里就不须要init进程(用来管理全部的进程,可是这里只有一个进程)。若是一个用户空间只有一个子进程,就不须要容器了。centos
应用程序的分发和发布服务器
docker实现应用分发的结构。docker负责把集装箱安装和卸载。架构
lxc没有解决程序分发的问题,docker借助于镜像文件,把依赖的文件都打包到镜像文件里,实现更简单的安装过程。框架
docker把要启动的环境都打包成一个包,作成镜像文件,这个镜像文件只须要放到指定的路径下,就能够被启动,不须要释放文件。镜像文件启动后是在一个独立环境下运行的进程。ide
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镜像文件是只读的,防止一个容器被修改影响另外一个容器。因为镜像是分层构建的,能够临时构建一层可读可写的,覆盖在镜像的最上层。这里文件能够被删除或者更改,用户看到的任何修改都是在这一层修改的,对原生镜像没有任何的修改。
所以每一个容器的读写操做都是在最上层的读写层上实现的。万一容器被删除,全部的数据都没有,包括这个读写层上的数据。可是这样不利于迁移和分发,由于过去运行过程的中间数据没有在镜像里,这个读写层尽可能放临时文件,重要的文件,须要经过挂载到外部存储的卷来实现,这样迁移的时候,容器和重要数据均可以被正常的加载。
容器自身有生命周期,数据在卷上,关闭容器后,若是要从新打开,只须要把新的镜像关联到对应的卷便可加载相应的数据,将数据和镜像分离。