Introduction to Containerization with Docker and Kubernetes

From Server rental store
Jump to navigation Jump to search

Introduction to containerization with Docker and Kubernetes provides a detailed guide to both technologies. For a quick overview, see Docker and Kubernetes: Getting Started. This article goes deeper into practical usage patterns and production considerations.

Why Containerization?

Traditional server deployments suffer from several problems:

  • Dependency conflicts — different applications need different library versions
  • Environment drift — development, staging, and production diverge over time
  • "Works on my machine" — code behaves differently across environments
  • Slow deployments — setting up new servers takes hours or days

Containers solve all of these by packaging applications with their exact dependencies into portable, reproducible units.

Docker in Depth

Image Layers and Caching

Docker images are built in layers. Each instruction in a Dockerfile creates a new layer:

FROM python:3.11-slim          # base layer
WORKDIR /app                   # layer 2
COPY requirements.txt .        # layer 3
RUN pip install -r requirements.txt  # layer 4 (cached if requirements unchanged)
COPY . .                       # layer 5 (changes often)

Best practice: put rarely-changing instructions first to maximize cache utilization.

Docker Networking

Docker provides several network modes:

  • bridge (default) — containers communicate via an internal network
  • host — container shares the host network stack (best performance)
  • overlay — multi-host networking for Docker Swarm
# Create a custom network
docker network create myapp-network
# Run containers on the same network
docker run -d --network myapp-network --name db postgres:15
docker run -d --network myapp-network --name web myapp

Containers on the same network can reach each other by name (e.g., db resolves to the database container).

Docker Volumes

Volumes persist data beyond the container lifecycle:

# Named volume
docker run -d -v pgdata:/var/lib/postgresql/data postgres:15
# Bind mount (host directory)
docker run -d -v /host/path:/container/path nginx

Docker Compose for Multi-Container Apps

A production-ready Docker Compose example:

version: '3.8'
services:
  web:
    build: .
    ports:
      - "80:8000"
    environment:
      - DATABASE_URL=postgres://user:pass@db:5432/app
    depends_on:
      - db
      - redis
    restart: unless-stopped
  db:
    image: postgres:15
    volumes:
      - pgdata:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: secret
    restart: unless-stopped
  redis:
    image: redis:7-alpine
    restart: unless-stopped
volumes:
  pgdata:

Kubernetes Architecture

Control Plane Components

  • API Server — the front door for all cluster operations
  • etcd — distributed key-value store for cluster state
  • Scheduler — assigns pods to nodes based on resource requirements
  • Controller Manager — maintains desired cluster state

Worker Node Components

  • kubelet — manages pods on each node
  • kube-proxy — handles network routing
  • Container runtime — runs containers (containerd, CRI-O)

Key Resources

Deployment — manages a set of identical pods:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: web
        image: myapp:latest
        ports:
        - containerPort: 8000
        resources:
          requests:
            memory: "128Mi"
            cpu: "250m"
          limits:
            memory: "256Mi"
            cpu: "500m"

Service — stable endpoint for accessing pods:

apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  selector:
    app: web
  ports:
  - port: 80
    targetPort: 8000
  type: ClusterIP

Docker vs Kubernetes: When to Use What

Scenario Recommendation
Single server, few containers Docker Compose
Need auto-scaling Kubernetes
Small team, simple app Docker Compose
Microservices architecture Kubernetes
High availability required Kubernetes
Quick prototyping Docker Compose

See Also