← All Cheatsheets
Cloud
CLI · Dockerfile · Networking · Volumes · Compose · Multi-stage · Best Practices
# Build image
docker build -t myapp:1.0 .
# Run container
docker run -d -p 3000:3000 --name app myapp:1.0
# Shell into running container
docker exec -it app sh
# View logs
docker logs -f app
# Stop & remove
docker stop app && docker rm app
# Remove all stopped containers
docker container prune
# List images
docker images
# Pull from registry
docker pull node:20-alpine
# Tag image
docker tag myapp:1.0 registry/myapp:1.0
# Push to registry
docker push registry/myapp:1.0
# Inspect image layers
docker history myapp:1.0
# Remove dangling images
docker image prune
# Stage 1: build
FROM node:20 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Stage 2: runtime
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
CMD ["node", "dist/index.js"]
# Create custom network
docker network create mynet
# Run on custom network
docker run --network mynet myapp
Named volume
-v mydata:/app/data
Managed by Docker. Persists across containers.
Bind mount
-v /host/path:/app
Maps host directory. Good for dev.
tmpfs
--tmpfs /tmp
In-memory only. Not persisted.
# List / inspect volumes
docker volume ls
docker volume inspect mydata
# docker-compose.yml
services:
app:
build: .
ports: ["3000:3000"]
environment:
- DB_URL=postgres://db/mydb
depends_on: [db]
db:
image: postgres:16
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
Key Commands
docker compose up -d
docker compose down
docker compose logs -f app
docker compose exec app sh
docker compose build --no-cache
docker compose ps
docker compose restart app