Docker CLI 命令速查表 - Docker 常用命令大全
面向应用开发与运维工程师的 Docker 命令手册,覆盖镜像构建、容器生命周期、网络与卷、多容器编排(Compose)与资源清理。相比系统自带的 container 管理工具,Docker 的镜像分层与隔离机制,才是排查容器启动失败、端口映射错位、镜像体积膨胀这些实际问题的关键。读完可从一个镜像开始把服务跑起来,并独立定位启动、网络、磁盘三类最常见的容器故障。
典型使用场景
面向应用开发与运维工程师:把本地服务用镜像跑起来、构建可复现的镜像、用 Compose 编排多容器,并在容器启动失败、端口映射错位、镜像体积膨胀、磁盘被占满时独立定位与处置。
镜像 Image 8
docker imagesdocker pull nginx:alpinedocker build -t app:1.0 .docker rmi <image>docker tag app:1.0 reg/app:1.0docker save -o app.tar app:1.0docker load -i app.tardocker pull alpine:3.20 --platform=linux/amd64容器 Container 9
docker ps -adocker run -d -p 8080:80 --name web nginxdocker exec -it web shdocker logs -f --tail 100 webdocker stop web && docker rm webdocker inspect webdocker start web && docker restart webdocker statsdocker top web网络与卷 Network & Volume 8
docker network lsdocker network create appnetdocker network connect appnet webdocker volume lsdocker run -v data:/var/lib/app appdocker run -v $(pwd):/app appdocker volume create appdatadocker volume prune仓库 Registry 6
docker logindocker login registry.example.comdocker push app:1.0docker pull ubuntu:22.04docker search nginxdocker logout构建与调试 Build & Debug 7
docker build -t app:1.0 --no-cache .docker build -t app:1.0 --target=dev .docker history app:1.0docker diff <container>docker cp app.conf web:/etc/nginx/conf.d/docker cp web:/var/log/nginx/access.log ./docker events --since 5mCompose 与清理 9
docker compose up -ddocker compose logs -f svcdocker compose downdocker compose psdocker compose restartdocker system dfdocker system prune -adocker container prunedocker image prune -a常见问题 FAQ 5
Q: 如何清理所有未使用的 Docker 资源?Q: 如何查看容器日志?Q: 如何进入运行中的容器?Q: 如何将宿主机文件复制到容器?Q: 重启策略有哪些?高频补充命令(容量增强 · REQ-02) 30
docker system dfdocker system prune -a --volumesdocker buildx build --platform linux/amd64,linux/arm64 -t app:dev --pushdocker build --no-cache -t app:dev .docker build -f Dockerfile.prod -t app:prod .docker image history <image>docker image inspect <image> --format={{.Size}}docker statsdocker top <container>docker diff <container>docker rename <old> <new>docker update --restart=unless-stopped <container>docker wait <container>docker pause <container>docker unpause <container>docker kill -s SIGTERM <container>docker network create <name>docker network connect <net> <container>docker network inspect <net>docker volume create <name>docker volume prunedocker volume inspect <vol>docker secret create <name> -docker context lsdocker logindocker logoutdocker tag <src> <reg>/<img>:<tag>docker search <term>docker events --since 24hdocker scout quickview <image>参数矩阵
| 参数 | 作用 | 示例 |
|---|---|---|
-d | 后台(detached)运行容器 | docker run -d -p 8080:80 nginx |
-p | 端口映射,格式 主机端口:容器端口 | docker run -d -p 8080:80 nginx |
--name | 为容器指定可读名字,便于后续操作 | docker run -d --name web nginx |
-v | 挂载数据卷或绑定目录,持久化数据 | docker run -v /data:/app/data nginx |
--rm | 容器退出后自动删除,避免残留 | docker run --rm alpine echo hi |
-e | 向容器内注入环境变量 | docker run -e NODE_ENV=prod app |
--network | 加入指定网络,容器间可用名字互访 | docker run --network appnet web |
-it | 分配交互式终端,用于进入容器 shell | docker exec -it web sh |
--restart | 退出后的重启策略(no/on-failure/always) | docker run -d --restart unless-stopped web |
--platform | 指定目标架构(ARM Mac 拉 amd64) | docker pull --platform=linux/amd64 nginx |
--no-cache | 构建时忽略层缓存,强制重跑所有层 | docker build --no-cache -t app . |
-f | 指定 Dockerfile 路径 | docker build -f Dockerfile.prod -t app . |
易错点与避坑指南
现象端口映射后仍无法从宿主机其他进程或外网访问容器服务。
原因把 主机:容器 写反,或容器内进程只监听 127.0.0.1 而非 0.0.0.0。
处置确认 -p 8080:80 是「宿主机端口:容器端口」;容器应用需监听 0.0.0.0 才能被外部访问。
现象docker exec 进入容器报 OCI runtime exec failed: exec: "bash": not found。
原因镜像基于 alpine/scratch 等精简镜像,没有内置 bash。
处置改用 sh:docker exec -it web sh;或在 Dockerfile 中 apk add bash 后再用 bash。
现象docker build 每次都重新拉取基础镜像、层缓存不命中。
原因基础镜像用 latest 标签,或把易变的文件(源码)COPY 在不变的文件之前。
处置固定基础镜像版本(如 node:20-alpine);把不常变的依赖安装层放在前面,源码 COPY 放最后。
现象构建或运行报 No space left on device,宿主机磁盘被占满。
原因大量已停止容器、悬空镜像(<none>)、未清理的数据卷长期累积。
处置先 docker system df 看占用,再 docker system prune -a --volumes 清理;生产机设定期清理任务。
现象容器被强制退出,docker inspect 看到 ExitCode 137。
原因内存超限被 OOM Killer 杀掉(137 = SIGKILL)。
处置用 docker stats 看实时内存;为容器设合理 --memory 上限,或优化应用内存占用。
现象在 ARM Mac 上拉取的镜像放到 x86 服务器上跑报错 exec format error。
原因镜像架构与运行环境不一致(arm64 vs amd64)。
处置构建/拉取时显式指定目标平台:docker build --platform=linux/amd64 -t app . 并推送对应架构镜像。
现象在容器内修改了配置文件,重建镜像后改动全部丢失。
原因容器文件系统是临时的,未挂载持久卷。
处置用 -v 挂载命名卷或绑定目录(-v /host/path:/container/path)保存需要保留的状态。
排障路径
1容器起不来或闪退,先看日志
docker logs --tail 50 web从日志末尾定位启动失败的报错(配置错误、依赖缺失、端口占用)。
2确认容器退出状态与原因
docker inspect -f '{{.State}}' webExitCode 0=正常退出,137=OOM,139=段错误等,结合 Reason 判断。
3端口冲突或映射异常时列出所有容器端口
docker ps --format '{{.Names}}\t{{.Ports}}'核对 0.0.0.0:8080->80/tcp 是否如预期,避免端口被其他容器占用。
4磁盘被占满时先看各对象占用
docker system df区分 Images / Containers / Volumes 占用,再针对性清理。
5进入容器排查网络连通性
docker exec -it web sh -c "cat /etc/resolv.conf; ping -c1 8.8.8.8"分别验证 DNS 解析与出网连通,定位是网络配置还是镜像问题。
命令示例
后台运行并映射端口的 nginx 容器
docker run -d --name web -p 8080:80 nginx:alpine-p 8080:80 表示宿主机 8080 转发到容器 80,访问 http://localhost:8080 即可看到 nginx 欢迎页;-d 让容器后台运行,--name 便于后续用名字管理。
输出
b3f2c1a9d8e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b
挂载当前目录并进入交互 shell
docker run -it --rm -v "$(pwd)":/app -w /app node:18-alpine sh-v 把当前目录挂载到容器 /app,-w 设为工作目录,--rm 退出时自动删除容器,-it 提供交互终端,适合本地调试 Node 应用而无需本地安装 Node。
跟踪容器日志最后 100 行
docker logs -f --tail 100 web-f 实时跟踪后续日志,--tail 100 只从最后 100 行开始输出,排查启动崩溃或请求异常时第一命令。
清理未使用的镜像释放磁盘
docker system df先 docker system df 看占用,再决定是否 docker image prune -a 清理所有未被容器引用的镜像;删镜像前务必确认没有需要保留的版本。
输出
TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 12 5 1.4GB 621.5MB (43%) Containers 8 3 5.6MB 5.6MB (100%)
常见坑与注意事项
- docker run -p 是宿主端口:容器端口,写反会导致外部无法访问,且启动后不会报错,最难排查。
- prune -a 会删除所有没有容器在用的镜像,包含刚构建但未运行的版本,生产机执行前先 docker images 确认。
- exec 报 "executable file not found" 通常是镜像里没有该 shell,alpine 只带 sh,改用 docker exec -it <c> sh。
- run 时要传的 -e 环境变量和端口映射,容器启动后再改不会生效;需先停容器、删除后重新 run。
- bind mount 的源码目录若权限不足会报 permission denied,注意宿主目录属主与容器内用户是否一致。
提示
- docker run 的 -p 是 主机端口:容器端口,写反了会导致外部访问不到。
- exec 报 "executable file not found" 时换 sh:alpine 镜像通常没有 bash。
- prune -a 会删掉所有没有容器在用的镜像,生产机执行前先确认 docker images。
- docker system df 能快速查看磁盘占用,建议定期执行避免 /var/lib/docker 占满。
- docker compose restart 比 down/up 更快,但不会重建网络和卷,nginx 改配置后最适用。
常见问题
docker run 和 docker start 有什么区别?
docker run 基于镜像创建并启动一个新容器(首次运行);docker start 重新启动一个已存在但已停止的容器,不会创建新实例。调试已有容器状态时用 start,部署新服务时用 run。
如何清理 Docker 占用的磁盘空间?
用 docker system prune 删除停止的容器、悬空镜像和构建缓存;加 -a 可一并删除所有未被容器引用的镜像。生产环境谨慎使用,避免误删仍有价值的镜像。
容器和镜像是什么关系?
镜像是只读的模板,包含运行应用所需的代码、依赖和配置;容器是镜像的运行实例,在镜像层之上增加一个可写层。同一个镜像可以同时启动多个相互隔离的容器。
容器启动后立刻退出(Exited (0))怎么排查?
先 docker ps -a 看退出码:Exited (0) 通常是前台进程没有常驻(命令执行完就退出),加 -it 或改 Dockerfile 用前台启动命令(如 CMD ["nginx","-g","daemon off;"]);非 0 退出码则 docker logs <id> 看报错日志,多为缺依赖、权限或配置文件路径问题。
容器里访问 localhost 连不上,是怎么回事?
在容器内部,localhost 指的是容器自己而不是宿主机,所以宿主机上的服务在容器里用 localhost 是访问不到的。要访问宿主服务用宿主机标准网关 IP(macOS/Windows 用 host.docker.internal,Linux 用 --network host 或宿主内网 IP);要让容器间互通,让它们加入同一个自定义 network 后用容器名互相访问。
由 巧匠 维护
公开更新于 2026年9月10日,内容持续校对官方文档。