docker images 与 docker ps -a 里看到"什么留下了、什么没留下" ——
从此这三个词不再是背诵题。
使命说容器化是"把本地跑通的东西变成别人也能跑起来的东西"的最短路径。
而你本机 Docker 29.2.1 已装、但守护进程没起来(现在执行任何 docker 命令都会报
failed to connect to the docker API)。所以第一步不是学概念,是让工具活过来。
docker pull nginx
就是"从默认仓库拉最新版 nginx 镜像"。第 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),本地已有的层不会再下载 —— 这也是"层顺序影响缓存"的根源。