在现代云原生与微服务架构中,Docker 已经成为应用打包、交付与标准化运行的工业级基石。熟练掌握 Docker 命令行工具链,不仅能够显著提升本地开发调试效率,更是日常生产环境排障与容器运维的必备基本功。
本文将 Docker 核心命令按照容器生命周期、运维排查、文件快照、镜像构建、离线归档与系统清理六大维度进行结构化梳理,提供详尽的参数解析、生产示例与经典避坑对比。
一、Docker 核心架构与常用命令速查表
现代 Docker CLI 推行基于对象的管理命令(Management Commands,如 docker container run、docker image ls),同时也完全向前兼容传统扁平命令(如 docker run、docker ps)。
核心操作命令速查矩阵
| 场景分类 | 传统命令 | 现代管理命令 | 核心功能简述 |
|---|---|---|---|
| 创建并运行 | docker run |
docker container run |
创建并以后台/交互模式启动容器 |
| 查看容器 | docker ps |
docker container ls |
列出运行中/全部容器 |
| 进入容器 | docker exec |
docker container exec |
在运行容器中执行命令/打开 Shell 终端 |
| 查看日志 | docker logs |
docker container logs |
实时跟踪或截取容器标准输出日志 |
| 停止/启动 | docker stop / start |
docker container stop / start |
优雅停止或重新拉起容器 |
| 删除容器 | docker rm |
docker container rm |
删除已停止的容器(-f 强制删除) |
| 本地镜像 | docker images |
docker image ls |
列出本地拉取或构建的镜像 |
| 构建镜像 | docker build |
docker image build |
根据 Dockerfile 构建容器镜像 |
| 镜像归档 | docker save / load |
docker image save / load |
完整镜像层保存为 tar 包与恢复(带历史) |
| 容器快照 | docker export / import |
docker container export |
容器文件系统扁平导出与导入(丢弃历史) |
| 磁盘清理 | docker system prune |
docker system prune -a |
清理孤立镜像、停止容器与无主数据卷 |
二、容器生命周期管理 (Lifecycle)
容器的本质是宿主机上的一个受隔离的独立进程,其状态涵盖:created(已创建)、running(运行中)、paused(暂停)、restarting(重启中)、exited(停止)与 dead(死亡)。
1. docker run:创建并启动新容器
# 1. 后台守护进程模式启动 Nginx,映射 80 端口,挂载数据目录并命名
docker run -d \
--name mynginx \
-p 80:80 \
-v /opt/data:/data:ro \
--restart=always \
nginx:latest
# 2. 交互式模式启动 Ubuntu 容器并进入 bash 终端 (退出后容器自动销毁)
docker run -it --rm ubuntu:22.04 /bin/bash
# 3. 限制容器内存与 CPU 使用配额 (防止资源耗尽打死宿主机)
docker run -d \
--name app_service \
-m 512m \
--cpus 1.5 \
my-service:v1.0
2. docker start / stop / restart:状态启停
# 启动已被停止的容器
docker start mynginx
# 优雅停止运行中的容器 (默认发送 SIGTERM 信号,超时 10s 后发送 SIGKILL)
docker stop -t 15 mynginx
# 重启容器
docker restart mynginx
3. docker kill:强制终止容器
不同于 stop 的优雅等待,kill 直接向容器主进程发送系统信号:
# 强制终止容器 (默认发送 SIGKILL)
docker kill mynginx
# 向容器发送特定系统信号 (如平滑重载配置 SIGHUP)
docker kill -s HUP mynginx
4. docker rm:删除容器
# 1. 删除已停止的容器
docker rm mynginx
# 2. 强制删除运行中的容器并清理关联的匿名 Volume
docker rm -f -v mynginx
# 3. 批量删除所有处于退出 (exited) 状态的孤立容器
docker rm $(docker ps -a -q -f status=exited)
5. docker pause / unpause:暂停与恢复
利用 Linux Cgroups Freezers 机制挂起容器中所有进程,完全释放 CPU 占用但不释放内存:
# 暂停运行中的数据库容器
docker pause db01
# 恢复容器进程
docker unpause db01
三、容器日常运维与排查 (Operations)
1. docker ps:列出容器状态
# 1. 列出当前正在运行的容器
docker ps
# 2. 列出全量容器 (包含已停止退出的容器)
docker ps -a
# 3. 仅输出容器 ID (常用于批量管道组合)
docker ps -q
# 4. 高级格式化输出:只打印容器名、镜像与运行状态
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}"
2. docker exec:进入容器或执行命令
在已有容器内部运行额外调试进程(排障最常用工具):
# 1. 打开交互式 bash 终端进入容器内部
docker exec -it mynginx /bin/bash
# 2. 以 root 身份免密进入容器调试
docker exec -it -u 0 mynginx /bin/sh
# 3. 免交互直接获取容器内的特定输出
docker exec mynginx cat /etc/nginx/nginx.conf
[!WARNING] 切记避坑:绝不要使用已淘汰的
docker attach进入生产容器!docker attach会直接挂接到容器的 PID 1 主进程上,按下Ctrl+C会直接将容器主进程杀死导致服务瘫痪;而docker exec会开启全新的独立调试进程,退出时对容器主程序毫无影响。
3. docker logs:捕获容器日志
# 1. 实时跟踪滚动输出容器日志 (等同于 tail -f)
docker logs -f mynginx
# 2. 查看最新 100 条日志,并附带纳秒级标准时间戳
docker logs -f --tail 100 -t mynginx
# 3. 筛选指定时间之后的日志
docker logs --since "2026-03-01T12:00:00" mynginx
4. docker inspect:深度提取元数据
以 JSON 格式输出容器或镜像的完整底层配置,结合 --format Go 模板可实现精细化提取:
# 1. 快速提取指定容器的内网 IP 地址
docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mynginx
# 2. 查看容器的存储卷挂载映射详情
docker inspect --format '{{json .Mounts}}' mynginx | jq .
# 3. 查看容器真实的重启策略与健康检查状态
docker inspect --format '{{.State.Health.Status}}' mynginx
5. docker stats 与 docker top:资源消耗监控
# 1. 实时动态展示所有运行容器的 CPU、内存占用、网络 IO 与磁盘读写
docker stats
# 2. 查看指定容器在宿主机操作系统层面的进程清单
docker top mynginx
四、容器文件系统与镜像快照 (Filesystem)
1. docker cp:主机与容器双向文件拷贝
# 1. 从宿主机拷贝配置文件到容器指定目录
docker cp ./nginx.conf mynginx:/etc/nginx/nginx.conf
# 2. 从容器内部拷贝日志文件到宿主机当前目录
docker cp mynginx:/var/log/nginx/access.log ./access.log
2. docker diff:查看容器文件系统改动
对比容器当前文件系统与基础镜像的差异(A 新增、C 改变、D 删除):
docker diff mynginx
3. docker commit:由容器直接固化为镜像
# 将临时修改后的容器固化为一个新标签镜像 (建议带上提交信息)
docker commit -a "admin" -m "fix security vulnerability" mynginx mynginx:v1.1
五、镜像构建与远程仓库操作 (Registry)
1. docker build:基于 Dockerfile 编译镜像
# 1. 使用当前目录下的 Dockerfile 构建镜像,并赋予版本标签
docker build -t myapp:v1.0.0 .
# 2. 指定特定的 Dockerfile 路径与构建参数,禁用构建缓存
docker build -f ./docker/Dockerfile.prod \
--build-arg ENV=production \
--no-cache \
-t myapp:prod .
2. docker login / push / pull:仓库交互
# 1. 登录私有 Harbor 仓库
docker login registry.x7lab.cn -u admin -p mypassword
# 2. 为镜像打上私有仓库规范 Tag
docker tag myapp:v1.0.0 registry.x7lab.cn/library/myapp:v1.0.0
# 3. 推送镜像至私有镜像仓库
docker push registry.x7lab.cn/library/myapp:v1.0.0
# 4. 从远程仓库拉取指定镜像
docker pull registry.x7lab.cn/library/myapp:v1.0.0
六、本地镜像维护与离线归档 (Images)
1. 核心机制辨析:save/load vs export/import
在进行容器镜像离线迁移或跨内网环境传输时,很多工程师容易混淆这两对命令:
| 对比维度 | docker save & load |
docker export & import |
|---|---|---|
| 操作对象 | Docker 镜像 (Image) | 运行中的容器 (Container) |
| 层级历史 | 完整保留所有 Layer 镜像层与提交历史 | 丢弃所有历史,完全扁平化(Flatten)为单层 |
| 元数据与配置 | 完整保留 CMD、ENTRYPOINT、ENV 等元数据 | 丢弃镜像原始元数据(导入时需手动指定 CMD) |
| 适用场景 | 离线环境分发生产镜像、版本留存 | 导出特定业务容器的数据快照、极简轻量迁移 |
# 【推荐】镜像完整归档方案 (save / load)
# 导出镜像至离线 tar 包
docker save -o nginx_latest.tar nginx:latest
# 在离线主机恢复镜像
docker load -i nginx_latest.tar
# 【快照】容器扁平快照方案 (export / import)
# 导出容器当前状态
docker export -o mynginx_snapshot.tar mynginx
# 导入为新镜像 (需通过 -c 补回入口命令)
docker import -c 'CMD ["nginx", "-g", "daemon off;"]' mynginx_snapshot.tar mynginx:imported
七、生产环境资源清理与最佳实践 (Maintenance)
长期运行的 Docker 宿主机极易产生大量无用的虚悬镜像(Dangling Images)、已退出的孤儿容器以及未引用的持久化存储卷,导致磁盘空间爆满。
# 1. 查看 Docker 占用的全局磁盘空间分布 (镜像、容器、卷、构建缓存)
docker system df
# 2. 安全清理虚悬镜像、已停止容器与未使用的网络 (最常用安全清理)
docker system prune
# 3. 强力彻底大扫除 (慎用:清理所有无容器引用的镜像与孤立 Volume)
docker system prune -a --volumes -f
[!TIP] 生产规范三原则: 1. 严禁裸 run:生产容器启动必须显式声明
--name、--restart=always/unless-stopped以及内存限制-m; 2. 排障首选 exec:避免使用attach,永远使用docker exec -it <id> /bin/bash安全介入; 3. 定期空间健康度巡检:配置定时任务运行docker system df,并在可用磁盘低于 20% 时自动预警。