Docker 教学工作区 · 课程 0001 · 约 20 分钟 · 前置:无 · 2026-09-24

镜像、容器、仓库:先把三个词分清

这节课的胜利:让 Docker 守护进程跑起来,用一条命令完成"拉镜像 → 建容器 → 执行 → 销毁"的完整一轮, 并在 docker images 与 docker ps -a 里看到"什么留下了、什么没留下" —— 从此这三个词不再是背诵题。

为什么是这一步

使命说容器化是"把本地跑通的东西变成别人也能跑起来的东西"的最短路径。 而你本机 Docker 29.2.1 已装、但守护进程没起来(现在执行任何 docker 命令都会报 failed to connect to the docker API)。所以第一步不是学概念,是让工具活过来。

最小知识:三条

  1. 镜像 = 只读模板,而且是分层的。它由若干"层"叠起来,每层是一次改动(装个包、拷个文件)。 层可以被多个镜像共用 —— 这就是为什么拉第二个镜像常常很快。
  2. 容器 = 镜像 + 一层可写层。所有运行时的写入都落在最上面那层;删掉容器,这层就没了,镜像分毫不动。 这解释了"容器里改的东西为什么一删就消失"。
  3. 仓库(Registry)= 存放镜像的地方。Docker Hub 是默认的公共仓库;docker pull nginx 就是"从默认仓库拉最新版 nginx 镜像"。

动手:让 Docker 活过来,再跑一轮完整生命周期

第 0 步(最容易卡住):启动 Docker Desktop —— 它被设为不开机自启(2026-09-25 改,因为它常驻会吃掉 1~2 GB 内存)。开始菜单搜 Docker 启动,等托盘图标变绿;命令行也可 docker desktop start。用完想释放内存就 docker desktop stop。然后验证:

docker version
# 应该同时打印 Client 与 Server 两段
# 只有 Client、或报 "cannot find the file specified" → 守护进程还没起来,回去启动 Docker Desktop

然后跑一轮完整生命周期(注意 --rm 的作用):

# ① 拉镜像(小体积,几十 MB)
docker pull alpine

# ② 用镜像建容器、执行命令、然后自动删除容器
docker run --rm alpine echo "hello from a container"

# ③ 看家底:镜像留下了,容器没有
docker images                 # 有 alpine
docker ps -a                  # 空 —— 因为 --rm 让容器执行完就销毁

# ④ 对比:这次不删,再看一次
docker run --name keepme alpine echo "I stay"
docker ps -a                  # 这次能看到 keepme(状态 Exited)

# ⑤ 收尾
docker rm keepme
docker ps -a                  # 又空了

这一轮你实际观察到的四件事: ① 镜像拉一次就留着(下次不用再拉);② 容器是一次性的(--rm 自动清理); ③ 容器的"执行完"不等于"消失"(状态变 Exited,除非你删它); ④ 同一个镜像可以起无数个容器,它们互不影响。

自测(选项一样长,别从长度上猜)

1. 容器和镜像的关系是?

对。镜像只读、可共享;容器在镜像之上加一层可写层 —— 所以"删容器"不会影响镜像,而"改镜像"要靠重新构建。

2. docker run --rm 里的 --rm 做什么?

对。它只管"容器"—— 退出即删,方便做一次性任务;镜像不受影响(所以 docker images 里还在)。

3. 为什么拉第二个镜像常常很快?

对。镜像由层组成,不同镜像常常共用同一批基础层(如 alpine、debian),本地已有的层不会再下载 —— 这也是"层顺序影响缓存"的根源。