3. Docker CLI 基础命令:镜像拉取、容器运行、查看状态

说实话,刚开始接触 Docker 的时候,我也有点懵。

命令行一大堆,不知道先敲哪个。后来发现,核心就仨动作:拉镜像、跑容器、看状态。把这套流程走顺了,后面所有东西都顺了。这一章,咱们就把这三个命令彻底吃透。

核心口诀:先 pull,后 run,再 ps 确认活没活。

Docker CLI 基础命令核心流程 docker pull 从 Registry 拉镜像 docker run 创建并启动容器 docker ps 查看容器状态 常用衍生命令:docker stop / docker rm / docker rmi 一次完整启动流程 docker pull nginx:alpine → docker run -d -p 8080:80 nginx:alpine → docker ps ⇒ 浏览器 http://localhost:8080 就能看到 Nginx 欢迎页

3.1 镜像拉取 —— docker pull

镜像就是容器的“模板”。你想跑 Nginx?得先把 Nginx 的镜像下载到本地。

docker pull nginx:alpine

这行命令干了三件事:

  • 去官方 Registry(Docker Hub)找 nginx 仓库
  • 拉取标签为 alpine 的版本(基于 Alpine Linux,体积很小)
  • 存在本地镜像缓存里,以后 run 就不用再下了

我个人习惯,第一次用某个镜像时,都会顺手拉一下最新版。你看这个 alpine 版的 Nginx,才 20 多 MB,比标准的 ubuntu 版小 10 倍。我在项目中遇到过,生产环境镜像动不动就 1GB,结果磁盘爆了……后来强制团队全部用 slim 或 alpine 变体。

常用参数:

参数作用
不加 tag默认拉 latest(不推荐,每次结果可能不同)
-a拉取所有 tag
指定 tagdocker pull redis:7.0

小技巧:拉之前先看看有哪些 tag?用 docker search nginx 或者直接去 hub.docker.com 查。我从来不用 latest,每次都写死版本号——你想想看,如果团队里有人今天拉 latest 是 1.23,明天变成 1.24,那就乱套了。

3.2 容器运行 —— docker run

镜像拉下来了,下一步就是真正跑起来。我最常用的命令长这样:

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

拆开解释:

  • -d:后台运行(detach),不占你的终端
  • --name my-nginx:给容器起个名字,后期用名字操作比用 ID 方便
  • -p 8080:80:端口映射。宿主机 8080 → 容器内 80
  • nginx:alpine:镜像名+标签

跑完以后,在浏览器访问 http://localhost:8080,就能看到 Nginx 的欢迎页了。

嗯,这里要注意:docker run 其实等于 docker create + docker start。如果你只想先创建容器但暂时不启动,可以用 docker create。

常见 run 参数对比:

参数说明
-it交互式运行,比如跑 bash:docker run -it ubuntu bash
-d后台守护态运行
--rm容器停止后自动删除(适合临时测试)
-v挂载目录/卷
-e设置环境变量

避坑指南——端口冲突

我曾经有一次怎么都访问不了新启动的容器,排查了半天才发现是宿主机 8080 端口已经被另一个进程占了。启动前用 lsof -i:8080 看一眼,或者 docker run -p 8081:80 换个端口。别硬刚默认端口。

3.3 查看状态 —— docker ps

容器启动后怎么知道它在不在跑?用 docker ps。

docker ps

输出类似:

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

关键字段:

  • CONTAINER ID:唯一标识,前 12 位就够了
  • STATUS:Up 表示运行中,Exited 表示已停止
  • PORTS:映射关系,看到 0.0.0.0:8080->80/tcp 就说明外部能访问了
  • NAMES:你起的名字,没起名字的话 Docker 会随机生成一个奇怪的名字

如果想看到已经停止的容器(包括刚刚退出的),加 -a:

docker ps -a

这个命令我每天敲几十遍。平时排查问题,第一件事就是 docker ps -a,看看容器是不是偷偷挂了。

3.4 再看几个辅助命令

这些命令我基本每天都在用,顺手列一下:

命令作用
docker stop 容器名优雅停止(发送 SIGTERM,等 10 秒再 SIGKILL)
docker kill 容器名直接强制停止(SIGKILL)
docker rm 容器名删除容器(停止后才能删)
docker rmi 镜像名:标签删除镜像(先删依赖它的所有容器)
docker images查看本地所有镜像
docker logs 容器名查看容器日志(很常用,排错必备)

一个省事的习惯:我经常在测试环境用 docker run --rm -it alpine sh 临时跑一个 Alpine 环境,用完自动删,不占磁盘空间。你想想看,如果每次跑完都留下一堆 dead 容器,时间长了清理起来也麻烦。

3.5 实战演练:快速启动一个 Nginx

纸上谈兵不如动手。咱们现在就走一遍完整的流程:

  1. 拉取镜像:docker pull nginx:alpine
  2. 启动容器:docker run -d --name test-web -p 8888:80 nginx:alpine
  3. 检查状态:docker ps
  4. 打开浏览器访问 http://localhost:8888,看到 Nginx 欢迎页就说明成功了
  5. 停止容器:docker stop test-web
  6. 删除容器:docker rm test-web
  7. 可选删除镜像:docker rmi nginx:alpine

这个流程我让团队每个新人都跑一遍。看起来简单,但能帮你建立「镜像→容器→状态」的整体认知。

记住:镜像就是“安装包”,容器就是“运行中的程序”。pull 是下载安装包,run 是运行程序,ps 是看看程序有没有崩溃。