Docker 常用命令速查手册
这篇不求全,只求实用。每个命令都是真实工作场景里跑过的,有的还附了"为什么这么写"的解释。
命令速查总览
镜像相关
拉取镜像
docker pull nginx # 拉最新版本(latest tag)
docker pull nginx:1.25 # 拉指定版本,生产环境强烈建议这样写
docker pull nginx:1.25-alpine # 拉 alpine 版,体积小很多
不写版本号默认是 latest,生产环境用 latest 有翻车风险——今天 latest 是 1.25,明天更新到 1.26 行为可能变了,但你的配置没变。指定版本是好习惯。
查看本地镜像
docker images # 列出所有本地镜像
docker images nginx # 只看 nginx 相关的
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" # 自定义列
--format 这个参数很有用,输出太乱的时候过滤掉不需要的列。
删除镜像
docker rmi nginx # 删镜像(有容器在用会报错)
docker rmi nginx:1.24 # 删特定版本
docker rmi $(docker images -q) # 删所有本地镜像(别在生产机上跑)
docker image prune # 只删没有 tag 的悬空镜像
docker image prune -a # 删所有没容器在用的镜像
docker image prune -a 是清理磁盘的好帮手,但跑之前先想想是不是所有镜像都可以删。
构建镜像
docker build -t myapp:1.0 . # 用当前目录的 Dockerfile 构建
docker build -t myapp:1.0 -f Dockerfile.prod . # 指定 Dockerfile 文件名
docker build --no-cache -t myapp:1.0 . # 不用缓存,完整重新构建
docker build --build-arg NODE_ENV=prod -t myapp:1.0 . # 传入构建参数
调试构建失败时,--no-cache 能排除缓存干扰因素。日常开发别加这个,慢。
查看镜像历史
docker history myapp:1.0 # 查看镜像各层的构建历史
docker history --no-trunc myapp:1.0 # 不截断命令显示
镜像体积突然很大,用 history 查哪一层占了最多空间,比瞎猜快多了。
容器生命周期
这块命令最多,也最容易搞混,我按"创建 → 运行 → 查看 → 停止 → 删除"的顺序来。
创建并运行容器
# 最基础的启动
docker run nginx
# 后台运行(不占用终端)
docker run -d nginx
# 后台运行,指定名字,映射端口
docker run -d --name my-nginx -p 8080:80 nginx
# 交互模式进入容器
docker run -it ubuntu:22.04 bash
# 运行完自动删容器(临时测试用)
docker run --rm alpine echo "hello"
# 挂载数据卷
docker run -d -v /host/path:/container/path nginx
# 传入环境变量
docker run -d -e MYSQL_ROOT_PASSWORD=secret mysql:8.0
# 限制内存和 CPU(生产建议加上)
docker run -d --memory=512m --cpus=0.5 myapp:1.0
# 设置容器挂掉自动重启
docker run -d --restart=always nginx
--restart 的几个选项:
no:默认,不自动重启always:总是重启on-failure:只在非 0 退出码时重启unless-stopped:除非手动 stop,否则总重启(推荐生产使用)
查看容器
docker ps # 只看运行中的容器
docker ps -a # 看全部(含已停止的)
docker ps -q # 只输出容器 ID,方便管道操作
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" # 自定义格式
# 查看容器详细信息(网络、挂载、环境变量等所有信息)
docker inspect my-nginx
# 只取某个字段(用 Go template)
docker inspect --format '{{.NetworkSettings.IPAddress}}' my-nginx
# 查看容器占用的资源
docker stats # 实时流式输出(所有容器)
docker stats my-nginx # 只看指定容器
docker stats --no-stream # 输出一次就结束,不滚动
docker stats --no-stream 我用得很多,快速看一眼各容器内存占用,脚本里也方便用。
启动和停止
docker start my-nginx # 启动已停止的容器
docker stop my-nginx # 优雅停止(发 SIGTERM,等 10 秒)
docker stop -t 30 my-nginx # 等 30 秒再强杀
docker kill my-nginx # 直接 SIGKILL,立刻死
docker restart my-nginx # 等于 stop + start
docker stop 和 docker kill 的区别:前者给进程机会做清理(关数据库连接、写完当前事务),后者直接暴力。数据库容器用 stop,不要用 kill。
进入运行中的容器
# 进入容器,开一个 bash shell
docker exec -it my-nginx bash
# 执行单条命令不进交互
docker exec my-nginx nginx -t # 测试 nginx 配置是否正确
docker exec my-nginx cat /etc/nginx/nginx.conf # 查看配置文件
# 以 root 身份进入(容器内默认非 root 时用)
docker exec -it --user root my-app bash
docker exec 是我每天用最多的命令之一,进去查日志、改配置、测接口,非常方便。
删除容器
docker rm my-nginx # 删除已停止的容器
docker rm -f my-nginx # 强制删除(运行中也能删)
docker rm $(docker ps -aq) # 删除所有已停止的容器
docker container prune # 自动清理所有已停止的容器(会确认)
docker container prune -f # 直接删不确认
日志和调试
查看日志
docker logs my-nginx # 看全部日志
docker logs -f my-nginx # 实时跟踪(相当于 tail -f)
docker logs --tail 100 my-nginx # 只看最后 100 行
docker logs --since 1h my-nginx # 看最近 1 小时的日志
docker logs --since "2026-04-15T10:00:00" my-nginx # 指定时间点后的日志
docker logs -f --tail 50 my-nginx # 跟踪,从最后 50 行开始
--since 参数支持相对时间(10m、2h、1d)和绝对时间,排查问题时很实用。
查看容器内进程
docker top my-nginx # 容器内的进程列表
容器没响应又不想进去,docker top 快速看看里面在跑什么。
复制文件
# 从容器复制到宿主机
docker cp my-nginx:/etc/nginx/nginx.conf ./nginx.conf
# 从宿主机复制到容器
docker cp ./nginx.conf my-nginx:/etc/nginx/nginx.conf
临时改配置或者把容器里的日志文件取出来,docker cp 最直接。
网络相关
docker network ls # 列出所有网络
docker network inspect bridge # 查看网络详情(哪些容器在里面)
docker network create mynet # 创建自定义网络
docker network connect mynet my-nginx # 把容器加入网络
docker network disconnect mynet my-nginx # 把容器移出网络
docker network rm mynet # 删除网络
docker network prune # 清理所有未使用的网络
同一个自定义网络里的容器可以用容器名互相访问,不需要写 IP。这个特性在 Docker Compose 里天然就有,手动 docker run 时要记得创建网络再把容器加进去。
数据卷
docker volume ls # 列出所有数据卷
docker volume create mydata # 创建命名卷
docker volume inspect mydata # 查看卷的详情(包括实际存储路径)
docker volume rm mydata # 删除卷
docker volume prune # 删除所有未使用的卷
用 docker volume inspect 可以看到卷实际存在宿主机哪个目录,方便直接去那里备份数据。
系统清理
Docker 用久了镜像、容器、网络、卷会积累很多垃圾,磁盘告急时:
# 核武器:一键清理所有未使用的资源(镜像、容器、网络、构建缓存)
docker system prune
# 加 -a 连没容器在用的镜像也清了
docker system prune -a
# 加 --volumes 连数据卷也清(⚠️ 数据会丢,确认再用)
docker system prune -a --volumes
# 查看 Docker 占用的磁盘空间
docker system df
# 详细版,看每个镜像/容器/卷各占多少
docker system df -v
docker system df 先跑一下看看情况,再决定清哪些,别上来就 prune -a --volumes。
几个让效率翻倍的小技巧
技巧1:给长命令起别名
在 ~/.bashrc 或 ~/.zshrc 里加:
alias dps='docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"'
alias dlogs='docker logs -f --tail 100'
alias dexec='docker exec -it'
dexec my-nginx bash 比每次打全要快。
技巧2:用 -q 配合管道批量操作
# 停止所有容器
docker stop $(docker ps -q)
# 删除所有已停止的容器
docker rm $(docker ps -aq -f status=exited)
# 删除所有 <none> 镜像(构建产生的垃圾层)
docker rmi $(docker images -q -f dangling=true)
技巧3:docker run --rm 做临时任务
# 临时运行一个 Python 脚本,跑完自动删容器
docker run --rm -v $(pwd):/work python:3.11 python /work/script.py
# 临时用 curl 测试容器内网络(容器里没有 curl 时)
docker run --rm --network container:my-app curlimages/curl curl http://localhost:8080/health
把容器当"一次性工具箱",跑完就没了,干净。
技巧4:用 --filter 精准过滤
# 只看退出的容器
docker ps -a --filter status=exited
# 只看特定镜像跑出来的容器
docker ps --filter ancestor=nginx
# 只看某个时间之后创建的容器
docker ps -a --filter since=my-container
一个真实排查场景的命令串
某天收到告警,说有个 API 服务没响应,完整的排查流程是这样的:
# 1. 先看容器在不在、什么状态
docker ps -a --filter name=api-server
# 发现状态是 Exited (137),137 = 128 + 9,说明被 OOM Killer 干掉了
# 2. 看看最后的日志
docker logs --tail 200 api-server
# 3. 看看容器的资源配置
docker inspect api-server | grep -A 5 '"Memory"'
# 4. 重启容器,临时恢复
docker start api-server
# 5. 看实时资源占用,确认内存是不是一直往上涨
docker stats api-server
退出码 137 的容器十有八九是内存不够被系统杀掉,配合 inspect 看内存限制,stats 看实时占用,基本就能定位问题。
命令多,但常用的就那三十几个,跑几次自然就记住了。有问题评论区留言。
更多推荐

所有评论(0)