###1. 什么是docker
Docker 一个基于go语言开源的应用容器引擎,开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到的 Linux 机器上,也可以实现虚拟化。
为什么要使用docker?在没有使用docker之前,代码在开发到生产这个过程中往往需要经过一系列的环境的搭建以及数据的准备。例如:部署安装生产环境的的redis集群环境,在这之前需要ruby的底层环境等其他众多底层环境的依赖,而这种简单的环境迁移仅仅是在众多运维工作中的很小的一个部分,可想而知在运维过程中,往往很多的时间和精力都花费在环境的重复搭建和踩坑之中。在拥有了docker之后,可以将需要的应用以及数据按照一定的格式和标准进行封装,打包为一个镜像,有点类似于咱们在系统安装中接触到的iSO文件。而镜像通常可能会遇到损坏的情况,这时候在镜像的外层增加一个容器,如果需要复制到其他环境,只需要简单的几行命令即可将这个应用完全安装到新的环境。在这个过程中,Docker自动将安装和配置的工作完成。##
##2. 应用场景
- a. 统一不同环境配置,代码部署流水线化
- b. 隔离不同应用
强调单个容器来部署单个应用 - c. 自动化测试和持续集成
标准化构建方法(buildfile)和良好的REST API,自动化测试和持续集成/部署能够很好的集成进来 - d. 快速部署扩展应用
##3. 对比
Docker vs OpenStack
Docker vs KVM
##4. 优点和不足
优点:如同上面在应用场景中介绍的一样,docker在解决应用隔离以及代码快速部署的过程中体现了作为替代VM的潜质。
不足:
i. docker在处理一些携带的敏感数据的应用上,存在可泄露的风险。
ii. 实现docker需要众多的技术支撑。
##5.docker中的哪些概念
客户端 守护进程:
docker客户端向守护进程发送操作命令。
镜像:
保存了容器启动的各种配置文件及所需运行的文件源码。
最低端为bootfs,类似与windows boot引导;上一层为root文件系统,为一种或者多种操作系统,为unix系统,只能为只读状态。
一个镜像可层叠。
容器:
通过镜像来启动构建的执行操作单元,容器是在镜像的基础上加载可写文件系统。例如:如果想修改某个文件。这时候docker将会该文件从只读文件层复制到可写文件层,当用户在修改时,仅仅在这个可写层进行操作,只读层并不会改变。这个技术被称为可写时复制技术。
容器依托于linux内核namespace的虚拟化技术来实现,被称为操作系统的虚拟化技术。而想比与虚拟机,容器化技术仅需要更少的硬件资源,仅依赖于本身的操作系统镜像。
仓库
仓库中保存了大量的镜像,用户可直接pull下载使用,有点类似于maven的中央仓库。
![这里写图片描述]()
LXC
Linux containers 的简称。基于容器操作系统的虚拟化技术,主要利用namespace以及Cgroup加上一些其他技术来达到进程之间资源的分离。
Docker在LXC的基础之上构建了一个更高层次的工具集用来管理container,并提供了一套用来管理的工具。
相比于LXC:
Docker可以将对象打包为一个镜像在任何存在docker环境的机器中运行,而LXC仅仅能做的是进程之间的资源隔离,并不能达到运行的程度。
如上图为Docker和Lxc以及Cgroup之间的关系。
NameSpace
在开发过程中,我们经常见到namespace的概念。同理在linux中,namespace的概念也是一样的。用来协调和隔离linux资源的作用,具体的关系可以归为同一个进程可以属于多个namespace、多个进程可以使用同一个namespace。这里还存在父子命名空间的问题,父空间可以发现子空间的资源进程并可以通过信号等方式影响子进程。反过来,子空间则不可以。
常用命名空间:
- PID命名空间:进程的之间的隔离。
- Net命名空间:隔离容器之间的网络。
- Ipc命名空间:用于访问IPC资源的。
- Mnt命名空间:用于管理挂载点,每个容器都有自己唯一的目录挂载点。
- Uts命名空间:隔离系统内核和版本标识。
命名空间作为一种轻量化的虚拟技术,在资源的使用上做非常的好的节省。
但是这样也带来一些问题,相比与传统的虚拟化技术实际上没有做到完全的隔离,只是做到了系统的不同视图来带来的一种对用户的假象。
Control groups 控制组
是Linux内核提供的一种可以限制、记录、隔离进程组所使用的技术。主要有以下这些方面进行限制:
- 资源限制
主要是只cpu和内存 - 优先级限制
为单个进程设置优先级顺序 - 进程组限制
控制进程组的挂起和恢复
UnionFS
是一个联合的文件系统,可以将多个目录内容合并在一起,而在物理上是分开的,有点类似于在lucense中的索引文件的分片文件的概念。而Docker正是用了这个技术来达到容器的快速构建和升级。在UnionFS中有一个非常重要的概念,叫写时复制:
意思是,如果一个资源是重复的,但没有任何修改,这时候并不需要立即创建一个新的资源;这个资源可以被新旧实例共享。创建新资源发生在第一次写操作,也就是对资源进行修改的时候。通过这种资源共享的方式,可以显著地减少未修改资源复制带来的消耗,但是也会在进行资源修改的时候增减小部分的开销。
也就是说,每启动一个容器时,Docker会创建一个只读的层,用来存储和这个容器相关的内容;同时还会创建一个可写的层来执行所有的写操作。
简单的说,docker利用namespace实现系统环境的隔离;利用Cgroup实现资源限制;利用镜像实现根目录环境的隔离。