Batch 4: Cloud Ansible AWS & Azure Docker & Podman Apache & NGINX ← Full TOC

🐳 Chapter 40 — Docker

Complete Docker and Podman reference: run, build, Dockerfile, Docker Compose, multi-stage builds.
Part of The Direct Path to Linux Ubuntu — free for all.

3Topics
81+Commands
2Examples
FreeNo login
🐳 Docker Basics 📄 Dockerfile 🎼 Docker Compose ⚡ Examples

🐳 Docker Basics

🐳 Docker Basicsdocker run, build, push, pull, ps, images, volumes

📄 Dockerfile

📄 Dockerfile Best PracticesMulti-stage builds, layer caching, security, .dockerignore

🎼 Docker Compose

🎼 Docker Composedocker-compose.yml — multi-container apps

⚡ Quick Examples

Docker Quick Reference

Most-used Docker commands in one place.

# ── Images ───────────────────────────────────────────────────
docker pull nginx:alpine           # pull image
docker images                      # list local images
docker rmi nginx:alpine            # remove image
docker image prune -f              # remove unused images
docker build -t myapp:1.0 .        # build from Dockerfile
docker tag myapp:1.0 myapp:latest  # tag image

# ── Containers ────────────────────────────────────────────────
docker ps                          # running containers
docker ps -a                       # all containers
docker run -d --name web -p 80:80 nginx    # run detached
docker run -it --rm ubuntu bash    # interactive, auto-remove
docker run -e VAR=val -v /host:/cnt myapp  # env + volume
docker stop web                    # graceful stop
docker start web                   # start stopped
docker restart web                 # restart
docker rm web                      # remove (must be stopped)
docker rm -f web                   # force remove running

# ── Debugging ─────────────────────────────────────────────────
docker logs -f web                 # stream logs
docker logs --tail 100 web         # last 100 lines
docker exec -it web bash           # shell in container
docker exec web cat /etc/hosts     # run command
docker inspect web                 # full JSON info
docker stats                       # resource usage
docker top web                     # processes in container
docker cp web:/app/log.txt ./      # copy file out

# ── Volumes ───────────────────────────────────────────────────
docker volume create mydata        # named volume
docker volume ls                   # list volumes
docker volume inspect mydata       # volume details
docker volume rm mydata            # remove volume

# ── Networks ──────────────────────────────────────────────────
docker network create mynet        # create network
docker network ls                  # list networks
docker network connect mynet web   # connect container
docker network inspect mynet       # network details

# ── Cleanup ───────────────────────────────────────────────────
docker container prune -f          # remove stopped containers
docker image prune -f              # remove dangling images
docker volume prune -f             # remove unused volumes
docker system prune -af            # remove everything unused

# ── Registry ──────────────────────────────────────────────────
docker login ghcr.io               # login to registry
docker push ghcr.io/org/myapp:1.0  # push image
docker pull ghcr.io/org/myapp:1.0  # pull image

# ── Docker Compose ────────────────────────────────────────────
docker compose up -d               # start all services
docker compose down                # stop all
docker compose logs -f service     # stream logs
docker compose exec service bash   # shell in
docker compose ps                  # status
docker compose pull                # update images
docker compose build               # rebuild images

Multi-stage Build Example

Build minimal production images with multi-stage Dockerfiles.

# ── Python FastAPI — Multi-stage ─────────────────────────────
# Dockerfile.python
FROM python:3.12-slim AS base
ENV PYTHONDONTWRITEBYTECODE=1 PYTHONUNBUFFERED=1

FROM base AS builder
WORKDIR /build
COPY requirements.txt .
RUN pip install --user --no-cache-dir -r requirements.txt

FROM base AS runtime
WORKDIR /app
COPY --from=builder /root/.local /root/.local
COPY src/ ./src/
RUN addgroup --system app && adduser --system --ingroup app app
USER app
EXPOSE 8080
CMD ["python", "-m", "uvicorn", "src.main:app", "--host", "0.0.0.0", "--port", "8080"]

# ── Node.js Next.js — Multi-stage ────────────────────────────
# Dockerfile.node
FROM node:20-alpine AS deps
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev

FROM node:20-alpine AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build

FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
RUN addgroup -g 1001 nodejs && adduser -u 1001 -G nodejs nextjs
COPY --from=builder --chown=nextjs:nodejs /app/.next ./.next
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
USER nextjs
EXPOSE 3000
CMD ["npm", "start"]

# ── Go binary — scratch base ──────────────────────────────────
# Dockerfile.go
FROM golang:1.22-alpine AS builder
WORKDIR /build
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o server .

FROM scratch
COPY --from=builder /build/server /server
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
EXPOSE 8080
ENTRYPOINT ["/server"]
# Final Go image: ~5-10MB vs 300MB+ with full Go runtime

# Build all three:
docker build -f Dockerfile.python -t myapp-py:slim .
docker build -f Dockerfile.node   -t myapp-node:slim .
docker build -f Dockerfile.go     -t myapp-go:tiny .
docker images | grep myapp