Docker 概述

本文将介绍 Docker,一个开源的应用容器引擎。

一、什么是 Docker?

  • Docker 是一个开源的应用容器引擎
  • 开发者可以将应用及其环境打包为容器,并通过 Docker 运行

二、容器

1. 物理机、虚拟机、容器

  • 物理机:

  • 虚拟机:

  • 容器:

2. 什么是容器?

容器是一种相对于虚拟机而言更加轻量的虚拟化技术。

容器的基本思想是把程序及其环境打包,并在运行时隔离外部环境,使得不再需要关心具体的外部环境,从而实现 “一次配置,处处运行”。

容器的本质只不过在进程上加了隔离和限制。

3. 容器的实现 - 隔离

(1) 为什么需要隔离?

通过隔离技术,可以保证容器只能访问属于自己的资源,避免应用程序之间相互干扰相互影响,从而确保宿主机和应用程序的安全性及可靠性。

(2) 具体实现

操作系统提供了 PID Namespace、Mount Namespace、IPC Namespace、Network Namespace、User Namespace 等 Namespace,通过它们可以对进程做 “障眼法”,使得进程只能看到属于自己的 “视图”。

(3) 容器隔离与虚拟机隔离的区别

  • 容器隔离:
    • 由操作系统负责,容器只负责通知操作系统对隔离做处理
    • 隔离并不彻底,容器共用宿主机的操作系统内容,并且许多资源(例如时间)是无法隔离的
    • 资源消耗小,启动快
  • 虚拟机隔离:
    • 由虚拟机自己负责,它会虚拟出所有硬件,安装操作系统,然后再让应用程序运行在上面
    • 隔离程度非常高
    • 资源消耗大,启动慢

4. 容器的实现 - 限制

我们往往希望容器只能获得一定的资源(例如希望容器 A 只能使用 0.5h 1g),而不希望它无限制占用资源,否则可能影响同一宿主机上其它容器的正常运行,也会影响商业上的成本控制。

具体来说,通过 Linux Cgroups,即 Linux Control Group,其主要功能是对进程做资源限制。

此外,CGroups 还能够对进程做优先级设置、审计、挂起和恢复

三、镜像

1. 什么是镜像?

镜像与容器的关系类似类与实例,镜像是容器的静态定义,容器是镜像的运行实体。

镜像的本质是 rootfs,即文件系统快照,是对应用程序及其运行环境的所有静态文件的打包,包含操作系统相关文件、应用程序、应用程序依赖等。

每次启动容器时,会通过 Mount Namespace 将镜像挂载到容器的根目录上,作为容器的执行环境。

2. 镜像的实现 - 分层

镜像中包含大量通用且固定的内容,比如通用的系统文件、依赖等,这些东西在许多镜像中都是完全一样的,如果重复存储,对磁盘和网络都会造成巨大的浪费。

针对这一问题,Docker 想到了分层(Layer)的解法,具体来说:

  • 镜像由许多镜像层组成,每层都是只读、不可修改的一组文件
  • 相同的层可以在镜像之间共享
  • 多个层堆叠后通过 Union FS 联合文件系统技术组合成最终的文件系统

参考