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 stop 再 docker 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,那才是真正定制化镜像的开始。