Docker 是什么?——从 jar 包部署到镜像一键上线
Docker 系列 · 第 1/33 篇
下一篇:《容器 vs 虚拟机——为什么 Docker 不是「轻量 VM」》
开头:四套环境,四套配置,上线前又崩了
你负责一个微服务项目,开发在 macOS 上跑得好好的,测试环境是 CentOS 7 + JDK 8 + Redis 5,预生产和生产又是另一套中间件版本。
每次发版,运维同事要对照文档装依赖、改配置、跑 shell 脚本;流量高峰还要手动加机器、装环境、拉代码。开发说「我本地没问题」,运维说「线上配置不一样」——这类扯皮,在容器普及之前几乎是日常。
Docker 要解决的,正是把应用和运行环境一起打包、在任何 Linux 主机上一致运行这件事。理解它是什么、为什么重要,是后续学 Engine 原理、K8s 编排的基础。
一、Docker 的本质
Docker 是一个开源的应用容器引擎,基于 Go 语言开发,遵从 Apache 2.0 协议,代码托管在 GitHub 上维护。
它的核心能力可以用一句话概括:
让开发者把应用及其依赖打包进一个轻量级、可移植的容器,发布到任意流行的 Linux 机器上,实现轻量级虚拟化。
与容器出现之前的虚拟机(如在 Windows 上装 VMware 虚拟出整台机器)相比,虚拟机模式「太重」:每台 VM 要带完整 Guest OS,启动慢、占磁盘、占内存。Docker 同样实现硬件资源的细粒度分割与使用隔离,但属于轻量级虚拟化——容器共享宿主机内核,沙箱隔离,性能开销极低,容器之间默认没有额外接口(类似 iPhone 上各 App 的隔离模型)。
从 17.03 版本起,Docker 分为两个产品线:
| 版本 | 全称 | 适用对象 |
|---|---|---|
| CE | Community Edition(社区版) | 开发人员、个人与中小团队,本系列默认使用 |
| EE | Enterprise Edition(企业版) | 付费版,提供编排、Service 等企业特性 |
日常学习和开发,Docker CE 足够。
二、典型应用场景
Docker 已广泛进入测试与生产环境,常见用途包括:
- Web 应用的自动化打包与发布
- 自动化测试、持续集成与持续发布(CI/CD)
- 服务型环境中部署和调整数据库或其他后台应用
- 基于 OpenShift、Cloud Foundry 等平台搭建自有 PaaS
在 DevOps 场景下,价值尤其明显。微服务往往有多套环境——开发、测试、预生产、生产——每套都要部署 Redis、ES、ZooKeeper 等组件,费时费力;生产流量上来还要动态扩容。Docker 把这几类痛点串起来解决:
| 痛点 | 没有 Docker | 有 Docker |
|---|---|---|
| 发布 | jar + 大量 shell + 手工配置,Windows/mac 开发、Linux 部署差异大 | 构建镜像,开发到上线一条流水线 |
| 交付 | 安装文档、基础环境、中间件逐步安装 | 给镜像 + docker run,环境一致 |
| 扩缩容 | 新机器重装环境、拷配置 | 新机器启动容器即可;配合 K8s + HPA 可自动伸缩 |
| 资源利用 | 单机 VM 数量受限 | 内核级虚拟化,单机可跑大量容器实例 |
三、历史脉络:从 dotCloud 到 OCI 与 Moby
理解 Docker 不能只记命令,还要知道它如何从一家创业公司走向行业标准。
2010 年,几个年轻人在美国旧金山成立 dotCloud,做 PaaS,技术底座是 LXC(Linux Container)——一种内核虚拟化技术,用于轻量级隔离进程与资源。他们把这套容器化技术命名为 Docker。早期并未引起行业轰动;虽获 Y Combinator 与融资,但随着微软、谷歌、亚马逊等巨头进入 PaaS,dotCloud 处境艰难。
2013 年,创始人 Solomon Hykes(当时 28 岁)做出关键决定:将核心引擎开源,使 Linux 容器中的应用程序与代码能轻松在服务器间迁移。同年发布 Docker Compose 作为编排工具。
2014 年 Docker 发布 1.0;2015 年推出 Docker Machine,支持 Windows 平台。基于 LXC 的管理引擎开源后迅速走红。
社区繁荣的同时也有争议:Docker 公司对路线有较强话语权(例如 libcontainer 曾引发社区顾虑)。在 Red Hat、谷歌等推动下,2015 年前后成立 OCI(Open Container Initiative,开放容器倡议),制定开放容器标准,目标之一是让 Docker 的发展权更回归社区,同时吸引更多厂商向项目贡献代码。
Docker 将容器格式与运行时 runC 捐给 OCI,OCI 在此基础上制定两项标准:
- Runtime Specification(runtime-spec)——运行时标准
- Image Specification(image-spec)——镜像标准
由此建立 runc 项目,替代 libcontainer。开发者可以基于 runC 实现自己的容器运行时,而不必绑定 Docker;Docker 发行版底层同样使用 runC,在宿主机上执行 runc 时,许多子命令与 docker 类似。
2017 年,Docker 项目迁移到 Moby 项目。基于 Moby,Docker 公司提供 Docker CE 与 Docker EE 两种发行版。Docker 承诺发行版基于 Moby 构建,社区也可基于 Moby 定制容器引擎,降低被单一厂商绑定的风险。
四、容器是什么?与镜像、仓库的关系(概览)
日常口语里「跑 Docker」往往指 Docker Engine(下一篇细讲)。这里先建立三个基本概念:
| 概念 | 说明 |
|---|---|
| 镜像(Image) | 只读模板,相当于 root 文件系统;如 ubuntu:16.04 含一套最小 Ubuntu 16.04 根文件系统 |
| 容器(Container) | 镜像运行时的实体;类比面向对象中的类与实例——镜像是类,容器是实例;可创建、启动、停止、删除、暂停 |
| 仓库(Repository / Registry) | 存放镜像;分公有与私有,类似 Maven 仓库。Docker Hub 提供大量官方与社区镜像 |
容器还可以这样理解:
- 对软件及其依赖的标准化打包
- 应用之间相互隔离
- 共享同一 OS Kernel
- 可在多种主流操作系统上运行(通过 Docker 引擎)
容器解决的核心问题是开发与运维之间的鸿沟,是 DevOps 实践中最常用的载体之一。一个 Docker 容器,就是一个运行时环境,可以简单理解为「进程运行的集装箱」。
Docker 采用 Client-Server(C/S) 架构,通过远程 API 管理容器;容器由镜像创建。
其他相关术语:
| 术语 | 含义 |
|---|---|
| Host(主机) | 安装了 Docker 的机器,Docker 直接装在操作系统之上 |
| Client(客户端) | 通过 CLI 或 Docker SDK 与守护进程通信 |
| Registry | 保存镜像;格式为 <仓库名>:<标签>,省略标签时默认为 latest |
五、常见误解:Docker ≠ 轻量级虚拟机
很多人把 Docker 理解成「轻量级虚拟机」——这是不准确的。Docker 与 KVM 都是虚拟化技术,但抽象层不同:Docker 抽象层更少,利用宿主机内核;虚拟机需要 Guest OS。新建容器时无需像 VM 那样引导完整操作系统,因此可达秒级启动;VM 加载 Guest OS 往往是分钟级。
容器与虚拟机的详细对比见系列第 2 篇;Engine 组件与调用链见第 3 篇。
小结
- Docker 是应用容器引擎,轻量、可移植,CE/EE 自 17.03 分流。
- 价值在于环境一致、快速交付、易于扩缩容、提高单机密度。
- 历史主线:dotCloud → 2013 开源 → OCI/runc → 2017 Moby → CE/EE。
- 核心概念:镜像、容器、仓库;容器共享内核、进程级隔离。
下一篇进入 Docker Engine 与 Docker Platform 的分层架构,把 Client、daemon、containerd、runc 的关系讲清楚。