Answers

Quick Questions

1. What is the main difference between a container image and a container?

An image is a static template. A container is a running instance of that image.

2. Why do containers start faster than virtual machines?

Containers share the host OS kernel and only start the application process. VMs must boot an entire operating system.

3. What happens to data inside a container when it stops?

By default, all data is lost. Use volumes to persist data between container restarts.

4. How do you pass environment variables to a Python container?

Use -e flag: docker run -e MY_VAR=value my-app or environment section in docker-compose.yml.

5. What is the purpose of a Dockerfile?

A text file with instructions to build a container image automatically.

6. Why should you avoid running containers as root?

Security risk - if container is compromised, attacker has root access to host system.

7. What is the difference between COPY and ADD in a Dockerfile?

COPY just copies files. ADD can also extract archives and download URLs (use COPY for simple file copying).

8. How do you persist data from a container?

Use volumes (docker run -v) or bind mounts to store data outside the container filesystem.

9. What is Docker Compose used for?

To define and run multi-container applications using a YAML configuration file.

10. How do you limit memory usage for a container?

Use –memory flag: docker run –memory=512m my-app or resources section in docker-compose.yml.

Task Solutions

Task 1: Create a Python “Hello World” container

FROM python:3.12-slim
RUN useradd -m appuser
USER appuser
WORKDIR /app
ECHO 'print("Hello from Container!")' > hello.py
CMD ["python", "hello.py"]

Task 2: Pass environment variables to a Python script

# greeting.py
import os
name = os.environ.get('NAME', 'World')
print(f"Hello, {name}!")
docker run -e NAME="DevOps" my-app

Task 3: Mount a volume to read host files

# Create test file
echo "test data" > data.txt

# Run with volume mount
docker run -v $(pwd):/data my-app

Task 4: Build a simple Python web API container

# app.py
from flask import Flask, jsonify
app = Flask(__name__)

@app.route('/')
def hello():
    return jsonify({"message": "Hello API"})

app.run(host='0.0.0.0', port=5000)
FROM python:3.12-slim
RUN pip install flask
COPY app.py .
EXPOSE 5000
CMD ["python", "app.py"]

Task 5: Create a multi-stage build

# Build stage
FROM python:3.12 as builder
COPY requirements.txt .
RUN pip install --user -r requirements.txt

# Runtime stage
FROM python:3.12-slim
COPY --from=builder /root/.local /root/.local
COPY app.py .
CMD ["python", "app.py"]

Task 6: Build a Python data processing container

# processor.py
import pandas as pd
import sys

data = pd.read_csv('/input/data.csv')
result = data.groupby('category').sum()
result.to_csv('/output/summary.csv')
docker run -v $(pwd)/data:/input -v $(pwd)/output:/output processor

Task 7: Create a container that installs Python packages

FROM python:3.12-slim
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "main.py"]

Task 8: Write a health check for your container

HEALTHCHECK --interval=30s --timeout=3s \
  CMD curl -f http://localhost:5000/health || exit 1

Task 9: Create a docker-compose.yml for multi-container app

version: '3.8'
services:
  web:
    build: .
    ports:
      - "8080:5000"
    depends_on:
      - redis
  redis:
    image: redis:alpine

Task 10: Set resource limits on a container

docker run --memory=512m --cpus=0.5 my-app
# docker-compose.yml
services:
  app:
    image: my-app
    deploy:
      resources:
        limits:
          memory: 512M
          cpus: '0.5'

Discussion Topics

1. Container security and best practices

Consider the principle of least privilege, vulnerability scanning, secrets management, and runtime security monitoring. How would you implement a security-first container strategy?

2. Container orchestration trade-offs

Compare Docker Swarm, Kubernetes, and cloud-native solutions. When would you choose each? What are the operational complexity vs. feature trade-offs?

3. Microservices containerization strategy

How do you decide service boundaries? What patterns help with service discovery, configuration management, and inter-service communication in a containerized environment?

4. Container monitoring and observability

Design a comprehensive monitoring strategy covering logs, metrics, traces, and health checks. How do you handle distributed debugging across multiple containers?

5. Production container deployment patterns

Evaluate blue-green deployments, rolling updates, canary releases, and feature flags in containerized environments. What deployment strategy fits different application types and risk tolerances?