Skip to content

Conteneurs Docker

Introduction

Kolla-Ansible déploie tous les services OpenStack dans des conteneurs Docker. Comprendre Docker est essentiel pour le déploiement, le troubleshooting et les opérations day-2.

Cette section couvre les concepts Docker nécessaires pour administrer un déploiement Kolla-Ansible.

Prérequis

Points à apprendre

Installation Docker

# Ubuntu
apt update
apt install -y ca-certificates curl gnupg

install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  tee /etc/apt/sources.list.d/docker.list > /dev/null

apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# Ajouter utilisateur au groupe docker
usermod -aG docker $USER

# Démarrer et activer
systemctl enable --now docker

Architecture Docker

graph TB
    subgraph Client["Docker Client"]
        cli["docker CLI"]
    end

    subgraph Daemon["Docker Daemon (dockerd)"]
        images["Images"]
        containers["Containers"]
        networks["Networks"]
        volumes["Volumes"]
        plugins["Plugins"]
    end

    subgraph Containerd["containerd"]
        cd[" "]
    end

    subgraph Runtime["runc (OCI runtime)"]
        runc[" "]
    end

    cli -->|REST API| Daemon
    images --> cd
    containers --> cd
    networks --> cd
    volumes --> cd
    cd --> runc

Gestion des conteneurs

Commandes de base

# Lancer conteneur
docker run -d --name nginx nginx:latest
docker run -it --rm ubuntu:24.04 bash  # Interactif, supprimé à la sortie

# Lister conteneurs
docker ps           # En cours
docker ps -a        # Tous
docker ps -q        # IDs seulement

# Gestion lifecycle
docker start|stop|restart nom-conteneur
docker pause|unpause nom-conteneur
docker kill nom-conteneur

# Logs
docker logs nom-conteneur
docker logs -f nom-conteneur        # Follow
docker logs --tail 100 nom-conteneur
docker logs --since 1h nom-conteneur

# Exécuter commande dans conteneur
docker exec -it nom-conteneur bash
docker exec nom-conteneur ls -la

# Informations
docker inspect nom-conteneur
docker stats                        # Ressources temps réel
docker top nom-conteneur            # Processus

# Suppression
docker rm nom-conteneur
docker rm -f nom-conteneur          # Force (si running)
docker container prune              # Supprimer tous les arrêtés

Options importantes

docker run \
  -d                                 # Detached (background)
  --name mon-conteneur               # Nom
  --hostname mon-host                # Hostname dans conteneur
  -p 8080:80                         # Port mapping host:container
  -p 192.168.1.10:8080:80            # Bind IP spécifique
  -v /host/path:/container/path      # Bind mount
  -v vol-name:/container/path        # Named volume
  --mount type=bind,src=/host,dst=/container  # Syntaxe mount
  -e VAR=value                       # Variable environnement
  --env-file .env                    # Fichier de variables
  --network mon-network              # Réseau
  --restart unless-stopped           # Politique restart
  --memory 512m                      # Limite RAM
  --cpus 0.5                         # Limite CPU
  --privileged                       # Mode privilégié (éviter)
  --user 1000:1000                   # UID:GID
  nginx:latest                       # Image

Gestion des images

# Télécharger image
docker pull ubuntu:24.04
docker pull quay.io/kolla/nova-api:2025.2

# Lister images
docker images
docker image ls

# Informations
docker image inspect nginx:latest
docker history nginx:latest

# Supprimer
docker rmi nginx:latest
docker image prune              # Supprimer images non utilisées
docker image prune -a           # Supprimer toutes les non utilisées

# Sauvegarder/Charger
docker save nginx:latest -o nginx.tar
docker load -i nginx.tar

# Tag et push
docker tag nginx:latest registry.local/nginx:v1
docker push registry.local/nginx:v1

Construction d'images

Dockerfile basique

# Exemple Dockerfile
FROM ubuntu:24.04

# Métadonnées
LABEL maintainer="admin@example.com"
LABEL version="1.0"

# Variables d'environnement
ENV APP_HOME=/app
ENV DEBIAN_FRONTEND=noninteractive

