Container Lifecycle
| Command | Description |
|---|
docker run [OPTIONS] IMAGE [CMD] | Create and start container |
docker start CONTAINER | Start stopped container |
docker stop CONTAINER | Stop running container |
docker restart CONTAINER | Restart container |
docker rm CONTAINER | Remove stopped container |
docker exec -it CONTAINER CMD | Run command in running container |
docker logs CONTAINER | View container logs |
docker run -d -p 8080:80 --name web nginx
docker exec -it web /bin/sh
docker logs -f web
Images
| Command | Description |
|---|
docker build -t NAME:TAG . | Build image from Dockerfile |
docker pull IMAGE | Pull image from registry |
docker push IMAGE | Push image to registry |
docker tag SOURCE TARGET | Tag image |
docker rmi IMAGE | Remove image |
docker images / docker image ls | List images |
docker build -t myapp:latest .
docker tag myapp:latest myregistry/myapp:v1
Dockerfile Instructions
| Instruction | Purpose |
|---|
FROM image[:tag] | Base image |
RUN cmd | Execute command (creates layer) |
COPY src dest | Copy files (prefer over ADD) |
ADD src dest | Copy + extract archives |
WORKDIR path | Set working directory |
EXPOSE port | Document port (no publish) |
CMD ["exec","arg"] | Default command (overridable) |
ENTRYPOINT ["exec"] | Fixed entry (always runs) |
ENV KEY=value | Environment variable |
ARG VAR=default | Build-time variable |
VOLUME ["path"] | Mount point |
HEALTHCHECK | Container health check |
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "index.js"]
Multi-stage Builds
FROM node:20 AS builder
WORKDIR /app
COPY . .
RUN npm run build
FROM node:20-alpine
COPY --from=builder /app/dist ./dist
CMD ["node", "dist/index.js"]
Docker Compose
| Command | Description |
|---|
docker compose up -d | Start services in background |
docker compose down | Stop and remove containers |
docker compose ps | List services |
docker compose logs -f [SERVICE] | Follow logs |
docker compose exec SERVICE CMD | Run command in service |
services:
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
depends_on:
- db
db:
image: postgres:16
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: secret
volumes:
postgres_data:
networks:
default:
driver: bridge
Volumes
| Command | Description |
|---|
docker volume create NAME | Create volume |
docker volume ls | List volumes |
docker volume rm NAME | Remove volume |
docker volume ls -q | Quiet (IDs only) |
docker run -v my_data:/data alpine
docker run -v $(pwd)/data:/data alpine # bind mount
Networking
| Command | Description |
|---|
docker network ls | List networks |
docker network create NAME | Create network |
docker network connect NET CONTAINER | Connect container |
docker network inspect NET | Inspect network |
docker run --network mynet alpine
docker run -p 8080:80 --name web nginx
Useful Flags
| Flag | Description |
|---|
-d | Detached (background) |
-it | Interactive + TTY |
-p HOST:CONTAINER | Port mapping |
-e VAR=value | Environment variable |
-v HOST:CONTAINER | Volume mount |
--name NAME | Container name |
--rm | Remove on exit |
--restart POLICY | Restart policy (always, on-failure) |
Cleanup
| Command | Description |
|---|
docker system prune | Remove unused data |
docker system prune -a | Remove all unused images |
docker system prune -a --volumes | Include volumes |
docker system df | Disk usage summary |
docker system prune -f
docker container prune -f
docker image prune -a -f