Docker容器批次校验流程实践 - 第2节

容器镜像基本操作:拉取、查看、删除

说白了,Docker 的镜像就是容器的“模板”。你有了镜像,才能跑容器。我刚开始接触 Docker 的时候,最常干的事就是拉镜像、看镜像、删镜像。咱们先把这个三板斧练熟。

拉取镜像

拉镜像用的是 docker pull 命令。你想想看,Docker Hub 上那么多现成的镜像,不拉下来用就浪费了。

docker pull nginx:latest
docker pull ubuntu:22.04
docker pull python:3.11-slim

这里有个细节:镜像名称由三部分组成——仓库地址 / 镜像名 : 标签。如果不写标签,默认拉 :latest。我在项目中遇到过一个问题,就是用了 latest 导致生产环境版本不一致。嗯,后来我改成了固定标签。

提示:拉取镜像时最好指定具体版本号,比如 nginx:1.25 而不是 nginx:latest。这样能避免意外升级。

查看镜像

拉完之后,看看本地有哪些镜像。命令很简单:

docker images

输出大概长这样:

REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    abc123def456   2 weeks ago   187MB
ubuntu       22.04     def456abc789   3 weeks ago   77MB

我个人习惯用 docker image ls,效果一样。注意 IMAGE ID 那一列,删镜像时会用到它。

参数 说明 示例
-a 显示所有镜像,包括中间层 docker images -a
-q 只显示镜像 ID docker images -q
--digests 显示摘要信息 docker images --digests
注意:千万别在脚本里用 docker images 的输出来做自动化处理。它的输出格式在不同版本可能有变化。我建议用 docker image ls --format 来保证稳定。

删除镜像

不需要的镜像就删掉,省点磁盘空间。命令是 docker rmi,或者用 docker image rm。

docker rmi nginx:latest
docker image rm abc123

删除前要确保没有容器在用这个镜像。否则会报错:

Error response from daemon: conflict: unable to remove repository reference "nginx:latest"
(hint: remove the container first)

我曾经遇到过一个问题:明明没有容器在运行,但还是删不掉。原因是有一个已停止的容器还在引用这个镜像。解决办法就是先删容器,再删镜像。

批量删除:想把所有不用的镜像一次性清掉?用这个命令:
docker image prune -a
它会删除所有没有被容器引用的镜像。谨慎操作!

容器生命周期:创建、启动、停止、删除

镜像搞定了,接下来就是跑容器。容器的生命周期管理是日常操作的核心。说白了,就是让容器“生老病死”。

创建并启动容器

最常用的命令是 docker run。它等于 create + start 两步合并。

docker run -d --name my-nginx -p 8080:80 nginx:latest

解释一下参数:

  • -d:后台运行(detached)
  • --name:给容器起个名字
  • -p:端口映射,宿主机端口:容器端口

你想想看,如果没有 -d,终端就会一直挂着,什么也干不了。我刚开始时老忘加 -d,结果一关终端容器就停了。

如果只想创建不启动,用 docker create:

docker create --name my-ubuntu ubuntu:22.04 sleep 3600

查看容器

运行中的容器用 docker ps 查看:

docker ps

想连已停止的一起看,加 -a:

docker ps -a

输出示例:

CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                  NAMES
a1b2c3d4e5f6   nginx:latest   "/docker-entrypoint.…"   5 minutes ago   Up 5 minutes   0.0.0.0:8080->80/tcp   my-nginx

启动、停止、重启

这几个操作很直观:

docker start my-nginx
docker stop my-nginx
docker restart my-nginx

stop 会优雅地停止容器,给它发 SIGTERM 信号。如果超时还没停,再发 SIGKILL。

技巧:我建议用 docker stop 而不是 docker kill。除非你知道自己在做什么。kill 是直接暴力终止,可能丢数据。

删除容器

不用的容器删掉,用 docker rm:

docker rm my-nginx

容器必须在停止状态才能删除。想强制删运行中的容器,加 -f:

docker rm -f my-nginx

我曾经在清理环境时用过 docker rm -f $(docker ps -aq),一下把所有容器全删了。嗯,这个操作很暴力,但有时候很管用。

警告:删除容器会丢失容器内的数据。除非你把重要数据挂载到了宿主机卷上。所以生产环境一定要做数据持久化。

知识结构总览

这一章的内容其实就围绕两个核心对象:镜像和容器。下面这张图帮你理清它们之间的关系:

Docker镜像与容器操作关系图 Docker镜像与容器操作关系图 镜像仓库 docker pull 本地镜像 docker images docker rmi docker run/create 运行中容器 已停止容器 start/stop docker rm docker ps -a ⭐ 重要操作 docker ps:只显示运行中 docker ps -a:显示所有 docker rm -f:强制删除

这张图把镜像和容器的关系串起来了。从左往右看:先从仓库拉取镜像到本地,然后用镜像创建容器。容器可以启动、停止、删除。你只要记住这个流程,日常操作就不会乱。


常用命令速查表

操作 命令 常用参数
拉取镜像 docker pull :tag 指定版本
查看镜像 docker images 或 docker image ls -a、-q
删除镜像 docker rmi 可用 IMAGE ID 或名称
创建容器 docker create --name、-p
运行容器 docker run -d、--name、-p
启动容器 docker start 后面跟容器名或 ID
停止容器 docker stop -
删除容器 docker rm -f 强制删除
查看容器 docker ps -a 查看所有
我个人的建议:刚上手时别怕敲命令。多敲几遍,肌肉记忆就形成了。尤其注意 docker run 的 -d 参数,我估计十个新手有八个会在这上面栽跟头。