Ce que tu vas apprendre
Docker Compose
Orchestrer Odoo 19 et PostgreSQL 16 avec un seul fichier YAML.
Volumes persistants
Conserver les données, le filestore et tes modules entre les redémarrages.
Modules custom
Monter ton répertoire de modules dans le container pour développer en live.
Multi-instances
Faire tourner plusieurs versions d'Odoo côte à côte sur la même machine.
- Docker Engine installé — Linux ou Docker Desktop — Windows / macOS
- Docker Compose V2 (inclus dans Docker Desktop et les installations récentes de Docker Engine)
- Minimum 4 Go de RAM (8 Go recommandés)
- ~2 Go d'espace disque pour les images Docker
Cette méthode est idéale pour tester rapidement Odoo ou pour monter un environnement de développement reproductible. Tu n'as besoin d'installer ni Python, ni PostgreSQL, ni wkhtmltopdf sur ta machine — tout est dans les containers.
docker compose (avec un espace, V2) et non plus docker-compose
(avec un tiret, V1). Si tu as une ancienne installation, mets à jour Docker.
Dans cet article on utilise la syntaxe V2.
Architecture Docker Odoo
Deux containers communiquent via un réseau Docker interne. Les données sont stockées dans des volumes nommés qui survivent à la destruction des containers.
Le container db (PostgreSQL 16) et le container odoo (Odoo 19)
partagent un réseau Docker. Les volumes verts persistent les données sur le disque hôte.
Étape 1 — Vérifier l'installation Docker
Ouvre un terminal et vérifie que Docker et Compose sont disponibles :
docker --version
# Attendu : Docker version 27.x.x (ou supérieur)
docker compose version
# Attendu : Docker Compose version v2.x.x
docker pour ne pas avoir à taper sudo à chaque commande :
sudo usermod -aG docker $USER
# Déconnecte-toi puis reconnecte-toi pour que le changement prenne effet
Étape 2 — Créer la structure du projet
Crée un répertoire dédié à ton projet Odoo Docker :
mkdir -p ~/odoo19-docker/custom-addons
cd ~/odoo19-docker
La structure cible :
~/odoo19-docker/
├── docker-compose.yml # Orchestration des containers
├── odoo.conf # Configuration Odoo (optionnel)
└── custom-addons/ # Tes modules personnalisés
Étape 3 — Écrire le fichier docker-compose.yml
C'est le fichier central. Crée docker-compose.yml dans
~/odoo19-docker/ :
services:
db:
image: postgres:16
container_name: odoo19-db
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=odoo
- POSTGRES_PASSWORD=odoo
volumes:
- odoo-db:/var/lib/postgresql/data
restart: unless-stopped
odoo:
image: odoo:19.0
container_name: odoo19-web
depends_on:
- db
ports:
- "8069:8069"
- "8072:8072"
environment:
- HOST=db
- PORT=5432
- USER=odoo
- PASSWORD=odoo
volumes:
- odoo-data:/var/lib/odoo
- ./custom-addons:/mnt/extra-addons
- ./odoo.conf:/etc/odoo/odoo.conf:ro
restart: unless-stopped
volumes:
odoo-db:
odoo-data:
image: postgres:16— l'image officielle PostgreSQL 16. Odoo 19 requiert PostgreSQL 13 minimum.image: odoo:19.0— l'image officielle Odoo 19 maintenue par Odoo S.A. Inclut Python 3.12, wkhtmltopdf 0.12.6.1 et toutes les dépendances.depends_on: db— Docker démarre PostgreSQL avant Odoo. L'entrypoint attend automatiquement que PostgreSQL soit prêt (timeout 30s).HOST=db— le hostname du container PostgreSQL dans le réseau Docker interne.odoo-db,odoo-data— volumes nommés Docker qui persistent les données même après undocker compose down../custom-addons:/mnt/extra-addons— bind mount : tes modules locaux sont directement visibles dans le container../odoo.conf:/etc/odoo/odoo.conf:ro— ta config custom montée en lecture seule.8072:8072— port longpolling pour le temps réel (discuss, notifications).
Étape 4 — Créer le fichier de configuration (optionnel)
Par défaut, l'image Docker Odoo fonctionne sans fichier de configuration.
Mais pour personnaliser le comportement, crée odoo.conf :
[options]
; Mot de passe maître — protège la page /web/database/manager
admin_passwd = change_moi_en_production
; Répertoire des modules custom (correspond au bind mount)
addons_path = /mnt/extra-addons
; Filestore (correspond au volume odoo-data)
data_dir = /var/lib/odoo
; Logs dans la console Docker (pas dans un fichier)
logfile = None
log_level = info
; Filtrer les bases affichées (regex)
; dbfilter = ^mydb$
; Nombre de workers (0 = mono-thread, bon pour le dev)
workers = 0
logfile = None ?
En Docker, les logs doivent aller sur stdout/stderr pour être capturés par
docker compose logs. Si tu mets un fichier, les logs seront piégés
dans le container et perdus à sa destruction.
Étape 5 — Lancer Odoo
Depuis le répertoire ~/odoo19-docker/, lance les deux containers :
docker compose up -d
Docker télécharge les images (première fois uniquement), crée les volumes et démarre les containers. Suis les logs en temps réel :
docker compose logs -f odoo
Quand tu vois cette ligne, Odoo est prêt :
odoo19-web | INFO ? odoo.modules.loading: Modules loaded.
Ouvre http://localhost:8069 dans ton navigateur. Crée ta première base de données et c'est parti.
Commandes courantes
# Arrêter les containers (les données sont conservées)
docker compose stop
# Redémarrer les containers
docker compose start
# Arrêter ET supprimer les containers (les volumes persistent)
docker compose down
# Arrêter, supprimer containers ET volumes (PERTE DE DONNÉES)
docker compose down -v
# Voir les logs en temps réel
docker compose logs -f
# Vérifier l'état des containers
docker compose ps
docker compose down -v supprime les volumes
nommés et donc toutes les données (bases PostgreSQL + filestore Odoo).
Utilise cette commande uniquement pour repartir de zéro.
Étape 6 — Développer avec des modules custom
Grâce au bind mount ./custom-addons:/mnt/extra-addons, tout module
que tu places dans le répertoire custom-addons/ est immédiatement
visible par Odoo.
Pour que Odoo détecte un nouveau module :
- Place ton module dans
~/odoo19-docker/custom-addons/mon_module/ - Dans Odoo, active le mode développeur (Paramètres → Activer le mode développeur)
- Va dans Applications → Mettre à jour la liste des applications
- Cherche et installe ton module
Pour mettre à jour un module après modification du code :
# Méthode 1 : redémarrer le container avec l'option -u
docker compose run --rm odoo -- -u mon_module -d ma_base --stop-after-init
# Méthode 2 : redémarrer simplement le container
docker compose restart odoo
docker compose exec odoo bash
Étape 7 — Faire tourner plusieurs instances
L'un des grands avantages de Docker : tu peux faire tourner plusieurs versions d'Odoo côte à côte sur la même machine, chacune avec sa propre base PostgreSQL.
Crée un deuxième répertoire pour Odoo 18, par exemple :
mkdir -p ~/odoo18-docker/custom-addons
cd ~/odoo18-docker
Et un docker-compose.yml adapté avec des noms et ports différents :
services:
db:
image: postgres:16
container_name: odoo18-db
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=odoo
- POSTGRES_PASSWORD=odoo
volumes:
- odoo18-db:/var/lib/postgresql/data
odoo:
image: odoo:18.0
container_name: odoo18-web
depends_on:
- db
ports:
- "8070:8069"
- "8073:8072"
environment:
- HOST=db
- PORT=5432
- USER=odoo
- PASSWORD=odoo
volumes:
- odoo18-data:/var/lib/odoo
- ./custom-addons:/mnt/extra-addons
volumes:
odoo18-db:
odoo18-data:
Résultat : Odoo 19 tourne sur localhost:8069
et Odoo 18 sur localhost:8070. Les deux instances
sont complètement isolées.
| Instance | Port HTTP | Port longpolling | Container DB |
|---|---|---|---|
| Odoo 19 | 8069 | 8072 | odoo19-db |
| Odoo 18 | 8070 | 8073 | odoo18-db |
- Base Ubuntu Noble (24.04) : l'image Odoo 19 est basée sur Ubuntu 24.04 LTS (les versions précédentes utilisaient Debian).
- Python 3.12 : inclus nativement dans l'image.
- PostgreSQL 13 minimum : utilise
postgres:16dans ton compose (paspostgres:12). - Tag
latest: depuis la sortie d'Odoo 19,odoo:latestpointe vers 19.0. Préfère toujours un tag explicite (odoo:19.0) pour éviter les surprises. - Architectures : l'image supporte
amd64,arm64(Apple Silicon M1/M2/M3) etppc64le.
Dépannage — Les erreurs les plus courantes
| Erreur | Solution |
|---|---|
port is already allocated |
Un autre service utilise le port 8069. Change le port dans le compose :
"8080:8069" |
connection refused (Odoo → PostgreSQL) |
PostgreSQL n'a pas fini de démarrer. L'entrypoint attend 30 secondes
automatiquement. Si ça persiste, vérifie les logs :
docker compose logs db |
FATAL: password authentication failed |
Les variables USER/PASSWORD du service Odoo
ne correspondent pas à POSTGRES_USER/POSTGRES_PASSWORD |
| Module custom non détecté | Vérifie que addons_path dans odoo.conf inclut
/mnt/extra-addons et que le module a un __manifest__.py |
| Rapports PDF vides | L'image officielle inclut wkhtmltopdf. Si tu utilises une image custom, vérifie que wkhtmltopdf 0.12.6.1 est installé dans l'image |
no space left on device |
Nettoie les images/volumes inutilisés :
docker system prune -a |
Récapitulatif
Voici la checklist de ton environnement Docker Odoo :
| Composant | Détail |
|---|---|
| Image Odoo | odoo:19.0 (Ubuntu Noble, Python 3.12, wkhtmltopdf inclus) |
| Image PostgreSQL | postgres:16 |
| Port HTTP | 8069 → localhost:8069 |
| Port longpolling | 8072 → localhost:8072 |
| Volume DB | odoo-db → /var/lib/postgresql/data |
| Volume filestore | odoo-data → /var/lib/odoo |
| Modules custom | ./custom-addons → /mnt/extra-addons |
| Configuration | ./odoo.conf → /etc/odoo/odoo.conf |
Comparatif des 3 méthodes d'installation
Tu as maintenant vu les trois méthodes d'installation du Bloc 1. Voici un résumé pour t'aider à choisir :
| Ubuntu (sources) | Windows (sources) | Docker | |
|---|---|---|---|
| Temps d'installation | ~20 min | ~30 min | ~5 min |
| Contrôle du code | Total (git clone) | Total (git clone) | Limité (image pré-compilée) |
| Debug Python | Natif (breakpoints) | Natif (breakpoints) | Possible mais plus complexe |
| Multi-versions | Via venvs séparés | Via venvs séparés | Trivial (un compose par version) |
| Reproductibilité | Moyenne | Moyenne | Excellente |
| Idéal pour | Développement, production | Développement | Test, CI/CD, démos |
Pour aller plus loin
- Nginx reverse proxy : ajoute un service
nginxdans le compose pour gérer SSL et le routage multi-domaines - Sauvegardes automatiques : utilise
docker compose exec db pg_dumpdans un cron pour sauvegarder tes bases - Workers en production : passe
workers = 4dansodoo.confet augmente les limites mémoire - Dockerfile custom : si tu as besoin de paquets Python supplémentaires,
crée un
Dockerfilequi hérite deodoo:19.0et ajoute tes dépendances
Liens utiles
Télécharge le Guide Technique Odoo 19
Architecture, pièges v19, checklist premier module — tout dans un PDF gratuit.
Télécharger le guide← Installer sur Windows Article suivant de la série : Configurer l'environnement dev →