Docker / 命令文档
Docker 常用命令(面试向)
概述
本篇是「Docker 面试核心」系列第二篇,覆盖日常使用频率最高的 17 个命令:镜像的 pull/push/build/rmi,容器的 run/exec/ps/stop/start/restart/rm,排障的 logs/inspect/stats/cp,以及治理用的 system prune。每个命令都给出测试机上的真实输出。
命令题的答题套路:说清「作用于什么对象(镜像/容器)+ 关键参数 + 一个真实输出」。本篇所有输出均来自 Docker 26.1.4 实测。
运行与执行:run / exec
run 创建并启动容器;exec 在已运行容器里执行命令。两者对象不同,exec 不能用于已停止的容器。
# 前台一次性执行,--rm 用完即删 $ docker run --rm busybox:latest echo "hello from container" hello from container # -d 后台运行 + 命名,返回容器完整 ID $ docker run -d --name kb-web busybox:latest sh -c 'while true; do date; sleep 2; done' 004f0355cbba8daa905754084174f86c62443ba8530854fd7e9e19adb1fcc4c5 # exec 进入运行中的容器 $ docker exec kb-web sh -c 'echo pid=$$ host=$(hostname)' pid=8 host=004f0355cbba
面试要点:
- run 的常见参数组:
-d后台、--name命名、-p 宿主:容器端口、-v挂载、--rm用完即删、-e环境变量 docker run的命令若不是-d会占住前台,退出即容器停止(除非主进程常驻)- exec vs attach:attach 是接上主进程的 stdio(退出可能带停容器),exec 是新开进程,运维排障一律 exec
- 同名容器需先删才能再建,脚本里常用
docker rm -f kb-web幂等处理
生命周期:ps / stop / start / restart / rm
$ docker ps --filter name=kb-web --format "table {{.Names}}\t{{.Image}}\t{{.Status}}"
NAMES IMAGE STATUS
kb-web busybox:latest Up Less than a second
$ docker stop kb-web && docker ps -a --filter name=kb-web --format "{{.Names}} {{.Status}}"
kb-web Exited (137) Less than a second ago
$ docker start kb-web && docker restart kb-web && docker rm kb-web # rm 需先停止(或 -f)面试要点:
docker stop先发 SIGTERM 给 PID 1,宽限期(默认 10s)后 SIGKILL —— Exited (137) 就是 128+9 被强杀的痕迹ps只看运行中,ps -a含已停止;--format与--filter是脚本化取数的标配restart等价 stop + start,但 stop 超时策略可单独指定(-t)rm删除已停止容器,rm -f强制;数据在可写层里会一起没,重要数据先落 Volume
日志与元数据:logs / inspect
$ docker logs --tail 3 kb-web
Tue Sep 8 13:55:58 UTC 2026
Tue Sep 8 13:56:00 UTC 2026
$ docker inspect -f "pid={{.State.Pid}} image={{.Config.Image}} mem_limit={{.HostConfig.Memory}}" kb-web
pid=27743 image=busybox:latest mem_limit=0
$ docker inspect -f "ip={{.NetworkSettings.IPAddress}}" kb-web
ip=172.17.0.2面试要点:
- logs 默认读 json-file 日志驱动落盘的文件(/var/lib/docker/containers/<id>/);没配 log-opts 会无限膨胀,生产务必配 max-size/max-file
- 常用参数:
-f跟踪、--tail N、-t带时间戳、--since - inspect 是「一切排障的终点」:State(退出码/OOMKilled)、HostConfig(资源限制)、NetworkSettings(IP/端口)全在里面
-f用 Go 模板直接抽字段,比人眼翻 JSON 快得多,面试加分项
文件拷贝与资源快照:cp / stats
# 宿主机 -> 容器
$ echo "from host" > /tmp/kb_cp.txt
$ docker cp /tmp/kb_cp.txt kb-web:/tmp/kb_cp.txt
$ docker exec kb-web cat /tmp/kb_cp.txt
from host
# 容器 -> 宿主机
$ docker cp kb-web:/tmp/kb_out.txt /tmp/kb_out.txt && cat /tmp/kb_out.txt
from container
# 资源快照(--no-stream 只取一次,默认是持续刷新)
$ docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
NAME CPU % MEM USAGE / LIMIT
kb-web 0.00% 276KiB / 1.952GiB面试要点:
docker cp不需要容器里装 ssh,是搬运配置与产物最直接的方式;路径支持-走 tar 流- stats 的 MEM USAGE / LIMIT 一眼看出限制是否生效(LIMIT 是 -m 设的值,未设则显示宿主机内存)
- 批量脚本化监控:
stats --no-stream输出稳定适合给监控采集;长期采集用 cAdvisor/Prometheus
镜像操作:pull / push / build / rmi
$ docker pull busybox:latest # 拉取(配 registry-mirrors 后国内秒级) Status: Downloaded newer image for busybox:latest $ docker build -t kb-test:1.0 /tmp/kb_build # 按 Dockerfile 构建(见 Dockerfile 篇) $ docker push localhost:5000/alpine:kb # 推送到仓库(见镜像篇私有仓库) $ docker rmi busybox:kb-demo # 删除镜像(被容器引用时需先删容器)
面试要点:
- pull 拉的是「仓库:Tag」,Tag 只是可变指针,稳定引用要用 Digest(见镜像篇)
- build 的上下文是参数目录整体上传给 daemon,
.dockerignore能显著加速构建 - rmi 删除 Tag 指向的唯一镜像 ID;「Un tag 一个名字」与「删层数据」是两回事
磁盘治理:system prune
$ docker system df # 先看占用账单 TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 4 1 11.84MB 11.84MB (100%) Containers 1 1 0B 0B Local Volumes 0 0 0B 0B Build Cache 11 0 291B 291B $ docker system prune -f # 清悬空镜像 + 已停容器 + 无用网络 + 构建缓存 Total reclaimed space: 296B
面试要点:
- prune 默认只删「悬空镜像(dangling,无 Tag)+ 停止容器 + 无引用网络 + 构建缓存」;
-a连未被容器使用的有 Tag 镜像一起删 - 磁盘告警的排查顺序:
system df定位 →images -f dangling=true/ps -a --filter status=exited找对象 → 针对性清理 - 生产慎用
-a --volumes:会把没在跑的服务镜像和数据卷一并清掉
高频面试题速答
| 问题 | 一句话答案 |
|---|---|
| stop 后 Exited (137) 是什么 | 128+9,宽限期后收到 SIGKILL;说明容器没在 10 秒内优雅退出 |
| exec 和 attach 区别 | exec 新开进程不干扰主进程,attach 接主进程 stdio、退出可能停容器 |
| 容器日志在哪 | json-file 驱动在 /var/lib/docker/containers/<id>/<id>-json.log,务必配轮转 |
| 怎么查容器 IP 和资源限制 | docker inspect 抽 NetworkSettings.IPAddress 与 HostConfig,Go 模板直取字段 |
| cp 需要容器里装 ssh 吗 | 不需要,docker cp 直接通过 daemon 搬运,容器无需任何额外进程 |
| prune -a 和 prune 区别 | prune 只清悬空层与停止容器,-a 额外删除所有未被容器引用的镜像 |
| 容器删除后数据还在吗 | 可写层数据随容器删除,持久数据必须放 Volume 或 Bind Mount |