TEMPLATE
Image
The blueprint. postgres:16. Read-only.
Container
Running instance. Read-write while running. Many containers from one image.
Volume
Persistent storage that survives container restart. Where your data lives.
Network
How containers talk. Same Compose file = name-resolution by service.
docker run -p 8080:80 image
start a new container
docker ps · docker ps -a
list running / all
docker stop name · rm name
stop / remove
docker logs -f name
tail logs live
docker exec -it name bash
shell into container
docker images · pull image
list / fetch
docker compose up -d
start whole stack, detached
docker compose down
stop + remove stack
Pro Tip
Use Compose for anything > 1 container. Even single-container deploys benefit from the documentation a Compose file provides.
Common Mistakes
Bundling Postgres + app in one container. Pinning to
:latest (changes underneath you). Storing real data inside a container with no volume.
Mental model checklist
First containerized service
- One service per container
Easier to update / debug
- Pin image versions
postgres:16, not :latest
- Volumes for state
DB data, user uploads, configs
- restart: unless-stopped
Comes back after reboot
- Treat containers as cattle
Recreate freely
- brew install --cask docker
macOS — Docker Desktop
- mkdir vaultwarden && cd
One folder per service
- Write docker-compose.yml
image + env + volumes + ports
- docker compose up -d
Done. Visit localhost:port.
djEnterprises · AI consulting & iOS app studio