docker ps 是干什么的
docker ps 列出容器及其状态:默认只显示正在运行的容器,加上 -a 才会连已退出的容器一起显示。它支持按状态、名称、镜像祖先等条件过滤,也能自定义输出格式,既能当人工巡检的入口,也能嵌进脚本做批量操作的取数命令。
基本信息
| 基本语法 | docker ps [选项] |
|---|---|
| 常用参数 | -a 显示全部容器 / -q 只输出 ID / -s 显示大小 / -n 只看最近 N 个 |
| 过滤条件 | --filter 支持 status=exited、name=web、ancestor=nginx、label=env=prod |
| 格式化 | --format 支持 table 形式与字段占位,如 {{.Names}}、{{.Status}} |
| 状态取值 | Up、Exited、Created、Restarting、Paused、Dead |
典型使用场景
- 日常巡检:确认关键服务都在运行,以及各自已经运行了多久
- 找回异常退出的容器:加 -a 并按状态过滤,定位失败任务及其镜像
- 批量操作取数:docker ps -q 拿到 ID 列表,交给 stop、rm、logs 处理
- 排查端口占用:看清端口映射关系,确认宿主端口被哪个容器占用
- 按标签筛选:用 label 过滤出某个环境或某套编排的容器
- 生成状态报表:用 --format 输出固定列,直接喂给监控或工单系统
输出逐列读法
| 列 | 含义 | 注意点 |
|---|---|---|
| CONTAINER ID | 容器 ID 的前 12 位 | 需要完整 ID 时加 --no-trunc |
| IMAGE | 创建容器时使用的镜像 | 不是镜像 ID,同名标签可能已被覆盖 |
| COMMAND | 容器启动命令 | 会被截断,完整内容看 inspect |
| CREATED | 创建时间 | 不等于启动时间,重启后 STATUS 才更新 |
| STATUS | 当前状态与时长 | Up 3 minutes 表示已运行 3 分钟 |
| PORTS | 端口映射 | 为空只说明没映射,不代表容器内没监听 |
| NAMES | 容器名 | 随机名说明创建时没加 --name |
常用组合
常用组合
docker ps # 只看运行中的容器
docker ps -a --filter "status=exited" # 找已退出的容器
docker ps -a --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" # 固定列输出
docker ps -q # 只输出 ID,便于批量处理
docker ps --filter "label=env=prod" -q | xargs docker restart # 按标签批量重启容器处于 Up 不代表服务可用:进程活着但端口未就绪、初始化没完成的情况很常见,判断可用性要看应用层的健康检查。
STATUS 里的时长指当前这次运行的时长,频繁重启的容器会表现为 Up 几十秒,配合重启策略一起看更容易发现异常。
Restarting 状态在列表里一闪而过,做重启排查时更应该看 docker inspect 里的重启次数与上次退出的时间。
容器数量多时,用 --format 输出固定列再交给工具处理,人工逐行读反而容易漏掉异常的那一行。
巡检与脚本化的做法
- 把常用过滤条件固化成命令写进运维手册,值班时不必临场拼参数
- 用标签标记业务与环境,按标签筛选比按容器名匹配更可靠
- 输出固定列后交给监控或报表系统,人工只需要关注异常行
- 发现容器运行时间很短时,先看重启策略与重启次数,再看日志
- 批量操作前先把筛选结果打印出来确认,再执行实际变更
- 把容器名与业务名的对应关系登记在发布系统里,不依赖记忆
- 定期清理已退出的容器,避免列表膨胀掩盖真正的异常
容器数量增长后靠人工读列表会越来越不可靠:把运行状态与重启次数做成指标和告警,列表只用于定位具体实例。
状态与退出码要结合看:状态说明容器怎么结束的,退出码进一步说明是被终止还是自行退出,两者一起才能判断该改配置还是改资源。
不要依赖随机容器名:用固定名字并在发布系统里登记对应关系,批量脚本与人工排查都能准确指向目标实例。