02 · 常用命令(Common Commands)

📅 预计 60 分钟 | ⭐ = 重要知识点 | 📌 中英术语见文末
🛠 本讲命令基于 Docker 引擎,均可直接运行


2.0 先给直觉:遥控器上的按钮

上一讲认识了容器和镜像这对"货物"和"模板",这一讲给遥控器配齐按钮:怎么把镜像拿回来(pull)、怎么开箱(run)、怎么开关(start/stop)、怎么进去检修(exec)、怎么打扫卫生(prune)。

命令再多,本质就两件事:管镜像管容器。按这个主线记,就不会乱。

💡 记忆口诀:镜像用 docker image ...,容器用 docker container ...;不带子命令的 docker images / docker ps 是它们的简写。


2.1 镜像管理:把"模板"拿回来

拉取与查看 ⭐

docker pull nginx:1.25    # 从镜像仓库拉取 nginx 1.25 版本
docker images             # 列出本机所有镜像

docker pull 会显示一层层下载进度——这正是第 1 讲说的"分层拉取":公共层已存在时秒过,只下载缺失层。实际输出大概长这样:

$ docker pull nginx:1.25
1.25: Pulling from library/nginx
...
Digest: sha256:0d4e23accc7d...
Status: Downloaded newer image for nginx:1.25
docker.io/library/nginx:1.25

结尾的 docker.io/library/nginx:1.25 是镜像的完整名字docker.io(仓库地址)、library(组织)、nginx(仓库名)、1.25(标签)。平时用简写 nginx:1.25,Docker 会自动补全默认地址。

docker images 输出类似:

REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        1.25      a6bd71f48f68   2 weeks ago   187MB
hello-world  latest    d2c94e258dcb   4 months ago  13.3kB
  • REPOSITORY:镜像所属仓库名。
  • TAG:版本标签,latest 是默认标签,不要在生产用它精确指定版本
  • IMAGE ID:镜像唯一标识,取前若干位即可指代,如 docker rmi a6bd71f48f68

删除与打标签

docker rmi nginx:1.25         # 删除指定镜像(有容器在用会失败)
docker tag nginx:1.25 mynginx:v1   # 给镜像加个别名标签,不复制、只引用

docker tag 很有意思:它不改动镜像内容,只是给同一个镜像 ID 多起一个名字。上传私有仓库、指定版本部署时常用。

查看镜像细节

docker history nginx:1.25     # 查看镜像的分层历史(每个 RUN/COPY 一层)
docker image inspect nginx:1.25 # 查看镜像的详细元数据(JSON 格式)

⚠️ 常见错误

  1. rmirm 混淆docker rmi 删镜像,docker rm 删容器,字母只差一个 i。
  2. 镜像被容器占用删不掉:先 docker rm 容器 或删掉该容器,再 docker rmi
  3. 滥用 latestlatest 会变,今天拉和三个月后拉可能不是同一个版本,交付时要锁定具体版本号。

2.2 容器生命周期:开箱、使用、关箱

创建并运行 ⭐

docker run -d -p 8080:80 --name web nginx:1.25

参数拆解(高频,务必记牢):

  • -d:后台运行(detach),终端不被占住。
  • -p 8080:80:端口映射,宿主机 8080 → 容器 80(详见第 3 讲)。
  • --name web:给容器起名,后续用名字操作比用 ID 方便。
  • nginx:1.25:镜像名 + 标签。

docker run 会先检查本地镜像,没有则自动 pull,然后创建并启动容器。运行一次 = 新建一个容器,哪怕镜像相同。

其他常用参数:

docker run -it --rm ubuntu bash   # -it 交互式终端;--rm 退出后自动删除容器
docker run -d --restart=always nginx   # 崩溃/重启后自动拉起

查看容器状态 ⭐

docker ps          # 只看运行中的容器
docker ps -a       # 看所有容器(含已停止的),-a 是 all

docker ps 输出的关键列:

  • CONTAINER ID:容器 ID,前几位即可指代。
  • STATUS:如 Up 5 minutesExited (0)
  • PORTS:端口映射,如 0.0.0.0:8080->80/tcp

启动、停止、重启、删除

docker start web       # 启动一个已停止的容器(复用原容器,不新建)
docker stop web        # 优雅停止(发 SIGTERM,等超时后 SIGKILL)
docker restart web     # 重启
docker rm web          # 删除容器(停止后才能删;或加 -f 强删)

进入运行中的容器检修 ⭐

docker exec -it web bash    # 进入容器内部,开一个交互式 shell

容器里操作完 exit 退出,容器继续运行——exec 只是"进去看看",不影响主进程。

exec 不只能开 shell,还能直接在容器里执行单条命令:

docker exec web ls /etc/nginx      # 在容器里执行一条命令,不进交互终端
docker exec -it db mysql -uroot -p # 直接跑容器的 mysql 客户端

这种"单条命令"用法在排错时尤其好用:不用进去,一条命令就能看到容器里的文件、进程、网络状态。

文件拷贝与资源限制

容器和宿主机之间传文件,用 docker cp(类比 scp):

docker cp ./config.conf web:/etc/nginx/conf.d/   # 宿主机 → 容器
docker cp web:/var/log/nginx/access.log ./       # 容器 → 宿主机

给容器划资源边界,防止一个容器把整台机器吃满:

