Mastering Docker Container Visibility: Beyond the Basic docker ps
Command
Working with Docker in production environments demands more than simply running docker ps
and skimming through container names. Knowing exactly which containers are running, how long they’ve been up, why they stopped, and which volumes or networks they touch — these are operational details that matter.
The Default: docker ps
docker ps
This returns active containers, their image, command, age, status, ports, and name. For example:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a11e19cfb922 nginx:1.25 "nginx -g 'daemon of…" 12 hours ago Up 12 hours 0.0.0.0:80->80/tcp prod-nginx
df8327eef6d0 redis:7.2 "redis-server" 2 days ago Up 2 days 6379/tcp cache01
But this view is incomplete. Exited containers—critical for postmortem analysis—don’t appear here.
Full Historical Context: Listing All Containers
docker ps -a
Now, both stopped and running containers appear:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
df8327eef6d0 redis:7.2 "redis-server" 2 days ago Exited (0) 4 hours ago cache01
a11e19cfb922 nginx:1.25 "nginx -g 'daemon…" 12 hours ago Up 12 hours 80/tcp prod-nginx
Note: On busy CI/CD hosts, this list can become unwieldy — use filtering to manage output.
Filter by Status, Pattern, Ancestry
Filtering is essential in multi-container fleets. Some practical filters:
- Only show exited containers:
docker ps -a --filter "status=exited"
- Only show paused containers (rare, but encountered in orchestrated environments):
docker ps --filter "status=paused"
- Search for containers by partial name:
docker ps -a --filter "name=app"
- List only containers running from a specific image (e.g., for blue/green upgrades):
docker ps --filter "ancestor=nginx:1.25"
Partial output when a container’s failed (real log):
CONTAINER ID IMAGE STATUS NAMES
beefdeadbeef myapi:0.3.1 Exited (137) 23 minutes ago api-v2-staging
Exit code 137
hints at out-of-memory kill—OS intervention, not a graceful exit.
Disk Usage Insight: docker ps -s
Disk constraints are a frequent issue, especially with ephemeral build runners. To audit per-container disk usage:
docker ps -s
Look for unused containers with large writable layers—culprits for filling /var/lib/docker
.
Custom Output for Automation
Automation scripts, CI summaries, or health checks rarely need full tabular output. Instead, tailor the output:
docker ps -a --format "table {{.Names}}\t{{.ID}}\t{{.Status}}"
Sample:
NAMES ID STATUS
prod-nginx a11e19cfb922 Up 12 hours
cache01 df8327eef6d0 Exited (0) 4 hours ago
Other available fields: .Ports
, .RunningFor
, .Image
, .Command
. See docs for the full set, or run:
docker ps --format '{{json .}}' | jq .
(Note: JQ required for prettified JSON.)
Compound Queries: Filtering + Formatting
For monitoring or scheduled reports, mix-and-match:
-
Find all exited containers from a broken build and summarize:
docker ps -a --filter "status=exited" --filter "name=build" --format "table {{.Names}}\t{{.Image}}\t{{.Status}}"
-
Return just IDs for later clean-up:
docker ps -a --filter "status=exited" --format "{{.ID}}"
Always review before mass deletion — container metadata loss is permanent.
Resource Utilization: docker stats
Memory/cpu bottlenecks? docker stats
shows live metrics:
docker stats $(docker ps -q --filter "ancestor=my-heavy-image")
Gotcha: For short-lived containers, stats may vanish before you can inspect. Use external monitoring (cadvisor
, Prometheus
) for historical trends.
Practical Table: Command Summary
Use Case | Example Command |
---|---|
List only running | docker ps |
List all (historical) | docker ps -a |
Find crashed | docker ps -a -f status=exited |
Filter by name | docker ps -a -f name=web |
Image ancestor | docker ps -f ancestor=python:3.11 |
Show container disk usage | docker ps -s |
Custom table output | docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}" |
Field Note
Containers may retain port allocations, mounts, and logs even after exit. Prune old containers (docker container prune
) only after checking they're not needed for audit or troubleshooting.
Pro tip: On Docker Engine v20.x+, combining multiple --filter
flags is supported, allowing precise queries on complex nodes.
Known issue: The docker ps
output order is latest container first—not always intuitive. Consider scripting with sort
if order matters.
Closing
The default docker ps
output is only a snapshot. With advanced flags and filters, a more nuanced view appears: disk usage trends, postmortem history, resource saturation, and deployment fidelity. Mastery here is less about memorizing options, more about tailoring queries to real problems.
For teams managing stateful workloads or debugging elusive failures, robust visibility isn't optional. It’s operational hygiene.
End of field notes.