# Installation paquets
RUN apt-get update && apt-get install -y \
    python3 \
    python3-pip \
    && rm -rf /var/lib/apt/lists/*

# Créer utilisateur non-root
RUN useradd -m -s /bin/bash appuser

# Répertoire de travail
WORKDIR $APP_HOME

# Copier fichiers
COPY requirements.txt .
RUN pip3 install --no-cache-dir -r requirements.txt

COPY app/ .

# Changer propriétaire
RUN chown -R appuser:appuser $APP_HOME

# Utilisateur non-root
USER appuser

# Port exposé (documentation)
EXPOSE 8000

# Commande par défaut
CMD ["python3", "app.py"]

Build et bonnes pratiques

# Build image
docker build -t mon-app:v1 .
docker build -t mon-app:v1 -f Dockerfile.prod .

# Build avec arguments
docker build --build-arg VERSION=1.0 -t mon-app:v1 .

# Multi-stage build (réduire taille)
# Multi-stage Dockerfile
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp

FROM alpine:3.19
COPY --from=builder /app/myapp /usr/local/bin/
CMD ["myapp"]

Volumes et persistance

# Types de stockage
# 1. Volumes (géré par Docker)
docker volume create mon-volume
docker volume ls
docker volume inspect mon-volume
docker run -v mon-volume:/data nginx

# 2. Bind mounts (répertoire hôte)
docker run -v /host/data:/container/data nginx

# 3. tmpfs (en mémoire)
docker run --tmpfs /tmp nginx

# Backup volume
docker run --rm -v mon-volume:/data -v $(pwd):/backup \
  ubuntu tar cvf /backup/backup.tar /data

Réseaux Docker

Types de réseaux

Driver Description Cas d'usage
bridge Réseau isolé par défaut Conteneurs sur même hôte
host Partage stack réseau hôte Performance max
none Pas de réseau Isolation totale
overlay Multi-hôtes (Swarm) Cluster
macvlan MAC unique par conteneur Intégration LAN

Commandes réseau

# Créer réseau
docker network create mon-reseau
docker network create --driver bridge --subnet 172.20.0.0/16 mon-reseau

# Lister
docker network ls
docker network inspect mon-reseau

# Connecter conteneur
docker network connect mon-reseau mon-conteneur
docker network disconnect mon-reseau mon-conteneur

# Lancer conteneur sur réseau
docker run --network mon-reseau nginx

Réseau dans Kolla

# Kolla utilise des réseaux spécifiques
docker network ls | grep kolla

# Typiquement:
# - kolla_bridge (management)
# - kolla_network (provider)

Docker Compose

Docker Compose orchestre plusieurs conteneurs. Kolla n'utilise pas Compose directement mais le concept est similaire.

docker-compose.yml

version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html:ro
    networks:
      - frontend
    depends_on:
      - api
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 30s
      timeout: 10s
      retries: 3

  api:
    build:
      context: ./api
      dockerfile: Dockerfile
    environment:
      - DATABASE_URL=postgres://db:5432/app
    networks:
      - frontend
      - backend
    restart: unless-stopped

  db:
    image: postgres:16
    volumes:
      - db-data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: secret
    networks:
      - backend
    restart: unless-stopped

networks:
  frontend:
  backend:

volumes:
  db-data:

Commandes Compose

# Démarrer
docker compose up -d
docker compose up -d --build  # Rebuild images

# Arrêter
docker compose down
docker compose down -v  # + supprimer volumes

# Logs
docker compose logs -f
docker compose logs api

# Scale
docker compose up -d --scale api=3

# Exécuter commande
docker compose exec api bash

Registries privés

# Lancer registry local
docker run -d -p 5000:5000 --name registry \
  -v registry-data:/var/lib/registry \
  registry:2

# Taguer et pousser
docker tag nginx:latest localhost:5000/nginx:latest
docker push localhost:5000/nginx:latest

# Pour Kolla, configurer dans globals.yml:
# docker_registry: "registry.local:5000"
# docker_namespace: "kolla"

Troubleshooting conteneurs

# Logs détaillés
docker logs --details mon-conteneur

# Événements Docker
docker events

# Utilisation ressources
docker stats --no-stream

# Système
docker system df              # Espace disque
docker system prune -a        # Nettoyage complet

# Debug conteneur qui crash
docker run -it --entrypoint /bin/sh image:tag
docker logs $(docker ps -lq)  # Logs dernier conteneur
docker inspect --format='{{.State.ExitCode}}' mon-conteneur

Sécurité Docker

# Limiter capabilities
docker run --cap-drop ALL --cap-add NET_BIND_SERVICE nginx

# Read-only filesystem
docker run --read-only nginx

# User non-root
docker run --user 1000:1000 nginx

# Seccomp profile
docker run --security-opt seccomp=profile.json nginx

# Pas de nouveaux privilèges
docker run --security-opt no-new-privileges nginx

Exemples pratiques

Lab 1 : Stack web complète

mkdir -p ~/docker-lab && cd ~/docker-lab

# Créer docker-compose.yml
cat > docker-compose.yml << 'EOF'
version: '3.8'

services:
  nginx:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
    networks:
      - web
    depends_on:
      - app

  app:
    image: python:3.12-slim
    working_dir: /app
    volumes:
      - ./app:/app
    command: python -m http.server 5000
    networks:
      - web
    expose:
      - "5000"

networks:
  web:
EOF

# Config nginx
cat > nginx.conf << 'EOF'
upstream app {
    server app:5000;
}

server {
    listen 80;
    location / {
        proxy_pass http://app;
    }
}
EOF

# App simple
mkdir -p app
echo "<h1>Hello from Docker!</h1>" > app/index.html

# Lancer
docker compose up -d
curl http://localhost:8080

Lab 2 : Simuler conteneurs Kolla

# Simuler l'exécution de conteneurs style Kolla

# Créer répertoires config style Kolla
mkdir -p /tmp/kolla/{nova,keystone}

# Lancer conteneur avec config montée
docker run -d \
  --name test-nova \
  --hostname nova \
  --network host \
  -v /tmp/kolla/nova:/etc/nova:ro \
  -v /var/log/kolla/nova:/var/log/nova \
  --restart unless-stopped \
  ubuntu:24.04 \
  tail -f /dev/null

# Vérifier
docker ps
docker logs test-nova

# Cleanup
docker rm -f test-nova

Ressources

Checkpoint

  • Je sais installer et configurer Docker
  • Je maîtrise les commandes de gestion des conteneurs
  • Je comprends la différence entre volumes et bind mounts
  • Je peux construire des images avec Dockerfile
  • Je sais utiliser Docker Compose
  • Je comprends les réseaux Docker
  • Je peux diagnostiquer les problèmes de conteneurs