DOCKER 技术概览

DOCKER 技术概览

前言

在上一篇文章中,主要介绍了一下什么是Docker,以及为什么要使用Docker。 如果你还没有看过上一篇的内容,并且对Docker的概念还不是很明白,请先用大概几分钟的时间阅读一下Docker入坑指南(一)。如果你已经比较了解Docker,那么可以继续阅读下去,如果我有什么不对的地方也欢迎指正。

本篇文章将重点介绍:Docker的核心支撑技术

Docker目前的组件较多,并且实现也非常复杂,本文我们来谈一谈 Docker这项虚拟化技术的出现有哪些核心技术的支撑。

可以说Docker的出现是紧跟时代潮流的的。由于目前开发者和运维实施者确实需要一种虚拟化技术来解决开发环境、测试环境、生产环境的环境一致性问题,从而推动了Docker技术的产生,但是如果没有合适的底层基础作为支撑,那么也是无法实现的。那么接下来我们就来聊一聊Docker用到了什么样的技术,这样对于我们理解Docker也会有很大的帮助。

一、NameSpaces

命名空间,是 Linux 为我们提供的用于分离进程、网络、挂载点以及通信等资源的方法。Docker容器就是利用了NameSpaces来对Linux的进程、网络、挂载点、通讯等方面进行隔离。这使得我们不同容器之间在文件上、网络上、进程上等等互不干扰。

二、CGroup

全名Control Group(控制组),我们已经通过Linux的NameSpaces将新创建的进程的文件系统、网络以及宿主机器之间的进程相互隔离,但是这并不能解决宿主机物理资源的分配问题,比如:CPU或者内存的分配问题。Linux 的 CGroup 能够为一组进程分配资源,也就是我们在上面提到的 CPU、内存、网络带宽等资源,通过对资源的分配,我们便可以实现物理资源的隔离。

3、UnionFileSystem

UnionFileSystem(联合文件系统)简称UFS,是一种为 Linux 操作系统设计的用于把多个文件系统『联合』到同一个挂载点的文件系统服务。而 AUFS 即 Advanced UnionFS 其实就是 UnionFS 的升级版,它能够提供更优秀的性能和效率。

想要理解 Docker 使用的文件系统,我们首先需要理解 Docker 是如何构建并且存储镜像的,也需要明白 Docker 的镜像是如何被每一个容器所使用的;Docker 中的每一个镜像都是由一系列只读的层组成的,Dockerfile 中的每一个命令都会在已有的只读层上创建一个新的层:

FROM ubuntu:15.04
COPY . /app
RUN make /app
CMD python /app/app.py

容器中的每一层都只对当前容器进行了非常小的修改,上述的 Dockerfile 文件会构建一个拥有四层 layer 的镜像:

当镜像被 docker run 命令创建时就会在镜像的最上层添加一个可写的层,也就是容器层,所有对于运行时容器的修改其实都是对这个容器读写层的修改。

容器和镜像的区别就在于,所有的镜像都是只读的,而每一个容器其实等于镜像加上一个可读写的层,也就是同一个镜像可以对应多个容器。

总结

Docker目前已经成为了非常主流的技术,已经在很多成熟公司的生产环境中使用,但是 Docker 的核心技术其实已经有很多年的历史了,也就是以上所介绍的Linux的NameSpaces、CGroup、UFS 三大技术支撑了目前 Docker 的实现,也是 Docker 能够出现并成功的重要原因。