3、Docker基础命令:docker run、docker ps、docker stop、docker rm、docker images、docker rmi、docker pull、docker push

好,咱们直接进入正题。Docker 的命令看着多,其实核心就那几条。你只要把这 8 个命令搞明白,日常开发基本就够用了。我当年刚接触 Docker 时,就是靠这几个命令撑过了整个项目周期。

3.1 docker run:启动容器的起点

docker run 是使用频率最高的命令,没有之一。它的作用就是创建并启动一个容器。

最基本的用法:

docker run nginx

这条命令会从 Docker Hub 拉取 nginx 镜像(如果本地没有),然后启动一个容器。但你会发现,终端被占住了,按 Ctrl+C 容器就停了。这显然不是我们想要的。

所以,实际项目中我几乎都会加上 -d 参数:

docker run -d nginx

-d 表示后台运行,容器会在后台默默工作,不会占用你的终端。

小技巧: 我个人习惯在 docker run 时加上 --name 给容器命名,不然 Docker 会随机生成一个名字,比如 "focused_curie" 这种,你根本记不住。
docker run -d --name my-nginx nginx

端口映射也是家常便饭。容器内部的服务默认只能在容器内访问,你需要把端口暴露出来:

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

这条命令把宿主机的 8080 端口映射到容器的 80 端口。现在你访问 http://localhost:8080 就能看到 nginx 的欢迎页了。

注意: 端口映射的格式是 宿主机端口:容器端口,顺序千万别搞反。我曾经在生产环境上搞反过一次,排查了半天才发现是端口映射写错了。

3.2 docker ps:查看容器状态

容器启动后,怎么知道它跑没跑?用 docker ps

docker ps

这条命令会列出所有正在运行的容器。输出包含容器 ID、镜像、创建时间、状态、端口映射等信息。

如果你想看所有容器(包括已经停止的),加上 -a 参数:

docker ps -a

嗯,这里要注意。很多新手以为容器停了就没了,其实它还在那里,只是状态变成了 "Exited"。用 docker ps -a 就能看到这些"尸体"。

我个人还喜欢用 -q 参数,只返回容器 ID:

docker ps -q

这个在脚本里特别有用,比如批量停止所有容器:

docker stop $(docker ps -q)

3.3 docker stop:优雅地停止容器

容器跑起来了,想让它停下来怎么办?用 docker stop

docker stop my-nginx

你可以指定容器名,也可以指定容器 ID(不用写全,前几位就够了)。

docker stop 会先给容器发送 SIGTERM 信号,让容器内的进程有机会做清理工作。如果 10 秒后还没停,就会发送 SIGKILL 强制杀死。这个超时时间可以用 -t 参数调整:

docker stop -t 30 my-nginx
核心区别: docker stop 是优雅停止,docker kill 是直接杀死。我建议优先用 stop,除非你确定容器里的服务不需要做任何清理。

3.4 docker rm:删除容器

容器停了之后,它还在磁盘上占着空间。想彻底删除,用 docker rm

docker rm my-nginx

注意,只能删除已停止的容器。如果你想强制删除正在运行的容器,加 -f 参数:

docker rm -f my-nginx

这个 -f 其实相当于先 docker stopdocker rm,一步到位。

批量删除所有已停止的容器,我常用这条命令:

docker container prune

或者用更传统的方式:

docker rm $(docker ps -a -q)
避坑指南: 我曾经在测试环境上跑了个脚本,忘记加过滤条件,结果把生产环境的容器也删了。所以,批量操作前一定要确认你选中的容器是对的。

3.5 docker images:查看本地镜像

镜像就是容器的"模板"。用 docker images 可以查看本地已经下载了哪些镜像:

docker images

输出包含仓库名、标签、镜像 ID、创建时间和大小。比如:

REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    605c77e624dd   2 weeks ago   141MB
ubuntu       22.04     2dc39ba059dc   3 weeks ago   77.8MB

你会发现同一个镜像可以有多个标签(TAG)。latest 是最新版本,但我建议你在生产环境里指定具体版本号,比如 nginx:1.25,避免 unexpected 升级。

3.6 docker rmi:删除镜像

镜像占空间,不用的就删掉。用 docker rmi

docker rmi nginx:latest

如果镜像被某个容器引用了(即使容器已停止),也删不掉。你需要先删容器,再删镜像。或者用 -f 强制删除:

docker rmi -f nginx:latest

批量删除所有未被使用的镜像:

docker image prune -a
我的习惯: 每周五下班前跑一次 docker system prune,清理所有无用的容器、网络、镜像和构建缓存。磁盘空间能省出好几个 G。

3.7 docker pull:拉取镜像

docker run 在本地没有镜像时会自动拉取,但有时候你想提前把镜像下载下来,或者更新到最新版本。这时候用 docker pull

docker pull nginx:1.25

默认从 Docker Hub 拉取。如果你想从私有仓库拉取,加上仓库地址:

docker pull registry.example.com/my-app:v1.0

拉取前需要先登录:

docker login registry.example.com

3.8 docker push:推送镜像

你构建了自己的镜像,想分享给团队或者部署到服务器,就需要推送到镜像仓库。用 docker push

docker push my-app:v1.0

推送前,镜像名必须包含仓库地址。比如你要推送到 Docker Hub 的 yourusername/my-app

docker tag my-app:v1.0 yourusername/my-app:v1.0
docker push yourusername/my-app:v1.0

如果是私有仓库:

docker tag my-app:v1.0 registry.example.com/my-app:v1.0
docker push registry.example.com/my-app:v1.0
重要提醒: 推送前一定要 docker login。我见过有人推了半天发现没登录,所有推送都失败了。另外,镜像标签最好带上版本号,别用 latest 推生产环境,你想想看,哪天别人拉了个 latest 结果跟你的不一样,那不就出事了?

3.9 命令速查表

最后,给你一张速查表,方便平时翻阅:

命令 作用 常用参数
docker run 创建并启动容器 -d 后台运行,-p 端口映射,--name 命名
docker ps 查看容器列表 -a 显示所有,-q 只显示 ID
docker stop 停止容器 -t 超时时间
docker rm 删除容器 -f 强制删除
docker images 查看本地镜像 无特殊参数
docker rmi 删除镜像 -f 强制删除
docker pull 拉取镜像 指定标签
docker push 推送镜像 需先登录

这 8 个命令,说白了就是 Docker 的"增删改查"。你每天跟它们打交道,用熟了之后,闭着眼睛都能敲出来。下一章咱们聊聊 Dockerfile,那才是真正定制化镜像的开始。