概述
Docker:一个开源的容器化平台,用于开发、交付和运行应用程序。其通过将应用及其所有依赖项(如库、配置文件、运行时)打包成标准化的轻量级单元 —— 容器,实现 「一次构建,随处运行」的目标,彻底解决 「在我机器上能跑」的环境不一致问题。
一项技术的出现不会无缘无故,了解下以前的痛点:一家公司的开发团队研发了新产品,正常来说,接下来的工作就是代码审核、测试团队测试、运维团队在生产服务器上上线。这中间可能有历史原因或者其他原因,开发团队中的每个人用的开发环境都有细微差异(如配置、版本、依赖包、操作系统、库等),而当新产品来到了测试团队以及运维团队这边,由于大家的环境都存在或多或少的差异,就会出现「在我的环境上能运行,但在你的环境没办法运行」的情况,如:
- 开发人员:这个新产品的这个功能在我这里的环境中正常运行;
- 测试人员:依赖包的版本不对,相应功能无法运行;
- 运维人员:操作系统版本过旧,生产服务器上压根无法部署
聪明的同学会想到 —— 既然已经知道了开发人员的具体开发环境,不如将这些开发环境列一个清单,让测试人员与运维人员按照这份清单直接搞定这些头疼的环境,不就可以了么?
不行,因为:
- 绝大多数的开发人员都使用 Windows 进行开发,而将产品部署在使用 UNIX 或 GNU/Linux 的生产服务器上,会存在或多或少的问题
- 生产服务器的数量少则几十台,多则上百台,每台都按照清单的环境去配置,时间成本会非常高
- 在扩容问题上,没办法实现秒级别的扩容
Q:如何解决这些令人头疼的版本、配置、依赖包、操作系统等带来的开发环境问题,实现开发团队的环境能运行,生产服务器的环境也能 100% 运行呢?
答案是容器虚拟化技术。Docker 作为使用容器虚拟化技术的代表之一,它解决了传统「代码即应用」中软件无法带环境进行安装的问题,而使用 Docker,更像是「镜像即应用」,即软件可以带环境进行安装,消除不同操作系统以及不同环境所带来的差异性。
以生活中的搬家例子来说明 —— 如果你要搬家,免不了要丢掉一些东西,而且很麻烦,物品需要拆卸、打包、运输等,换到另外一个地方之后,又需要对物品进行搬、拆、装等,非常地费时费力,而且另外一个地方的面积、布置、朝向等与原先的住处都是不一样的。有了容器化技术,相当于把原先住处所在的整栋楼搬过来,布置、物品、朝向、地基以及哪怕一颗螺丝都与原先一模一样,而且这种迁移的速度非常快。Docker 官方的 logo 就很好地说明了「从搬家到搬楼」的这种理念,如下:

对比与发展过程
容器虚拟化技术与虚拟化技术
Docker 是实现容器虚拟化技术的其中一个产品,而在计算机领域,大多数都听说过以虚拟化技术为代表的 Vmware 虚拟机。同样都是虚拟化,以容器虚拟化技术为代表的 Docker 与虚拟化技术为代表的虚拟机,两者有什么区别呢?
见下图:

比如将 Vmware WorkStation 安装 Windows 10/11 上,并且在划分硬件资源(网卡、CPU、内存、硬盘)后虚拟出 Rocky Linux 10 操作系统,该操作系统和在真实的物理机并无差异,但有这些缺点:
- 资源占用与性能开销非常大 - 随便开两三个虚拟机实例,主操作系统已经非常卡顿
- 启动慢且笨重 - 在虚拟化的操作系统中,有些软件并不需要
- 实现弹性扩容与缩容困难且费时
与虚拟化技术一样,容器虚拟化技术也是建立在主操作系统之上的虚拟化。
在 Docker 中,容器实例指的是通过镜像生成的隔离进程,这些隔离进程 复用 了操作系统本身,其不需要捆绑一整套操作系统,根据用户的设置,这些进程只获取自身需要的那些资源即可。因此对比虚拟机,容器实例会更加轻量且启动速度更加快:
| 特性 | 虚拟机 | 容器 |
|---|---|---|
| 隔离级别 | 操作系统级 | 进程级 |
| 隔离策略 | Hypervisor | CGroups |
| 系统资源 | 5~15% | 0~5% |
| 启动时间 | 分钟级 | 秒级 |
| 镜像存储 | GB-TB | KB-MB |
| 集群规模 | 上百 | 上万 |
| 高可用策略 | 备份、迁移、容灾 | 弹性、负载、动态 |
衍生术语
基于容器虚拟化技术,衍生出各种各样的新术语,如 CI/CD(持续集成、持续部署、持续交付)、DevOps(Developmenth 和 Operations 的结合,DevOps 强调的是高效组织团队之间如何通过自动化的工具协作和沟通来完成软件的生命周期管理,从而更快、更频繁地交付更稳定的软件)。
发展过程
早期是 Docker, 后来 Docker 将自己最核心的技术 containerd 捐献给了 CNCF(Cloud Native Computing Foundation,云原生计算基金会)。
除 Docker 之外,还有其他实现容器虚拟化技术的产品或项目,如:
Docker 容器引擎
严格意义上的 Docker 全称为 Docker 容器引擎,其由三个基础部分构成:
-
镜像(Image) - 镜像,原指光透过物体在镜面所生成的像,在计算机中,比如常听到的「镜像站点」或者「镜像文件 iso」,本质就是一种对文件数据内容的拷贝。在 Docker 容器引擎中,镜像指将源代码、配置文件、环境等打包成的一个镜像文件,它是一个 只读的模板,采用分层的文件系统,可以用来创建一个或多个 Docker 容器实例。简单来说,镜像就相当于一个已经封装好的操作系统光盘(模板),而容器则是安装好之后可以随时启动/停止的系统(实例)。
-
容器(Container) - 指通过镜像生成的进程实例,可以单独对这些进程实例进行操作,比如停止、删除、启动等。
-
仓库(Repository) - 指存放镜像文件的位置。可划分为为 公开仓库(Pubilc) 与 私有仓库(Private)。最大的公开仓库是 Docker hub
Docker 容器引擎使用 go 语言进行开发,采用的是 C/S 架构。客户端可以通过 socket 套接字连接到 Docker 容器引擎的后台(docker daemon)。在 Docker 容器引擎中,若本地已经存在对应镜像,则可以依据该镜像创建一个又一个的容器实例;当本地不存在时,则可以通过从远程仓库拉取镜像。












