Docker Essentials¶
Guide des concepts essentiels de Docker et Docker Compose.
Structure Docker Compose¶
services:
app:
image: nginx:latest
container_name: my-app
restart: unless-stopped
ports:
- "80:80"
volumes:
- ./data:/app/data
environment:
- TZ=Europe/Paris
networks:
- frontend
networks:
frontend:
driver: bridge
volumes:
app-data:
Restart Policies¶
| Policy | Description |
|---|---|
no |
Ne redémarre jamais (défaut) |
always |
Redémarre toujours |
unless-stopped |
Redémarre sauf si arrêté manuellement |
on-failure |
Redémarre uniquement en cas d'erreur |
Ports¶
ports:
- "8080:80" # host:container
- "443:443" # HTTPS
- "3000" # Random host port
- "127.0.0.1:8080:80" # Localhost only
- "8080:80/udp" # UDP
Volumes¶
Types de volumes¶
volumes:
# Named volume (géré par Docker)
- app-data:/app/data
# Bind mount (chemin local)
- ./config:/app/config
# Read-only
- ./config:/app/config:ro
# Tmpfs (RAM)
- type: tmpfs
target: /tmp
Déclaration et Bonnes Pratiques de Nommage¶
[!IMPORTANT] Pourquoi nommer explicitement vos volumes avec
name:? Par défaut, si vous déclarez un volume nommé (app-data:), Docker Compose crée un volume physique sous la forme<nom_du_dossier_projet>_app-data.Si vous renommez le dossier du projet ou si vous le déplacez, et que vous n'avez pas configuré la variable
COMPOSE_PROJECT_NAME, Docker Compose cherchera un volume avec le nouveau nom de dossier et créera un volume vide. Vous risquez ainsi de perdre l'accès à vos données.En utilisant la propriété
name:de façon explicite, le volume conserve le même nom sur le système hôte, garantissant la portabilité de votre projet et la sécurité de vos données même si le répertoire change.
Environment Variables¶
environment:
# Format liste
- DATABASE_URL=postgres://localhost/db
- DEBUG=true
# Format map
DATABASE_URL: postgres://localhost/db
DEBUG: "true"
Avec fichier .env¶
Variables avec valeurs par défaut¶
Networks¶
Types de réseaux¶
networks:
# Bridge (défaut) - réseau isolé
frontend:
driver: bridge
# Internal - pas d'accès internet
backend:
internal: true
# External - réseau pré-existant
traefik:
external: true
Utilisation¶
Depends On¶
Simple¶
Avec condition¶
Healthcheck¶
services:
app:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
Types de tests¶
# CMD - exécute directement
test: ["CMD", "curl", "-f", "http://localhost"]
# CMD-SHELL - via shell
test: ["CMD-SHELL", "curl -f http://localhost || exit 1"]
# Désactiver
test: ["NONE"]
Profiles¶
Logging¶
Resource Limits¶
services:
app:
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M
Labels¶
Commandes Docker Compose¶
# Démarrer
docker compose up -d
# Arrêter
docker compose down
# Arrêter et supprimer volumes
docker compose down -v
# Logs
docker compose logs -f [service]
# Reconstruire
docker compose up -d --build
# Redémarrer un service
docker compose restart app
# Exécuter une commande
docker compose exec app bash
# Status
docker compose ps
# Mettre à jour les images
docker compose pull
Variables d'environnement Docker Compose¶
| Variable | Description |
|---|---|
COMPOSE_PROJECT_NAME |
Nom du projet |
COMPOSE_FILE |
Fichier(s) compose |
COMPOSE_PROFILES |
Profils actifs |
DOCKER_HOST |
Hôte Docker distant |
Fichiers Compose multiples¶
# Merge de fichiers
docker compose -f compose.yml -f compose.override.yml up -d
# Fichier et profil
docker compose -f compose.yml --profile dev up -d
Timezone¶
services:
app:
environment:
- TZ=Europe/Paris
volumes:
# Linux only
- /etc/localtime:/etc/localtime:ro