Docker 命令速查表
Docker 常用命令速查:run、ps、build、compose、exec、logs、volume 等高频命令对照,附中文说明,容器化开发与运维时快速查阅。
原理解析
Docker 用「镜像」打包应用与其依赖,用「容器」运行镜像的实例。镜像由多层只读层组成(可缓存复用),容器在镜像之上加一层可写层,因此启动快、彼此隔离。
核心生命周期:build 从 Dockerfile 构建镜像,run 启动容器,ps 查看运行态,exec 进入容器内执行命令,rm/rmi 清理。用卷(volume)挂载宿主目录可让数据在容器销毁后保留。
什么时候该查这张表
这张表在你要排查容器问题或快速执行一次性任务时有用。它的价值在于把高频操作压缩成能直接粘贴的命令:清理占满磁盘的悬空镜像、看容器为何退出、进入已停止的容器。
不该查的情况:你在设计容器化架构或编排多容器部署。镜像分层策略、volume 规划、网络拓扑属于 Docker 架构范畴,本表给不出建议——同样一条 docker run 写法好坏,取决于镜像是否可信、数据是否需要持久化。
判断标准:临时验证、CI 步骤、排查问题时用本表足够;进入生产部署需要明确 volume、restart 策略、资源限制与日志轮转,这些都不是本表覆盖的范围,缺一个都会在生产上出事。
特别注意 --rm 与数据卷:一次性容器加 --rm 很方便,但前提是数据都在 volume 里。若容器内写文件后容器被删,数据一并丢失且无法恢复,这是本地调试最常见的数据丢失原因。
边界与常见陷阱
悬空镜像占满磁盘但 docker images 看不到
重新构建时旧镜像变成 <none>:<none>(悬空镜像),「docker images」 默认按仓库名过滤会把它们隐藏,而它们仍占着磁盘。构建频繁时这是磁盘告警的头号原因。用 docker images -f "dangling=true"「 查看,用 」docker image prune -f 清理。清理前确认没有需要回滚的旧版本。
容器「运行中」但服务不响应,原因可能在宿主机
状态显示 Up 不代表应用可用:进程可能已死锁但 PID 1 未退出,也可能绑定了错误端口或只监听 127.0.0.1 导致外部访问不到。排查顺序是:docker logs 看应用日志、docker exec 在容器内 curl 本地确认服务是否监听、再从宿主机 curl 确认端口可达。三步能区分是应用问题、容器网络问题还是防火墙问题。
volume 与容器文件系统是两套存储
容器可写层随容器删除而消失,volume 独立于容器生命周期。只在容器内写文件(配置、数据库文件、上传目录)而不挂 volume,重启换一个容器数据就没了。开发环境可用 --mount type=bind 挂宿主目录,但生产要用 named volume 或外部存储,并注意 bind 挂载在 Linux 上属性能显著下降。
与相邻内容的分工
要查 Dockerfile 指令与镜像构建最佳实践,本表不涉及;构建上下文、层缓存、多阶段构建属于单独的专题。
要编排多容器或跨主机调度,用 Docker Compose 或 Kubernetes,本表只覆盖单容器操作。
涉及网络不通时,先区分是容器间通信(同一 bridge 网络)还是出站访问(代理、镜像仓库),后者与本表命令无关。
若目的是做镜像安全扫描或 SBOM 生成,属供应链工具范畴,不是 docker 基础命令。
实战片段
要点:① 悬空镜像需要 -f "dangling=true" 才可见,是磁盘告警头号原因,而 system prune -a 会删所有未使用资源,范围必须先看清;② 排查退出先看 ExitCode 与 OOMKilled,再看实际入口,能快速区分崩溃、OOM 与配置错误;③ Up 不代表可用,容器内 curl 与宿主机 curl 两次探测能定位是应用、容器网络还是防火墙;④ --rm 只在数据全在 volume 时安全。
# ① 磁盘排查:悬空镜像是头号原因(docker images 默认看不见它们)
docker images -f "dangling=true"
docker system df # 先看整体占用构成
docker image prune -f # 只删悬空镜像,安全
# docker system prune -a 会删所有未使用镜像/网络/卷 —— 先 -f 前三行看清范围再用
# ② 容器为何退出:按 4→1 顺序看
docker ps -a --filter "status=exited" --format '{{.Names}} {{.Status}}'
docker logs <name> --tail 200 # ① 应用输出
docker inspect <name> --format '{{.State.ExitCode}} {{.State.OOMKilled}} {{.State.Error}}'
docker inspect <name> --format '{{.Path}} {{json .Args}}' # 实际执行的入口
# ③ Up 但不响应:区分应用 / 容器网络 / 宿主机
docker exec <name> curl -sS -o /dev/null -w '%{http_code}
' http://127.0.0.1:3000 # 容器内
curl -sS -o /dev/null -w '%{http_code}
' http://127.0.0.1:3000 # 宿主机
# ④ 一次性容器:--rm 前提是数据都在 volume 里
docker run --rm -it --network host node:22-alpine node -e "console.log(1+1)"
docker run --rm -v mydata:/data alpine ls -la /data # 数据在 volume,删容器不丢
# ⑤ 查端口占用(本机最常踩的坑:Address already in use)
docker ps --format '{{.Names}} {{.Ports}}' | grep 3000实践注解
- docker run 与 docker-compose 的字段不是一一对应端口、卷、环境变量的写法在两边语义相近但格式不同,机械转换容易漏掉 depends_on、healthcheck 这类只有 compose 才有的编排能力。转换后要逐项核对而不是只看能否启动。
- 容器里的 localhost 不是宿主机容器有独立网络命名空间,连「本机的数据库」必须用 host.docker.internal(Docker Desktop)或宿主内网地址。这是「本机能连、容器连不上」的首要原因。
- 镜像层缓存与 :latest 的组合会带来不可复现的构建基础镜像用 :latest 时,同一份 Dockerfile 在不同时间构建会得到不同结果。生产镜像应固定到具体 tag 或 digest,并把 apt/pip 安装与源码拷贝分层,避免每次改代码都重装依赖。
数据来源
- Docker CLI reference (docs.docker.com)
- Compose specification (compose-spec.io)
上述编号、名称与定义均来自公开规范,本站不主张对规范数据本身的独创性;本页的编排方式、中文释义与实践注解由本站撰写。
| 命令 | 说明 |
|---|---|
| docker --version | 查看 Docker 客户端版本 |
| docker version | 查看客户端与服务端版本 |
| docker info | 显示系统级信息(驱动、镜像数等) |
| docker login | 登录镜像仓库(如 Docker Hub) |
| docker pull | 从仓库拉取镜像 |
| docker push | 推送镜像到仓库 |
| docker images | 列出本地镜像(-a 含中间层) |
| docker rmi | 删除本地镜像(-f 强制) |
| docker build | 用 Dockerfile 构建镜像(-t 打标签) |
| docker run | 运行一个新容器(-d 后台 / -p 端口) |
| docker ps | 列出运行中的容器(-a 全部) |
| docker stop | 停止一个运行中的容器 |
| docker start | 启动已停止的容器 |
| docker restart | 重启容器 |
| docker rm | 删除容器(-f 强制 / -v 卷) |
| docker exec | 在运行容器内执行命令(-it 交互) |
| docker logs | 查看容器日志(-f 跟踪) |
| docker cp | 容器与宿主机间拷贝文件 |
| docker inspect | 查看容器/镜像的底层 JSON 信息 |
| docker top | 查看容器内运行的进程 |
| docker compose up | 启动 compose 定义的服务(-d 后台) |
| docker compose down | 停止并移除 compose 资源 |
| docker compose build | 构建 compose 中的镜像 |
| docker network ls | 列出 Docker 网络 |
| docker volume ls | 列出数据卷 |
| docker system prune | 清理无用镜像/容器/网络(-a 全量) |
| docker stats | 实时查看容器资源占用 |
常见问题
docker run 和 docker create 有什么区别?
docker create 只创建容器但不启动;docker run 等于 create + start,会立即启动容器并在前台(或加 -d 在后台)运行主进程。
如何进入正在运行的容器?
用 docker exec -it <容器> /bin/sh(或 /bin/bash)打开交互式终端;若想用新进程替换可加 --rm 在退出后自动清理。
如何查看容器占用的磁盘空间?
docker system df 查看镜像/容器/卷的整体占用;docker ps -s 看单个容器的可写层大小;清理用 docker system prune -a。
如何把容器里的改动保存为新镜像?
用 docker commit <容器> <新镜像名> 把当前容器状态固化为镜像;但更推荐写 Dockerfile 以版本化、可复现地构建。