Docker / 命令文档

Docker 常用命令(面试向)

$ docker 8 个章节 Linux 命令详解

概述

本篇是「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

同分类 · 其他命令文档