docker run -d --memory=512m --cpus=1 --name app nginx   # 限制内存 512MB、CPU 1 核
docker stats                # 实时看各容器 CPU / 内存占用

内存超限的容器会被内核 OOM 杀掉(第 6 讲展开)。生产环境务必给容器设资源上限,这是"多容器共享一台机器"的秩序保障。

容器命名规则

--name 不是随便起的,规则和变量名类似:只能由字母、数字、-_ 组成,且同一台机器上容器名唯一。名字冲突时 docker run 会直接报 Conflict,需要换名或先删旧的。

一句话速查表

想做什么 命令
拉镜像 docker pull 镜像:标签
看本地镜像 docker images
删镜像 docker rmi 镜像
新建并跑容器 docker run -d --name 名 镜像
看运行中的容器 docker ps
看所有容器 docker ps -a
停/启容器 docker stop 名 / docker start 名
删容器 docker rm 名
进容器 docker exec -it 名 bash
看日志 docker logs -f 名
看占用 docker system df
清理 docker system prune

这张表不用背,多敲几遍自然记住;真记不清时查它比翻文档快。

⚠️ 常见错误

  1. runstart 分不清run = 新建 + 启动;start = 启动已存在的容器。容器没了,start 会报 No such container
  2. stop 不是删除stop 只是让容器进入 exited 状态,镜像、容器文件都还在。
  3. 没加 -it 就用 exec bash:会立刻退出,看不到交互界面;要 -it 才有真正的终端。
  4. 主进程一退容器就停:如果 docker run nginx 前台运行、看不到日志就退出,先 docker logs 看主进程是不是崩了。
  5. 不给容器设资源上限:生产多容器同机时,一个没限制的容器可能拖垮整台机器。

2.3 查看与清理:会开箱也要会收拾

查看容器内发生了什么

docker logs web          # 查看容器日志
docker logs -f web       # -f 跟随输出(类似 tail -f),排错首选
docker top web           # 查看容器内的进程
docker stats             # 实时看各容器的 CPU / 内存占用
docker inspect web       # 查看容器全部配置(JSON 格式,最全)

排错三板斧:docker ps -a 看状态 → docker logs 看日志 → docker inspect 看配置。

网络相关命令在容器排查里也很常用(第 3 讲详细展开,这里先混个脸熟):

docker network ls          # 列出所有网络
docker port web            # 查看容器端口映射
docker inspect web         # 里头的 NetworkSettings 字段能看到容器的 IP 和网络

磁盘与清理 ⭐

docker system df         # 看镜像、容器、卷、构建缓存各占多少磁盘
docker system prune      # 清理:停止的容器、无用网络、悬空镜像、构建缓存
docker system prune -a   # 更强:连"没被任何容器使用"的镜像也一起清

更精准的子命令:

docker container prune   # 只删已停止的容器
docker image prune       # 只删悬空镜像(dangling,没标签的)
docker volume prune      # 只删没有被容器引用的卷(小心,数据没了)

容器生命周期状态 ⭐

容器状态是概念题常客,一张图记住:

created(已创建未启动)
   ↓ docker start
running(运行中)
   ↓ 主进程退出 / docker stop
exited(已停止)
   ↓ docker rm
(消失)

此外还有 paused(暂停,进程挂起不占 CPU)和 restarting(正在重启)两种状态。

⚠️ 常见错误

  1. prune 误删数据docker system prune -a 会删掉没被使用的镜像,volume prune 会删卷——删除前先 docker system df 看清楚。
  2. 查不到日志就瞎猜:容器一启动就退,十有八九问题在日志里,先 docker logs 再动容器配置。
  3. 忘记回收资源:频繁 run 测试后磁盘会积攒一堆悬空镜像和停止的容器,养成定期 docker system prune 的习惯。

📌 双语术语表(本讲)

中文 English 记忆点
拉取镜像 pull 从仓库下载
删除镜像 rmi remove image
打标签 tag 给镜像加别名
运行容器 run 新建并启动
后台运行 detached / -d 不占终端
交互终端 interactive tty / -it 进入容器操作
启动/停止 start / stop 复用容器
删除容器 rm remove container
进入容器 exec 进去检修
查看日志 logs 排错第一步
清理 prune 打扫卫生
悬空镜像 dangling image 没标签的镜像
文件拷贝 cp 容器与宿主机互传
内存限制 memory limit --memory=512m
CPU 限制 cpu limit --cpus=1

⭐ 本讲考点清单

  1. docker pull / docker images / docker rmi / docker tag 的用法
  2. docker run 常用参数:-d-p--name-it--rm--restart
  3. run = 新建 + 启动;start = 启动已存在的容器
  4. stop 只停止不删除;rm 删除;ps -a 看所有容器
  5. exec -it 进入运行中的容器,退出不影响主进程
  6. 容器状态流转:created → running → exited → (删除)
  7. logs -f / inspect / stats 是排错三板斧
  8. system df 看占用,prune 清理;volume prune 会删数据
  9. 镜像被容器占用时删不掉,先删容器
  10. latest 标签不锁定版本,生产用具体版本号
  11. docker cp 在容器与宿主机之间传文件
  12. --memory / --cpus 给容器划资源上限,防 OOM
  13. 容器名唯一,命名规则:字母、数字、-_
  14. 镜像完整名字 = 仓库地址 + 组织 + 仓库名 + 标签