La respuesta corta
Odoo funciona bien en Docker en producción. Pero un archivo compose que funciona en un portátil todavía no está listo. Necesitas algunas cosas más. Fija la imagen. Ajusta los workers a la memoria del contenedor. Pon el filestore en un volumen. Dale espacio a Postgres. Y crea el staging a partir de la misma imagen.
Introducción
Docker es una buena forma de ejecutar Odoo. Cada Odoo tiene su propio espacio, puedes reconstruirlo igual cada vez, y el staging puede ser igual a producción. Por eso muchos equipos lo eligen.
La imagen oficial de Odoo te permite empezar en minutos. Esta guía trata de lo que viene después: las seis cosas que cambian cuando personas reales lo usan todo el día.
1. Aislamiento: un Odoo por contenedor
Ejecuta cada Odoo en su propio contenedor, con su propio archivo de configuración y su propio usuario de base de datos. Dos clientes, o producción y staging, nunca deben compartir un contenedor.
Dentro de cada uno, cierra las puertas que no necesitas:
[options]
admin_passwd = A_LONG_RANDOM_PASSWORD
list_db = False
dbfilter = ^yourdb$
proxy_mode = True
list_db = False oculta el gestor de bases de datos. dbfilter asegura que este contenedor solo abra su propia base de datos.
Solo tu proxy debe llegar a los puertos 8069 y 8072. No los publiques en internet.
2. Builds reproducibles
"Ayer funcionaba" suele venir de un tag de imagen que cambia. odoo:18.0 hoy no es la misma imagen que odoo:18.0 el mes que viene, porque Odoo le añade correcciones.
Crea tu propia imagen sobre la oficial, fíjala y añade ahí tus paquetes de Python:
FROM odoo:18.0@sha256:<digest-you-tested>
USER root
COPY requirements.txt /tmp/requirements.txt
RUN pip3 install --no-cache-dir --break-system-packages -r /tmp/requirements.txt
USER odoo
Fija también las versiones en requirements.txt. Así, la imagen que probaste es la imagen que corre. Cuando quieras las últimas correcciones de Odoo, cambia el digest a propósito, pruébalo en staging y despliégalo.
Mantén tus módulos fuera del código de la imagen. Móntalos en /mnt/extra-addons, o cópialos al hacer el build. Nunca edites archivos dentro de un contenedor en marcha. El siguiente reinicio borra esos cambios.
3. Un staging igual a producción
Con Docker, el staging puede ser igual a producción. La misma imagen, la misma configuración, los mismos módulos. Solo cambian los datos y el dominio.
Para los datos, copia la base de datos y los archivos de producción. Luego limpia la copia antes de que arranque Odoo. Un Odoo de prueba con correos reales de clientes y un servidor de correo activo puede escribir a tus clientes reales. Nuestra guía sobre copiar Odoo de producción a staging sin escribir a tus clientes muestra qué hay que desactivar.
4. Workers y memoria del contenedor
Con workers = 0, Odoo corre como un solo proceso. Bien para un portátil, demasiado lento para un equipo. En producción, pon workers por encima de 0.
workers = 4
max_cron_threads = 1
gevent_port = 8072
limit_memory_soft = 2147483648
limit_memory_hard = 2684354560
Aquí está la trampa de Docker. Los límites de memoria de Odoo son por worker. El límite de memoria de Docker es para todo el contenedor. Si todos los workers juntos pueden usar más que el límite del contenedor, el kernel mata el contenedor. Odoo no llega a reiniciar un solo worker. Todo se cae a la vez, a menudo en la hora de más trabajo del día.
Así que calcula desde arriba. Toma la memoria del contenedor, guarda una parte para el proceso principal y el cron, y reparte el resto entre los workers. Nuestra guía sobre cuántos workers de Odoo necesitas explica los números paso a paso.
Además, el chat y las actualizaciones en vivo usan un websocket en el puerto 8072. Tu proxy tiene que enviar /websocket allí. Mira la guía de proxy mode para la configuración completa.
5. El filestore
Los adjuntos, las imágenes y los PDF no están en la base de datos. Odoo los guarda en el filestore, en /var/lib/odoo en la imagen oficial.
Si esa ruta no está en un volumen con nombre, tus archivos viven dentro del contenedor. Si recreas el contenedor, desaparecen. La base de datos se sigue abriendo, así que nadie lo nota hasta que alguien hace clic en una factura antigua.
volumes:
- odoo-data:/var/lib/odoo
Haz la copia junto con la base de datos, en el mismo momento. Una base de datos del lunes con archivos del viernes no coincide.
6. Postgres
Puedes ejecutar Postgres en su propio contenedor junto a Odoo, o usar una base de datos gestionada. Las dos opciones funcionan. En Docker importan algunas cosas:
- Pon los datos de Postgres en un volumen con nombre, y nunca borres ese volumen por error con docker compose down -v.
- Dale más memoria compartida a Postgres. El /dev/shm por defecto de Docker es de 64 MB, y las consultas grandes pueden fallar con el error "could not resize shared memory segment".
- Restaura las bases de datos para que el usuario de Odoo sea su dueño. En casi cualquier otra aplicación, un pg_restore normal basta. Con Odoo, una base de datos con el dueño equivocado desaparece del gestor de bases de datos de Odoo.
Un archivo compose con los seis puntos:
services:
db:
image: postgres:16
environment:
POSTGRES_USER: odoo
POSTGRES_PASSWORD: CHANGE_ME
POSTGRES_DB: postgres
shm_size: 256mb
volumes:
- db-data:/var/lib/postgresql/data
restart: unless-stopped
odoo:
image: registry.example.com/our-odoo:2026-10-01
depends_on: [db]
environment:
HOST: db
USER: odoo
PASSWORD: CHANGE_ME
volumes:
- ./config/odoo.conf:/etc/odoo/odoo.conf:ro
- ./addons:/mnt/extra-addons:ro
- odoo-data:/var/lib/odoo
ports:
- "127.0.0.1:8069:8069"
- "127.0.0.1:8072:8072"
mem_limit: 6g
restart: unless-stopped
volumes:
db-data:
odoo-data:
Para actualizar un módulo, detén Odoo y ejecuta la actualización en un contenedor de un solo uso:
docker compose stop odoo
docker compose run --rm odoo odoo -d yourdb -u your_module --stop-after-init
docker compose start odoo
Haz primero una copia de la base de datos y del filestore. Si la actualización falla a mitad de camino, la imagen antigua ya no encaja con la base de datos modificada.
Lo que sigue siendo tu responsabilidad
Docker hace que Odoo sea más fácil de reconstruir. No ejecuta Odoo por ti. Copias de seguridad, pruebas de restauración, actualizaciones, copias de staging, rotación de logs, espacio en disco y vigilar los problemas siguen siendo tareas que alguien hace cada semana. Cada trampa de Odoo aparece de una en una, y aprenderlas todas lleva meses.
Cómo ejecuta Skysize Odoo en Docker
Ejecutamos cada Odoo así, en nuestra nube o en tu propio servidor.
- Cada Odoo corre en su propio contenedor, con su propia base de datos.
- Cada build recibe una copia nueva de tu código. Dos contenedores nunca comparten una carpeta.
- El staging corre con la misma configuración que producción, con los datos privados limpiados.
- Antes de cada actualización, se copia tu base de datos. Si Odoo no vuelve sano, todo vuelve a como estaba.
Mira cómo las ramas se convierten en entornos. Si quieres quedarte con tu propio servidor, mira bring your own server: tú te quedas con el servidor, y nosotros ejecutamos Odoo en él. Nuestro software se conecta desde tu servidor hacia fuera, así que no nos abres ningún puerto.
Skysize está hecho por ex ingenieros de Odoo y tiene la certificación ISO 27001.
Habla con un experto en hosting de Odoo
Preguntas frecuentes
¿Es Docker bueno para ejecutar Odoo en producción? Sí. Da a cada Odoo su propio espacio y hace que el staging sea igual a producción. Aun así necesitas imágenes fijadas, workers bien dimensionados, un volumen para el filestore y copias de seguridad probadas.
¿Dónde está el filestore en la imagen Docker oficial de Odoo? En /var/lib/odoo. Ponlo en un volumen con nombre, o perderás tus archivos cuando se recree el contenedor.
¿Por qué mi contenedor de Odoo se reinicia con carga? A menudo los workers pueden usar juntos más memoria que el límite del contenedor, así que el kernel detiene todo el contenedor. Baja los workers o sus límites de memoria, o dale más memoria al contenedor.
¿Postgres también debe correr en Docker? Puede. Usa un volumen con nombre para sus datos y dale más memoria compartida. Una base de datos gestionada también funciona.
¿Cómo actualizo un módulo de Odoo en Docker? Detén Odoo, haz copia de la base de datos y del filestore, y luego ejecuta odoo -d yourdb -u your_module --stop-after-init en un contenedor de un solo uso.