Docker 常用命令全面总结

本文档将 Docker 常用命令按功能分类,逐一介绍用法、常见问题、以及最佳实践建议。


一、镜像管理

1. docker pull ------ 下载镜像

bash 复制代码
docker pull [OPTIONS] NAME[:TAG|@DIGEST]

示例docker pull nginx:1.25

常见问题

  • 国内下载慢或超时 → 配置镜像加速器(阿里云、中科大等)。
  • 拉取 latest 标签可能导致版本意外更新 → 生产环境应指定具体版本号。

自我反思

我是否经常依赖 latest 而忽略了版本锁定?在 Docker Compose 中是否也使用了具体版本?下次构建前应先检查镜像是否存在本地,避免重复下载。

建议

  • 始终使用明确版本标签。
  • 利用 --platform 拉取指定架构镜像(如 linux/amd64)。

2. docker images / docker image ls ------ 列出本地镜像

bash 复制代码
docker images [OPTIONS] [REPOSITORY[:TAG]]

常用选项

  • -a:显示所有(包括中间层)
  • -q:仅显示 ID
  • --filter "dangling=true" 过滤悬挂镜像

常见问题

  • 磁盘空间不足 → 定期清理无用镜像。
  • 看到多个 <none>:<none> 镜像 → 通常是构建中间层,可安全删除。

自我反思

我是否清楚每个镜像的用途?能否通过 docker image inspect 查看元数据来确认版本和依赖?

建议

  • 定期运行 docker image prune -a 清理未使用镜像。
  • 使用 docker system df 查看磁盘占用。

3. docker rmi / docker image rm ------ 删除镜像

bash 复制代码
docker rmi [OPTIONS] IMAGE [IMAGE...]

强制删除-f 强制删除(即使有容器依赖)

常见问题

  • image is being used by running container → 先停止/删除依赖容器。
  • 删除标签后镜像层未释放 → 当镜像有多个标签时,删除一个标签只移除引用,真正清理层需删除最后一个标签。

自我反思

我是否误删了正在被容器使用的镜像?下次删除前先用 docker ps -a --filter ancestor=... 确认依赖。

建议

  • 先停止并删除依赖容器,再删镜像。
  • 组合命令:docker rm $(docker stop $(docker ps -q --filter ancestor=...))

二、容器生命周期

4. docker run ------ 创建并启动容器

bash 复制代码
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

