这篇不求全,只求实用。每个命令都是真实工作场景里跑过的,有的还附了"为什么这么写"的解释。


命令速查总览

Docker 命令

镜像

pull 拉取

images 列出

rmi 删除

build 构建

history 查看层

push 推送

tag 打标签

容器

run 创建并启动

start / stop 启停

restart 重启

kill 强杀

rm 删除

ps 列出

inspect 详情

stats 资源监控

exec 进入执行

logs 查日志

cp 复制文件

top 进程列表

网络

network ls

network create

network inspect

network connect

数据卷

volume ls

volume create

volume inspect

volume prune

系统

system df

system prune

system info


镜像相关

拉取镜像

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 stopdocker 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 参数支持相对时间(10m2h1d)和绝对时间,排查问题时很实用。

查看容器内进程

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 看实时占用,基本就能定位问题。


命令多,但常用的就那三十几个,跑几次自然就记住了。有问题评论区留言。

更多推荐