容器化技术已经彻底改变了现代应用的交付方式,而Docker作为这一领域的标杆工具,其命令行接口是我们日常操作的核心入口。作为从2014年就开始使用Docker的老兵,我见证了Docker命令从最初的几十个发展到如今上百个的演进历程。这份大全不是简单罗列命令,而是结合我在生产环境中的实战经验,梳理出真正高频、实用的命令组合。
为什么需要这样一份大全?因为在真实的运维场景中,我们往往需要在不同生命周期阶段快速切换各种命令。比如当容器突然崩溃时,你需要在一秒内想到如何查看日志;当镜像构建失败时,要立即调出构建上下文检查问题。这些肌肉记忆般的命令使用,正是区分Docker新手和老鸟的关键。
镜像作为Docker的构建基石,其管理命令构成了日常工作的基础部分。以下是经过验证的高效操作组合:
bash复制# 拉取镜像的完整姿势(带详细输出)
docker pull -q ubuntu:20.04
# 查看镜像分层结构的正确方式
docker history --no-trunc nginx:latest
# 批量清理悬空镜像的工业级方案
docker image prune -f --filter "until=24h"
经验之谈:生产环境中永远使用显式版本标签,避免使用latest带来的不可预期行为。我曾因为一个团队误用latest标签导致线上服务回滚失败。
镜像构建是另一个高频场景,这里分享几个关键参数:
bash复制# 带缓存的构建(适合开发阶段)
docker build --build-arg ENV=dev -t myapp:dev .
# 完全干净的构建(生产环境必须)
docker build --no-cache --pull -t myapp:prod .
当需要分析第三方镜像时,这些命令能帮你快速洞察内部结构:
bash复制# 导出镜像内容到本地(比docker cp更彻底)
docker save -o debian.tar debian:buster
# 分析镜像体积构成(找出肥胖元凶)
docker inspect --format='{{.Size}}' python:3.9
启动容器看似简单,但参数选择直接影响后续运维体验:
bash复制# 生产级容器启动模板(含健康检查)
docker run -d \
--name myapp \
--restart unless-stopped \
--health-cmd "curl -f http://localhost/health || exit 1" \
-p 8080:80 \
-v /data:/var/lib/data \
myapp:prod
停止容器也有讲究,特别是对于有状态服务:
bash复制# 优雅停止方案(发送SIGTERM等待处理完成)
docker stop -t 30 mycontainer
# 强制停止的核选项(相当于kill -9)
docker kill -s SIGKILL mycontainer
当容器出现异常时,这三个命令组合能解决80%的问题:
bash复制# 实时日志追踪(相当于tail -f)
docker logs -f --tail 100 mycontainer
# 进入容器的正确姿势(推荐使用exec)
docker exec -it mycontainer /bin/bash
# 资源占用分析(比top更详细)
docker stats --no-stream mycontainer
Docker网络问题常常令人头疼,这些命令能帮你理清脉络:
bash复制# 查看容器网络详情(包括IP和MAC)
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mycontainer
# 创建自定义网络(生产环境推荐)
docker network create \
--driver=bridge \
--subnet=172.28.0.0/16 \
--gateway=172.28.0.1 \
mynetwork
数据持久化是容器化的核心挑战,这些命令能确保数据安全:
bash复制# 查看卷的物理存储位置
docker volume inspect myvolume | grep Mountpoint
# 批量清理无用卷(危险操作需谨慎)
docker volume prune -f
将这些alias加入你的.bashrc,效率提升立竿见影:
bash复制# 快速停止所有容器
alias docker-stop-all='docker stop $(docker ps -aq)'
# 批量删除已停止容器
alias docker-rm-stopped='docker rm $(docker ps -aq -f status=exited)'
# 可视化镜像依赖关系
alias docker-image-tree="docker inspect --format='{{.RepoTags}} {{.Parent}}' $(docker images -aq)"
这些命令能帮你发现潜在的安全隐患:
bash复制# 检查容器特权模式
docker inspect --format='{{.HostConfig.Privileged}}' mycontainer
# 扫描镜像漏洞(需安装docker scan)
docker scan --file Dockerfile myimage
问题现象:构建时出现"failed to solve with frontend dockerfile.v0"
解决方案:
bash复制# 启用BuildKit引擎(现代Docker默认支持)
DOCKER_BUILDKIT=1 docker build -t myimage .
问题现象:容器无法访问外网
诊断步骤:
bash复制# 检查DNS配置
docker run --rm busybox nslookup google.com
# 验证网络连接
docker run --rm --network host busybox ping 8.8.8.8
问题现象:容器内应用无法写入挂载卷
解决方案:
bash复制# 启动时指定用户权限
docker run -v /host/path:/container/path -u $(id -u):$(id -g) myimage
不同Docker版本命令可能存在差异,这里列出几个关键变化点:
检查版本兼容性的正确方式:
bash复制# 显示完整的版本信息(包括API版本)
docker version --format '{{.Server.Version}}'
对于生产环境,这些命令能帮你优化容器性能:
bash复制# 限制容器内存使用(防止OOM)
docker run -d --memory="512m" --memory-swap="1g" myimage
# 调整CPU优先级(低优先级容器)
docker run -d --cpu-shares=512 myimage
# 查看实时资源占用
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
当需要维护整个Docker环境时,这些命令非常有用:
bash复制# 查看Docker磁盘使用详情(包括builder缓存)
docker system df -v
# 全面清理(镜像、容器、网络、构建缓存)
docker system prune -a -f --volumes
经过多年实践,我总结出几个Docker命令使用的黄金法则:
精确性原则:永远使用完整的镜像标签(如ubuntu:20.04而非ubuntu),避免latest带来的不确定性
可追溯原则:重要的运行容器必须带--restart策略和健康检查,方便故障恢复
清洁原则:定期使用prune命令清理系统,但要注意--volumes参数会删除所有未使用的卷数据
文档原则:复杂的run命令应该保存在Makefile或脚本中,而不是依赖记忆
最后分享一个查看容器启动参数的技巧,这在调试时非常有用:
bash复制docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' mycontainer