常用选项

  • -d:后台运行
  • -it:交互式终端(如 docker run -it ubuntu bash
  • --name:指定容器名
  • -p HOST:CONTAINER:端口映射
  • -v HOST:CONTAINER:挂载卷
  • --rm:退出后自动删除
  • --restart:重启策略

常见问题

  • 端口被占用 → 检查 lsof -i:端口netstat -tlnp
  • 容器闪退 → 查看 docker logs <container>
  • 未指定 -d 导致终端挂起 → 按 Ctrl+C 会终止容器

自我反思

我是否总是不加 --rm 而导致大量退出容器堆积?是否合理设置了 --restart 避免生产环境意外退出?

建议

  • 开发测试时加 --rm 避免残留。
  • 生产环境定义 --restart unless-stopped
  • 使用 -e KEY=VALUE 传递环境变量,而非写死在镜像中。

5. docker ps ------ 查看容器

bash 复制代码
docker ps [OPTIONS]

常用选项

  • -a:显示所有容器(包括退出)
  • -q:仅显示 ID
  • --filter "status=exited" 过滤退出容器

常见问题

  • 容器很多,不易定位 → 使用 --format 定制输出。
  • 看不到健康状态 → 需在镜像中定义 HEALTHCHECK

自我反思

我是否经常忘记加 -a 而误以为容器已删除?是否利用了 docker ps --format 提高可读性?

建议

  • 创建别名:alias dps='docker ps --format "table {``{.Names}}\t{``{.Status}}\t{``{.Image}}"'
  • 配合 grep 快速筛选:docker ps | grep redis

6. docker stop / docker start / docker restart

bash 复制代码
docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker start [OPTIONS] CONTAINER
docker restart [OPTIONS] CONTAINER

常用选项-t / --time 指定等待停止的超时秒数(默认10)

常见问题

  • 容器停止慢 → 内部进程没有正确处理 SIGTERM 信号。
  • 批量停止多个容器效率低 → 可使用 docker stop $(docker ps -q)

自我反思

我是否了解容器内进程的信号处理?是否需要调整 STOPSIGNAL 或增加优雅停止时间?

建议

  • 编写 Dockerfile 时使用 STOPSIGNAL SIGTERM 并确保应用能捕获。
  • docker-compose.yml 中设置 stop_grace_period

7. docker rm ------ 删除容器

bash 复制代码
docker rm [OPTIONS] CONTAINER [CONTAINER...]

强制删除-f(会强制停止正在运行的容器)

常见问题

  • 删除正在运行的容器需加 -f,但可能造成数据丢失 → 最好先停止。
  • 删除后卷未删除 → 使用 -v 同时删除关联的匿名卷。

自我反思

我是否习惯用 docker rm -f 而忽略了容器内重要数据?是否记得用 docker volume prune 清理孤儿卷?

建议

  • 组合清理:docker stop <container> && docker rm <container>
  • 使用 docker container prune 删除所有停止的容器。

8. docker logs ------ 查看容器日志

bash 复制代码
docker logs [OPTIONS] CONTAINER

常用选项

  • -f:实时跟踪
  • --tail N:显示最后 N 行
  • --since:按时间过滤

常见问题

  • 日志过多占满磁盘 → 限制日志大小(Docker daemon 配置或 --log-opt max-size)。
  • 容器内进程输出到控制台 → 确保应用日志写在 stdout/stderr。

自我反思

我是否在生产环境设置了日志轮转?是否经常使用 docker logs --since 定位时间点问题?

建议

  • 启动容器时加 --log-opt max-size=10m --log-opt max-file=3
  • 集中日志收集(ELK、Loki)避免依赖 docker logs 做长期存储。

9. docker exec ------ 进入运行中容器

bash 复制代码
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

常用docker exec -it <container> /bin/bash

常见问题

  • 容器内没有 bash → 尝试 /bin/sh
  • 权限不足 → 加 -u root-u 0

自我反思

我是否通过 docker exec 修改了容器内文件导致容器不可重现?这种操作应只在调试时进行,正式变更应通过 Dockerfile 或挂载卷。

建议

  • 优先使用 docker cp 复制文件,避免直接修改。
  • 调试完成后尽快退出,避免过多 exec 进程。

三、容器与宿主机数据交互

10. docker cp ------ 复制文件

bash 复制代码
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH

常见问题

  • 路径不存在 → 确保容器内路径存在。
  • 复制大文件慢 → 推荐使用卷挂载。

自我反思

我是否经常用 docker cp 而忽略了更好的卷挂载方式?复制配置文件和导出日志是典型场景,但也应考虑长期方案。

建议

  • 只用于临时传输,生产环境应依赖持久卷。

11. docker commit ------ 将容器保存为新镜像

bash 复制代码
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

注意:不推荐生产使用,因为会导致镜像黑盒、膨胀、不安全。

自我反思

我是否因为偷懒而用 commit 而不是写 Dockerfile?这种方式构建的镜像无法追溯变更,应避免。

建议

  • 始终使用 Dockerfile + docker build 实现可重复构建。

四、网络与端口

12. docker network 管理网络

子命令

  • docker network ls:列出网络
  • docker network create:创建网络(-d bridge/overlay
  • docker network inspect:查看详情
  • docker network connect / disconnect:连接/断开容器

常见问题

  • 容器间无法通信 → 检查是否在同一网络,且没有防火墙规则。
  • 自定义网络与默认 bridge 区别 → 自定义网络支持容器名 DNS 解析。

自我反思

我是否清楚容器默认在 bridge 网络但无法通过容器名通信?是否主动创建了自定义网络并让服务加入?

建议

  • docker-compose.yml 中定义自定义网络,服务自动加入。
  • 对外部容器连接,使用 docker network connect

13. 端口映射调试

查看映射docker port CONTAINER

常见问题

  • 端口被占用但映射冲突 → 更改宿主机端口或停止占用进程。
  • 容器内部端口未暴露 → 镜像必须用 EXPOSE 或在 docker run 中使用 -p 仍然可以绑定,但 EXPOSE 仅文档作用。

自我反思

我是否混淆了 EXPOSE-pEXPOSE 不实际映射端口,只是说明容器监听哪些端口。


五、数据卷

14. docker volume 管理卷

子命令

  • docker volume ls
  • docker volume create
  • docker volume inspect
  • docker volume rm
  • docker volume prune

常见问题

  • 匿名卷难以管理 → 使用命名卷。
  • 卷数据未备份 → 定期备份 /var/lib/docker/volumes 或使用驱动。

自我反思

我是否在 docker-compose.yml 中只用了 bind mount 而忽略了命名卷的可移植性?是否了解 docker volume prune 会删除未使用的卷导致数据丢失?

建议

  • 生产环境优先使用命名卷。
  • 挂载时加 :ro 只读权限。

六、Docker Compose

15. docker compose 常用命令

常用

  • docker compose up -d:后台启动
  • docker compose down:停止并删除容器、网络(保留卷)
  • docker compose down -v:同时删除卷(危险)
  • docker compose logs:查看日志
  • docker compose exec:进入服务容器
  • docker compose ps
  • docker compose build:重新构建镜像

常见问题

  • 环境变量未生效 → 检查 .env 文件或 shell 环境。
  • 容器依赖未正确等待 → 使用 condition: service_healthy 而非 depends_on 简单等待。
  • 重启策略冲突 → restart: unless-stopped--restart 覆盖。

自我反思

我是否习惯用 up -d 后不管,遇到问题再查日志?是否利用了 --profile 来管理可选服务?是否在 down 时误加了 -v 导致数据清空?

建议

  • 开发时使用 --build 重建镜像。
  • 重要数据卷使用外部卷,避免 down -v 误删。
  • 定义 healthcheck 并让依赖服务等待健康。

七、系统清理与维护

16. docker system prune

bash 复制代码
docker system prune [OPTIONS]

选项

  • -a:删除所有未使用镜像
  • --volumes:删除未使用卷

常见问题

  • 误删镜像导致需要重新拉取 → 确保不再需要。
  • 清理后容器启动失败 → 检查卷是否被误删。

自我反思

我是否因为磁盘不足就运行 docker system prune -a --volumes 而不确认?这种方式可能删除日志、缓存等有用数据,应谨慎。

建议

  • 先运行 docker system df 查看占用。
  • 分步清理:docker container prunedocker image prune -adocker volume prune

八、总结与通用建议

常见问题总览

问题 原因 解决
端口冲突 宿主机端口被占用 lsof -i 查杀或改映射
容器反复重启 应用启动失败或健康检查失败 docker logs 定位
网络不通 容器不在同一网络 创建自定义网络并加入
卷数据丢失 使用匿名卷且 prune 误删 用命名卷或外部卷
镜像体积大 未清理构建缓存、多阶段构建未优化 多阶段构建,减少层

核心原则

  1. 声明式优先 :能用 docker-compose.yml 就不要用手动 docker run
  2. 可观测性 :合理使用 HEALTHCHECK、日志驱动、metrics。
  3. 安全 :勿以 root 运行容器,限制 --cap-add,扫描镜像漏洞。
  4. 资源限制 :设置 --memory--cpus 避免单个容器耗尽宿主机。
  5. 版本锁定:镜像标签、Compose 文件、配置都需版本控制。

自我反思清单

  • 我是否了解每个命令的副作用?
  • 我是否备份了重要数据和配置?
  • 我是否在生产环境使用 latest 标签?
  • 我是否定期清理无用资源而不影响运行服务?
  • 我是否理解了容器不可变特性而避免手动修改?
相关推荐
是有头发的程序猿1 小时前
AI Agent电商自动化实战:淘宝商品详情API无人化采集与分析教程
运维·人工智能·自动化
翔云1234561 小时前
Kubernetes 与 Docker Compose:异同详解
docker
RisunJan1 小时前
Linux命令-nohup(使进程忽略挂起(HUP)信号并在后台继续运行)
linux·运维·服务器
IT策士1 小时前
第31篇 k8s之Ingress 进阶:TLS、重写与认证
云原生·容器·kubernetes
STDD2 小时前
VictoriaLogs:轻量级日志存储方案,Loki 的高效替代
运维·jenkins
川石课堂软件测试2 小时前
作为一名测试工程师如何学习Kubernetes(k8s)技能
学习·测试工具·容器·职场和发展·kubernetes·测试用例·harmonyos
枳实-叶2 小时前
【Linux驱动开发】第18天:I2C驱动深度解析
linux·运维·驱动开发
shandianchengzi2 小时前
【记录】Ubuntu|Ubuntu 26.04 笔记本耗电过快,排查 省电过程
linux·运维·ubuntu
一叶星殇2 小时前
日志成海,何以检索:Serilog 解锁 .NET 日志可查询新范式
运维·服务器