本文档将 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和-p?EXPOSE不实际映射端口,只是说明容器监听哪些端口。
五、数据卷
14. docker volume 管理卷
子命令:
docker volume lsdocker volume createdocker volume inspectdocker volume rmdocker 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 psdocker 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 prune→docker image prune -a→docker volume prune。
八、总结与通用建议
常见问题总览
| 问题 | 原因 | 解决 |
|---|---|---|
| 端口冲突 | 宿主机端口被占用 | lsof -i 查杀或改映射 |
| 容器反复重启 | 应用启动失败或健康检查失败 | docker logs 定位 |
| 网络不通 | 容器不在同一网络 | 创建自定义网络并加入 |
| 卷数据丢失 | 使用匿名卷且 prune 误删 | 用命名卷或外部卷 |
| 镜像体积大 | 未清理构建缓存、多阶段构建未优化 | 多阶段构建,减少层 |
核心原则
- 声明式优先 :能用
docker-compose.yml就不要用手动docker run。 - 可观测性 :合理使用
HEALTHCHECK、日志驱动、metrics。 - 安全 :勿以 root 运行容器,限制
--cap-add,扫描镜像漏洞。 - 资源限制 :设置
--memory、--cpus避免单个容器耗尽宿主机。 - 版本锁定:镜像标签、Compose 文件、配置都需版本控制。
自我反思清单
- 我是否了解每个命令的副作用?
- 我是否备份了重要数据和配置?
- 我是否在生产环境使用
latest标签? - 我是否定期清理无用资源而不影响运行服务?
- 我是否理解了容器不可变特性而避免手动修改?