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 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 参数,我估计十个新手有八个会在这上面栽跟头。