3. Docker CLI 基础命令:镜像拉取、容器运行、查看状态
说实话,刚开始接触 Docker 的时候,我也有点懵。
命令行一大堆,不知道先敲哪个。后来发现,核心就仨动作:拉镜像、跑容器、看状态。把这套流程走顺了,后面所有东西都顺了。这一章,咱们就把这三个命令彻底吃透。
核心口诀:先 pull,后 run,再 ps 确认活没活。
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 |
| 指定 tag | docker 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 → 容器内 80nginx: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
纸上谈兵不如动手。咱们现在就走一遍完整的流程:
- 拉取镜像:
docker pull nginx:alpine - 启动容器:
docker run -d --name test-web -p 8888:80 nginx:alpine - 检查状态:
docker ps - 打开浏览器访问
http://localhost:8888,看到 Nginx 欢迎页就说明成功了 - 停止容器:
docker stop test-web - 删除容器:
docker rm test-web - 可选删除镜像:
docker rmi nginx:alpine
这个流程我让团队每个新人都跑一遍。看起来简单,但能帮你建立「镜像→容器→状态」的整体认知。
记住:镜像就是“安装包”,容器就是“运行中的程序”。pull 是下载安装包,run 是运行程序,ps 是看看程序有没有崩溃。