Docker for Developers: Containerizing Your Applications

Docker for Developers: Containerizing Your Applications

Introduction

[Explain why containerization improves parity, onboarding speed, and CI/CD reliability.]

Prerequisites

  • Docker Desktop installed
  • Basic knowledge of CLI
  • Sample Node.js or .NET project

Core Concepts

Concept Purpose Developer Focus
Dockerfile Build instructions Image reproducibility
Image Immutable artifact Deployment unit
Container Running instance Environment consistency
Volume Persistent data Local development state
Network Service communication Microservices testing

Step-by-Step Guide

Step 1: Create a Minimal Dockerfile

FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
CMD ["node", "src/index.js"]

Step 2: Build & Run Locally

docker build -t myapp:dev .
docker run --rm -p 3000:3000 myapp:dev

Step 3: Add Multi-Stage Build (Optimization)

FROM node:20-alpine AS build
WORKDIR /src
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:20-alpine AS runtime
WORKDIR /app
COPY --from=build /src/dist ./dist
CMD ["node", "dist/index.js"]

Step 4: Debugging Containers

[Describe VS Code devcontainers, attach debugger, logs]

Step 5: Compose Multi-Service Dev Env

version: "3.9"
services:
  api:
    build: .
    ports: ["5000:5000"]
  redis:
    image: redis:7-alpine
    ports: ["6379:6379"]

Best Practices

  • Use smallest base image (alpine/distroless where possible)
  • Pin versions explicitly
  • Keep layers ordered to leverage caching

Common Issues & Troubleshooting

Issue: Large image size
Solution: Multi-stage builds + .dockerignore

Issue: Container restarts
Solution: Check healthcheck & app logs

Key Takeaways

  • Containerization accelerates environment parity.
  • Multi-stage builds reduce size & deployment time.
  • Compose simplifies local multi-service orchestration.

Next Steps

  • Push image to GitHub Container Registry
  • Integrate image scan in CI pipeline

Additional Resources


What was your biggest win after adopting Docker?