当谈论Docker的时候,并不是谈论单独的产品,而是Docker公司针对容器技术、管理和生态的一整套解决方案。
Docker由RunC、Containerd、Docker Engine、Docker Compose、Docker Swarm等部分组成:
RunC(low-level)是一个轻量级的工具,用来运行容器,也是标准化的产物,是在围绕容器格式和对运行时制定的一个开放的工业化标准。
Containerd(high-level)是容器虚拟化技术,从Docker中剥离出来,形成开放容器接口(OCI)标准的一部分,起到承上启下的作用,对上接受命令参数的内容,对下调用RunC实际的操作容器服务。
Docker Engine是执行Docker标准的后台应用程序(Dockerd),用来构建镜像,运行容器,管理网络和存储等。它的API不遵循CRI标准。任何第三方平台与其集成必须开发对接其接口(Docker-shim)。
Docker Compose是基于YAML规范使用脚本来定义和简化多容器部署的工具。Docker Swarm是Docker集群管理平台。
Docker的核心概念是镜像,镜像含有启动Docker容器所需的文件系统结构及内容。可以说,镜像是Docker设计精巧的、引爆容器技术的核弹。
镜像有五个特性:
一是封装,Docker镜像将应用及其类库,配置、环境等依赖全部打包紧耦合到一个文件实现应用迁移,让应用到任意环境都可开箱并立即正常运行。
二是分层,Docker镜像由基础层(base image)和应用层构成,而应用层可以根据对底层的依赖程度,抽象出不同的基础层。
三是共享,基于分层文件系统,不同的层可以被共享和依赖,使得镜像通过标准API操作进行复制时,只需要获取数据不同的层即可,不需要所有依赖都被复制(底层依赖已经存在情况下,会通过层的UUID进行校验)。
四是轻量,多个容器通过同一个镜像创建时,不需要对镜像进行复制(对比虚拟机),只需要将镜像层挂载为只读,然后再加上一个可读写层即可。
五是写时复制,只有在可读写层的数据变化且需要保存写入新的层的时候,Docker镜像才会生成新的镜像层。写时复制与分层机制可以大大减少磁盘空间的占用和容器启动时间。
Docker基于镜像去创建容器的具体步骤是:首先将BaseImage内容作为容器的rootfs以只读方式挂载。然后Docker Daemon继续解析镜像的其它层,如ADD,ENV等信息,对容器的运行时环境进行初始化。初始化后Docker Daemon继续解析镜像文件,执行CMD信息中的命令并执行,使得容器进入运行态。
Docker在计算时会用到Namespace和Cgroup技术,Docker会基于Namespace技术进行包括网络、文件系统和环境等在内的资源隔离。Linux Cgroup就是Linux内核中用来为进程设置资源限制的一个重要功能,全称是Linux Control Group,主要作用是限制一个进程能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等等。
镜像仓库是用来存储和分发容器镜像的应用。企业和个人对产出的镜像文件可以集中管理,便于进行权限控制、安全控制、能力共享、生态建设等。镜像仓库可以对基于容器镜像的应用进行统一的版本,分发管理等。镜像仓库可以简化和优化企业基于容器的开发测试管理和集成,运维流程等(如CICD)。