Docker 简介

在动手装环境之前,我们先搞清楚 Docker 到底是什么、为什么这几年火得一塌糊涂、它能帮你解决什么实际问题。理解了"为什么",学起命令来才不会觉得枯燥。

Docker 是什么?

Docker 是一款容器化平台,它的核心能力是:把一个应用和它需要的所有依赖(操作系统库、运行时、配置文件、环境变量)打包成一个标准化的"集装箱"(镜像),这个集装箱能在任何装了 Docker 的机器上原样跑起来,不用关心底层是 Mac、Windows 还是 Linux。

用一句话总结它的价值:Build once, run anywhere(构建一次,到处运行)。开发人员本机跑通的镜像,测试环境、生产环境跑的是同一个镜像,从此告别"在我电脑上能跑"的扯皮。

诞生历史:从 dotCloud 到改变世界

Docker 由法国程序员 Solomon Hykes 在 2013 年 3 月首次公开发布。当时他在一家叫 dotCloud 的公司做 PaaS(平台即服务)服务,内部用 Linux 的 LXC、cgroups、namespaces 这些容器技术来隔离用户的应用。他们把这些工具封装成一个易用的产品开源出来,就是 Docker。

开源后 Docker 火速走红,创下了 GitHub 史上最快的"万星"纪录,公司也顺势改名叫 Docker Inc.。Docker 这个名字来自英文 dock worker(码头工人)+ container(集装箱)——它的吉祥物是一条鲸鱼🐳,背上驮着一堆集装箱,形象地表达"把一堆服务统一搬运"的理念。

需要说明的是,容器技术并非 Docker 原创。Linux 早就有了 LXC,Solaris 有 Zones,FreeBSD 有 Jail,Google 内部更是用了多年 Borg。Docker 的真正贡献是:把这些底层能力包装得简单到一行命令就能用,加上镜像分层、Dockerfile、Docker Hub 这一整套生态,才让容器真正普及开来。

容器 vs 虚拟机:为什么 Docker 更轻?

这是新手最常混淆的概念。两种技术都是"隔离"和"复用"的手段,但实现思路完全不同:

一张图直观对比三种部署方式:

# 传统部署 vs 虚拟机 vs 容器 三种方式对比

# 1. 传统部署:物理机直接装应用
#   问题:不同应用抢资源、依赖打架,换台机器就要重装一遍

# 2. 虚拟机(VM):每个 VM 自带一整套操作系统
┌─────────────────────────────────┐
│            物理机 HOST            │
├─────────────────────────────────┤
│           Hypervisor             │
├────────┬────────┬────────┬──────┤
│  App1  │  App2  │  App3  │ ...  │
│  Libs  │  Libs  │  Libs  │      │
│ 完整OS  │ 完整OS  │ 完整OS  │      │  ← 重、慢、GB级
└────────┴────────┴────────┴──────┘

# 3. 容器:共享主机内核,只隔离进程
┌─────────────────────────────────┐
│            物理机 HOST            │
├─────────────────────────────────┤
│          Docker Engine           │
│      (共享内核,不重复装OS)       │
├────────┬────────┬────────┬──────┤
│  App1  │  App2  │  App3  │ ...  │
│  Libs  │  Libs  │  Libs  │      │  ← 轻、快、MB级
└────────┴────────┴────────┴──────┘

简单说:虚拟机是"整栋独立别墅",容器是"同一栋楼里的公寓"。一台机器能跑十几个 VM,但能跑几百个容器——这就是 Docker 高效的本质。容器也不是没有缺点:它只能跑同一类内核(Linux 容器跑 Linux 程序),想在 Linux 上跑 Windows 程序还得用 VM。

核心概念速览

Docker 有五个最核心的概念,先记住名字和大致用途,后面每一篇都会展开:

# Docker 五大核心概念,一句话各记一个

# 1. 镜像(Image):只读模板,相当于"装好系统的安装盘"
docker images                 # 看本地镜像

# 2. 容器(Container):镜像跑起来的实例,相当于"正在用的电脑"
docker ps                     # 看正在跑的容器

# 3. 仓库(Registry):存镜像的地方,Docker Hub 是最大的公共仓库
docker pull nginx             # 从仓库下载镜像到本地

# 4. 数据卷(Volume):让数据"活"在容器之外,容器删了数据还在
docker volume create mydata

# 5. 网络(Network):让多个容器互相通信
docker network create mynet

最关键的是镜像容器这一对。用面向对象来类比:镜像是"类",容器是"对象";一个镜像可以 docker run 出多个互相隔离的容器实例。其他三个(仓库、Volume、网络)是支撑它们的配套设施。

Docker 都用在哪?

Docker 如今是云原生世界的"通用语"。下面这些场景你一定会遇到:

# Docker 典型应用场景

# 1. 本地开发环境一致性:同事 clone 项目后一条命令跑起来
docker compose up -d

# 2. CI/CD:每次提交代码自动构建镜像、跑测试、推仓库
docker build -t myapp:$BUILD_NUMBER .
docker run --rm myapp:$BUILD_NUMBER npm test

# 3. 微服务部署:每个服务一个容器,独立扩缩容
docker service scale web=5 api=3

# 4. 一次性任务:跑完即删,不污染主机
docker run --rm alpine echo "hello"

# 5. 多版本并行:同一台机器跑 Node 18 和 Node 20
docker run node:18 node -v
docker run node:20 node -v

简单说:只要你的应用需要"换个环境跑"——从开发机到测试服务器、从测试到生产、从本地到云——Docker 都能帮你省下一大把配环境的功夫。

Docker 的替代品

Docker 不是唯一选择,了解替代品有助于选型:

但对初学者来说,先学 Docker 永远不亏——概念和命令都能迁移到 Podman/containerd,也是学 Kubernetes 的前置知识。

该不该学 Docker?

如果你的方向是后端开发、运维、DevOps、云原生,Docker 几乎是必修课。即便你是前端,本地起个数据库、跑个 Redis、调试 Nginx 配置,Docker 也比手动装省心太多。学完本系列,你将能:给任何项目写出 Dockerfile、用 Compose 编排多服务、把镜像推到仓库、做出又小又安全的生产镜像。

← 返回 Docker 教程目录

下一篇 Docker 环境安装

✈️💬