Volver

Comandos más usados de Docker y cómo exportar/importar la base de datos

Terminal con docker compose ps y el comando pg_dump que exporta la base de datos
Terminal con docker compose ps y el comando pg_dump que exporta la base de datos

Propósito

Tener a mano los comandos de Docker y Docker Compose que más se usan en el día a día de un proyecto, y el procedimiento para exportar e importar la base de datos de un contenedor, sea para pasarla a un compañero o para respaldarla.

Los ejemplos usan el proyecto Racafé (Wagtail + PostgreSQL 16), cuyo docker-compose.yml define dos servicios: db (postgres, usuario/base racafe) y web (Django). En otro proyecto, cambia el nombre del servicio, el usuario y la base por los de su docker-compose.yml.

Terminal con docker compose ps y el comando pg_dump que exporta la base de datos

Explicación

1. Levantar, ver y detener

Comando Para qué
docker compose up -d Levanta todos los servicios en segundo plano.
docker compose up -d --build Igual, pero reconstruye la imagen (después de cambiar Dockerfile o requirements.txt).
docker compose up -d db Levanta solo un servicio.
docker compose ps Lista los contenedores del proyecto, su estado y puertos.
docker compose logs -f web Sigue los logs de un servicio (Ctrl+C para salir).
docker compose stop Detiene los contenedores sin borrarlos.
docker compose restart web Reinicia un servicio.
docker compose down Detiene y borra los contenedores y la red. Los volúmenes (la base de datos) se conservan.

2. Ejecutar comandos dentro de un contenedor

Comando Para qué
docker compose exec web bash Abre una terminal dentro del contenedor ya encendido.
docker compose exec web python manage.py migrate Corre un comando en el contenedor encendido.
docker compose run --rm web pytest Crea un contenedor temporal, corre el comando y lo borra al terminar. Sirve aunque el servicio esté apagado.
docker compose exec db psql -U racafe racafe Consola SQL de PostgreSQL (q para salir).

Comandos de Django habituales en este proyecto:

docker compose run --rm web python manage.py check
docker compose run --rm web python manage.py makemigrations --check --dry-run
docker compose run --rm web python manage.py migrate
docker compose run --rm web python manage.py createsuperuser
docker compose run --rm web pytest

3. Imágenes, volúmenes y limpieza

Comando Para qué
docker ps / docker ps -a Contenedores encendidos / todos, de cualquier proyecto.
docker images Imágenes descargadas o construidas.
docker volume ls Volúmenes (aquí vive la base: <proyecto>_pgdata).
docker compose build Reconstruye las imágenes sin levantarlas.
docker system df Cuánto disco ocupa Docker.
docker image prune Borra imágenes sin etiqueta que ya no se usan.

4. Exportar la base de datos (PostgreSQL)

Con los contenedores arriba (docker compose up -d), desde la raíz del proyecto:

docker compose exec -T db pg_dump -U racafe -Fc racafe > racafe.dump
tar czf racafe-media.tgz media
  • -Fc genera el formato comprimido de PostgreSQL, el que entiende pg_restore.
  • -T es obligatoria: sin ella Docker asigna una terminal y corrompe el archivo binario.
  • La carpeta media/ guarda las imágenes y documentos subidos al CMS. La base sola deja las imágenes rotas; por eso viajan las dos.
  • Si prefieres un SQL legible: docker compose exec -T db pg_dump -U racafe racafe > racafe.sql.

5. Importar la base de datos (PostgreSQL)

Copia racafe.dump y racafe-media.tgz a la raíz del proyecto y corre:

docker compose up -d db
docker compose stop web
docker compose exec -T db pg_restore -U racafe -d racafe 
    --clean --if-exists --no-owner < racafe.dump
tar xzf racafe-media.tgz
docker compose up -d
docker compose exec web python manage.py migrate
  • --clean --if-exists borra las tablas existentes antes de recrearlas: reemplaza por completo la base local. Si tienes algo que conservar, exporta primero tu propia base.
  • Se detiene web para que no haya conexiones abiertas mientras se restaura.
  • El migrate final aplica las migraciones que tu rama tenga y el dump no.
  • Los usuarios del CMS viajan en el dump: entras con las credenciales de quien lo sacó, o creas las tuyas con createsuperuser.
  • Si el archivo es .sql (texto plano): docker compose exec -T db psql -U racafe racafe < racafe.sql.

6. Lo mismo en MySQL / MariaDB

Si el servicio de base es MySQL o MariaDB (cambia db, usuario, contraseña y base por los del proyecto):

# Exportar
docker compose exec -T db mysqldump -u USUARIO -pCLAVE BASE > base.sql
# Importar
docker compose exec -T db mysql -u USUARIO -pCLAVE BASE < base.sql

En imágenes recientes de MariaDB los binarios se llaman mariadb-dump y mariadb.

Ejemplo

Correcto: docker compose exec -T db pg_dump -U racafe -Fc racafe > racafe.dump → archivo binario válido que pg_restore acepta.

Incorrecto: docker compose exec db pg_dump -U racafe -Fc racafe > racafe.dump (sin -T) → pg_restore falla con «input file does not appear to be a valid archive».

Incorrecto: docker compose down -v para «reiniciar» → la -v borra los volúmenes y con ellos toda la base de datos. Úsalo solo si de verdad quieres empezar de cero y ya tienes un dump.

Excepciones

  • Datos personales: el dump incluye los leads de los formularios. Compártelo por un canal privado y nunca lo subas al repositorio (el .gitignore debe excluir *.dump, *.sql y *.tgz).
  • Proyectos WordPress con DDEV no usan estos comandos: van con ddev export-db / ddev import-db.
  • En Docker Compose v1 el comando es docker-compose (con guion); en la v2 es docker compose.
Avatar

Autor

Elan Francisco P. Asprilla
Desarrollador Web

Artículos relacionados

7 tipos de contenido para marcas que sí funcionan

7 tipos de contenido para marcas que sí funcionan

Conoce los tipos de contenido para marcas que...

Campañas de performance para marcas que escalan

Campañas de performance para marcas que escalan

Cómo diseñar campañas de performance para...

Cómo elegir la mejor agencia de marketing digital

Cómo elegir la mejor agencia de marketing digital

Cómo identificar la mejor agencia de marketing...