Docker & Docker Compose

Le guide de survie

Docker & Docker Compose

Docker est une plateforme de conteneurisation permettant de créer, déployer et exécuter des applications dans des conteneurs légers et portables. Il garantit la cohérence entre les environnements de développement, de test et de production.


Cheat Sheet docker

Commande Description
docker version Affiche la version de Docker installée
docker info Informations système sur Docker
docker pull <image> Télécharge une image depuis Docker Hub
docker build -t <nom>:<tag> . Construit une image à partir d’un Dockerfile
docker images Liste les images locales
docker rmi <image> Supprime une image
docker run <image> Lance un conteneur à partir d’une image
docker run -it <image> bash Lance un conteneur en mode interactif avec un shell
docker ps Liste les conteneurs en cours d’exécution
docker ps -a Liste tous les conteneurs (actifs ou non)
docker stop <container> Arrête un conteneur
docker start <container> Démarre un conteneur existant
docker rm <container> Supprime un conteneur
docker exec -it <container> bash Exécute une commande dans un conteneur actif
docker logs <container> Affiche les logs d’un conteneur
docker network ls Liste les réseaux Docker
docker volume ls Liste les volumes Docker
docker system prune Nettoie les ressources inutilisées (dangereux)

Docker Compose est un outil permettant de définir et de gérer des applications multi-conteneurs avec un simple fichier docker-compose.yml. Il facilite l’orchestration locale d’environnements complexes.


Cheat Sheet docker-compose

Commande Description
docker-compose version Affiche la version de Docker Compose
docker-compose up Démarre les services définis dans docker-compose.yml
docker-compose up -d Démarre les services en arrière-plan
docker-compose down Arrête et supprime les conteneurs, réseaux, etc.
docker-compose build Construit les images
docker-compose ps Liste les services actifs
docker-compose logs Affiche les logs des services
docker-compose exec <service> bash Exécute une commande dans un conteneur
docker-compose stop Arrête les services
docker-compose start Redémarre les services arrêtés
docker-compose restart Redémarre les services
docker-compose config Valide et affiche la configuration finale

-# Exemple de docker-compose.yml

Ce fichier docker-compose.yml met en place une stack multi-conteneurs avec :

  • Un serveur Flask (Python) pour une API
  • Une base de données PostgreSQL
  • Un Nginx en reverse proxy

docker-compose.yml

version: '3.8'  # Version du format Docker Compose

services:
  web:
    build: ./web  # Construit l'image à partir du Dockerfile situé dans ./web
    container_name: flask_app
    restart: always  # Redémarre automatiquement le conteneur en cas de crash
    ports:
      - "5000:5000"  # Redirige le port 5000 de l'hôte vers le conteneur
    volumes:
      - ./web:/app  # Monte le code source dans le conteneur (pratique en dev)
    environment:
      - DATABASE_URL=postgres://user:password@db:5432/mydb
    depends_on:
      - db  # Assure que "db" est lancé avant "web"

  db:
    image: postgres:14-alpine
    container_name: postgres_db
    restart: always
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydb
    volumes:
      - db_data:/var/lib/postgresql/data  # Persistance des données

  nginx:
    image: nginx:alpine
    container_name: nginx_proxy
    restart: always
    ports:
      - "80:80"  # Expose le serveur web
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro  # Configuration custom de Nginx
    depends_on:
      - web

volumes:
  db_data:  # Déclare un volume nommé pour PostgreSQL

Arborescence du projet

.
├── docker-compose.yml
├── web
│   ├── Dockerfile
│   └── app.py
├── nginx
│   └── nginx.conf

Exemple de web/Dockerfile

FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt ./
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]

Exemple de web/app.py

from flask import Flask
import os

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello from Flask behind Nginx!'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Exemple de nginx/nginx.conf

events {}

http {
    server {
        listen 80;
        location / {
            proxy_pass http://web:5000;  # Le nom du service "web" fait office de DNS interne
        }
    }
}

Démarrage

docker-compose up --build

Nettoyage

docker-compose down -v  # Supprime conteneurs + volumes