Usar bases de datos contenedorizadas
El uso de una base de datos local contenedorizada ofrece flexibilidad y facilidad de configuración, lo que te permite reflejar fielmente los entornos de producción sin la sobrecarga de las instalaciones de bases de datos tradicionales. Docker simplifica este proceso, permitiéndote desplegar, gestionar y escalar bases de datos en contenedores aislados con solo unos pocos comandos.
En esta guía, aprenderás a:
- Ejecutar una base de datos local contenedorizada
- Acceder a la shell de una base de datos contenedorizada
- Conectarte a una base de datos contenedorizada desde tu host
- Conectarte a una base de datos contenedorizada desde otro contenedor
- Persistir los datos de la base de datos en un volumen
- Compilar una imagen de base de datos personalizada
- Usar Docker Compose para ejecutar una base de datos
Esta guía utiliza la imagen de MySQL para los ejemplos, pero los conceptos se pueden aplicar a otras imágenes de bases de datos.
Prerrequisitos
Para seguir esta guía, debes tener Docker instalado. Para instalar Docker, consulta Obtener Docker.
Ejecutar una base de datos local contenedorizada
La mayoría de los sistemas de bases de datos más populares, incluidos MySQL, PostgreSQL y MongoDB, tienen una imagen oficial de Docker disponible en Docker Hub. Estas imágenes son un conjunto curado de imágenes que siguen las mejores prácticas, lo que garantiza que tengas acceso a las últimas funciones y actualizaciones de seguridad. Para comenzar, visita Docker Hub y busca la base de datos que te interese. La página de cada imagen proporciona instrucciones detalladas sobre cómo ejecutar el contenedor, personalizar tu configuración y configurar la base de datos según tus necesidades. Para obtener más información sobre la imagen de MySQL utilizada en esta guía, consulta la página de la imagen de MySQL en Docker Hub.
Para ejecutar un contenedor de base de datos, puedes usar la interfaz gráfica (GUI) de Docker Desktop o la interfaz de línea de comandos (CLI).
Para ejecutar un contenedor usando la CLI, ejecuta el siguiente comando en una terminal:
$ docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=mydb -d mysql:latest
En este comando:
--name my-mysqlasigna el nombremy-mysqla tu contenedor para facilitar la referencia.-e MYSQL_ROOT_PASSWORD=my-secret-pwestablece la contraseña raíz (root) de MySQL enmy-secret-pw. Reemplazamy-secret-pwcon una contraseña segura de tu elección.-e MYSQL_DATABASE=mydbcrea opcionalmente una base de datos llamadamydb. Puedes cambiarmydbpor el nombre de base de datos que desees.-dejecuta el contenedor en modo detached (segundo plano).mysql:latestespecifica que deseas utilizar la última versión de la imagen de MySQL.
Para verificar que tu contenedor se está ejecutando, ejecuta docker ps en una terminal.
Para ejecutar un contenedor usando la interfaz gráfica (GUI):
En el Panel de control (Dashboard) de Docker Desktop, selecciona la búsqueda global en la parte superior de la ventana.
Escribe
mysqlen el cuadro de búsqueda y selecciona la pestaña Images si no está seleccionada.Pasa el cursor sobre la imagen
mysqly selecciona Run. Aparecerá el cuadro de diálogo Run a new container.Despliega Optional settings.
En la configuración opcional, especifica lo siguiente:
- Container name:
my-mysql - Environment variables:
MYSQL_ROOT_PASSWORD:my-secret-pwMYSQL_DATABASE:mydb

- Container name:
Selecciona Run.
Abre la vista Containers en el Dashboard de Docker Desktop para verificar que tu contenedor se esté ejecutando.
Acceder a la shell de una base de datos contenedorizada
Cuando tienes una base de datos ejecutándose dentro de un contenedor Docker, es posible que necesites acceder a su shell para gestionar la base de datos, ejecutar comandos o realizar tareas administrativas. Docker proporciona una forma sencilla de hacer esto usando el comando docker exec. Además, si prefieres una interfaz gráfica, puedes usar la interfaz de Docker Desktop.
Si aún no tienes un contenedor de base de datos ejecutándose, consulta Ejecutar una base de datos local contenedorizada.
Para acceder a la terminal de un contenedor MySQL usando la CLI, puedes usar el siguiente comando docker exec:
$ docker exec -it my-mysql bash
En este comando:
docker execle indica a Docker que deseas ejecutar un comando en un contenedor en ejecución.-itasegura que la terminal a la que accedes sea interactiva, de modo que puedas escribir comandos en ella.my-mysqles el nombre de tu contenedor MySQL. Si le diste un nombre diferente cuando lo ejecutaste, usa ese nombre en su lugar.bashes el comando que deseas ejecutar dentro del contenedor. Abre una shell de bash que te permite interactuar con el sistema de archivos del contenedor y las aplicaciones instaladas.
Después de ejecutar este comando, tendrás acceso a la shell de bash dentro de tu contenedor MySQL, desde la cual podrás administrar tu servidor MySQL directamente. Puedes ejecutar exit para regresar a tu terminal.
- Abre el Dashboard de Docker Desktop y selecciona la vista Containers.
- En la columna Actions de tu contenedor, selecciona Show container actions y luego Open in terminal.
En esta terminal puedes acceder a la shell dentro de tu contenedor MySQL, desde la cual podrás administrar tu servidor MySQL directamente.
Una vez que hayas accedido a la terminal del contenedor, puedes ejecutar cualquier herramienta disponible en ese contenedor. El siguiente ejemplo muestra el uso de mysql en el contenedor para listar las bases de datos.
# mysql -u root -p
Enter password: my-secret-pw
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mydb |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
Conectarse a una base de datos contenedorizada desde tu host
Conectarse a una base de datos contenedorizada desde tu máquina host implica mapear un puerto dentro del contenedor a un puerto en tu máquina host. Este proceso garantiza que la base de datos dentro del contenedor sea accesible a través de la red de la máquina host. Para MySQL, el puerto por defecto es el 3306. Al exponer este puerto, puedes utilizar varias herramientas o aplicaciones de gestión de bases de datos en tu máquina host para interactuar con tu base de datos MySQL.
Antes de comenzar, debes eliminar cualquier contenedor que hayas ejecutado previamente para esta guía. Para detener y eliminar un contenedor, puedes hacer lo siguiente:
- En una terminal, ejecuta
docker rm --force my-mysqlpara eliminar el contenedor llamadomy-mysql. - O, en el Dashboard de Docker Desktop, selecciona el icono Delete junto a tu contenedor en la vista Containers.
A continuación, puedes utilizar la interfaz gráfica (GUI) de Docker Desktop o la CLI para ejecutar el contenedor con el puerto mapeado.
Ejecuta el siguiente comando en una terminal.
$ docker run -p 3307:3306 --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=mydb -d mysql:latest
En este comando, -p 3307:3306 mapea el puerto 3307 del host al puerto 3306 del contenedor.
Para verificar que el puerto esté mapeado, ejecuta el siguiente comando.
$ docker ps
Deberías ver una salida como la siguiente.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6eb776cfd73c mysql:latest "docker-entrypoint.s…" 17 minutes ago Up 17 minutes 33060/tcp, 0.0.0.0:3307->3306/tcp my-mysql
Para ejecutar un contenedor usando la GUI:
En el Dashboard de Docker Desktop, selecciona la búsqueda global en la parte superior de la ventana.
Escribe
mysqlen el cuadro de búsqueda y selecciona la pestaña Images si no está seleccionada.Pasa el cursor sobre la imagen
mysqly selecciona Run. Aparecerá el cuadro de diálogo Run a new container.Despliega Optional settings.
En la configuración opcional, especifica lo siguiente:
- Container name:
my-mysql - Host port para el puerto 3306/tcp:
3307 - Environment variables:
MYSQL_ROOT_PASSWORD:my-secret-pwMYSQL_DATABASE:mydb

- Container name:
Selecciona Run.
En la vista Containers, verifica que el puerto esté mapeado en la columna Port(s). Deberías ver 3307:3306 para el contenedor my-mysql.
En este punto, cualquier aplicación que se ejecute en tu host puede acceder al servicio MySQL en el contenedor en localhost:3307.
Conectarse a una base de datos contenedorizada desde otro contenedor
Conectarse a una base de datos contenedorizada desde otro contenedor es un escenario común en arquitecturas de microservicios y durante los procesos de desarrollo. Las capacidades de red de Docker facilitan el establecimiento de esta conexión sin tener que exponer la base de datos a la red del host. Esto se logra colocando tanto el contenedor de la base de datos como el contenedor que necesita acceder a ella en la misma red de Docker.
Antes de comenzar, debes eliminar cualquier contenedor que hayas ejecutado previamente para esta guía. Para detener y eliminar un contenedor, puedes hacer lo siguiente:
- En una terminal, ejecuta
docker rm --force my-mysqlpara eliminar el contenedor llamadomy-mysql. - O, en el Dashboard de Docker Desktop, selecciona el icono Delete junto a tu contenedor en la vista Containers.
Para crear una red y ejecutar contenedores en ella:
Ejecuta el siguiente comando para crear una red de Docker llamada
my-network.$ docker network create my-networkEjecuta tu contenedor de base de datos y especifica la red usando la opción
--network. Esto ejecuta el contenedor en la redmy-network.$ docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=mydb --network my-network -d mysql:latestEjecuta tus otros contenedores y especifica la red usando la opción
--network. Para este ejemplo, ejecutarás un contenedor phpMyAdmin que puede conectarse a tu base de datos.Ejecuta un contenedor phpMyAdmin. Utiliza la opción
--networkpara especificar la red, la opción-ppara permitirte acceder al contenedor desde tu máquina host, y la opción-epara especificar una variable de entorno requerida para esta imagen.$ docker run --name my-phpmyadmin -d --network my-network -p 8080:80 -e PMA_HOST=my-mysql phpmyadmin
Verifica que los contenedores se puedan comunicar. Para este ejemplo, accederás a phpMyAdmin y verificarás que se conecta a la base de datos.
- Abre http://localhost:8080 para acceder a tu contenedor de phpMyAdmin.
- Inicia sesión usando
rootcomo usuario ymy-secret-pwcomo contraseña. Deberías conectarte al servidor MySQL y ver tu base de datos listada.
En este punto, cualquier aplicación que se ejecute en tu red de contenedores my-network puede acceder al servicio MySQL en el contenedor en my-mysql:3306.
Persistir los datos de la base de datos en un volumen
Persistir los datos de la base de datos en un volumen de Docker es necesario para garantizar que tus datos sobrevivan a los reinicios y eliminaciones de los contenedores. Un volumen de Docker te permite almacenar archivos de base de datos fuera de la capa escribible del contenedor, lo que hace posible actualizar el contenedor, cambiar de base y compartir datos sin perderlos. A continuación, se muestra cómo puedes adjuntar un volumen a tu contenedor de base de datos utilizando la CLI de Docker o la interfaz gráfica de Docker Desktop.
Antes de comenzar, debes eliminar cualquier contenedor que hayas ejecutado previamente para esta guía. Para detener y eliminar un contenedor, puedes hacer lo siguiente:
- En una terminal, ejecuta
docker rm --force my-mysqlpara eliminar el contenedor llamadomy-mysql. - O, en el Dashboard de Docker Desktop, selecciona el icono Delete junto a tu contenedor en la vista Containers.
A continuación, puedes utilizar la interfaz gráfica (GUI) de Docker Desktop o la CLI para ejecutar el contenedor con un volumen.
Para ejecutar tu contenedor de base de datos con un volumen adjunto, incluye la opción -v con tu comando docker run, especificando un nombre de volumen y la ruta donde la base de datos almacena sus datos dentro del contenedor. Si el volumen no existe, Docker lo creará automáticamente por ti.
Para ejecutar un contenedor de base de datos con un volumen adjunto y luego verificar que los datos persisten:
Ejecuta el contenedor y adjunta el volumen.
$ docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=mydb -v my-db-volume:/var/lib/mysql -d mysql:latestEste comando monta el volumen llamado
my-db-volumeen el directorio/var/lib/mysqldentro del contenedor.Crea algunos datos en la base de datos. Utiliza el comando
docker execpara ejecutarmysqldentro del contenedor y crear una tabla.$ docker exec my-mysql mysql -u root -pmy-secret-pw -e "CREATE TABLE IF NOT EXISTS mydb.mytable (column_name VARCHAR(255)); INSERT INTO mydb.mytable (column_name) VALUES ('value');"Este comando utiliza la herramienta
mysqlen el contenedor para crear una tabla llamadamytablecon una columna llamadacolumn_name, y finalmente inserta el valor'value'.Detén y elimina el contenedor. Sin un volumen, la tabla que creaste se perdería al eliminar el contenedor.
$ docker rm --force my-mysqlInicia un nuevo contenedor con el volumen adjunto. Esta vez, no necesitas especificar ninguna variable de entorno ya que la configuración se guarda en el volumen.
$ docker run --name my-mysql -v my-db-volume:/var/lib/mysql -d mysql:latestVerifica que la tabla que creaste todavía exista. Usa el comando
docker execnuevamente para ejecutarmysqldentro del contenedor.$ docker exec my-mysql mysql -u root -pmy-secret-pw -e "SELECT * FROM mydb.mytable;"Este comando utiliza la herramienta
mysqlen el contenedor para seleccionar todos los registros de la tablamytable.Deberías ver una salida como la siguiente.
column_name value
Para ejecutar un contenedor de base de datos con un volumen adjunto y luego verificar que los datos persisten usando la GUI:
Ejecuta un contenedor con un volumen adjunto.
En el Dashboard de Docker Desktop, selecciona la búsqueda global en la parte superior de la ventana.
Escribe
mysqlen el cuadro de búsqueda y selecciona la pestaña Images si no está seleccionada.Pasa el cursor sobre la imagen mysql y selecciona Run. Aparecerá el cuadro de diálogo Run a new container.
Despliega Optional settings.
En la configuración opcional, especifica lo siguiente:
- Container name:
my-mysql - Environment variables:
MYSQL_ROOT_PASSWORD:my-secret-pwMYSQL_DATABASE:mydb
- Volumes:
my-db-volume:/var/lib/mysql

Aquí, el nombre del volumen es
my-db-volumey está montado en el contenedor en/var/lib/mysql.- Container name:
Selecciona Run.
Crea algunos datos en la base de datos.
En la vista Containers, junto a tu contenedor selecciona el icono Show container actions y luego selecciona Open in terminal.
Ejecuta el siguiente comando en la terminal del contenedor para agregar una tabla.
# mysql -u root -pmy-secret-pw -e "CREATE TABLE IF NOT EXISTS mydb.mytable (column_name VARCHAR(255)); INSERT INTO mydb.mytable (column_name) VALUES ('value');"Este comando utiliza la herramienta
mysqlen el contenedor para crear una tabla llamadamytablecon una columna llamadacolumn_name, y finalmente inserta el valor'value'.
En la vista Containers, selecciona el icono Delete junto a tu contenedor y luego selecciona Delete forever. Sin un volumen, la tabla que creaste se perdería al eliminar el contenedor.
Ejecuta un contenedor con un volumen adjunto.
En el Dashboard de Docker Desktop, selecciona la búsqueda global en la parte superior de la ventana.
Escribe
mysqlen el cuadro de búsqueda y selecciona la pestaña Images si no está seleccionada.Pasa el cursor sobre la imagen mysql y selecciona Run. Aparecerá el cuadro de diálogo Run a new container.
Despliega Optional settings.
En la configuración opcional, especifica lo siguiente:
- Container name:
my-mysql - Environment variables:
MYSQL_ROOT_PASSWORD:my-secret-pwMYSQL_DATABASE:mydb
- Volumes:
my-db-volume:/var/lib/mysql

- Container name:
Selecciona Run.
Verifica que la tabla que creaste todavía exista.
En la vista Containers, junto a tu contenedor selecciona el icono Show container actions y luego selecciona Open in terminal.
Ejecuta el siguiente comando en la terminal del contenedor para verificar que la tabla que creaste todavía existe.
# mysql -u root -pmy-secret-pw -e "SELECT * FROM mydb.mytable;"Este comando utiliza la herramienta
mysqlen el contenedor para seleccionar todos los registros de la tablamytable.Deberías ver una salida como la siguiente.
column_name value
En este punto, cualquier contenedor MySQL que monte el volumen my-db-volume podrá acceder y guardar datos persistentes.
Compilar una imagen de base de datos personalizada
Personalizar tu imagen de base de datos te permite incluir configuración adicional, scripts o herramientas junto con el servidor de base de datos base. Esto es particularmente útil para crear una imagen de Docker que coincida con las necesidades específicas de tu entorno de desarrollo o producción. El siguiente ejemplo describe cómo compilar y ejecutar una imagen de MySQL personalizada que incluye un script de inicialización de tablas.
Antes de comenzar, debes eliminar cualquier contenedor que hayas ejecutado previamente para esta guía. Para detener y eliminar un contenedor, puedes hacer lo siguiente:
- En una terminal, ejecuta
docker rm --force my-mysqlpara eliminar el contenedor llamadomy-mysql. - O, en el Dashboard de Docker Desktop, selecciona el icono Delete junto a tu contenedor en la vista Containers.
Para compilar y ejecutar tu imagen personalizada:
Crea un Dockerfile.
Crea un archivo llamado
Dockerfileen el directorio de tu proyecto. Para este ejemplo, puedes crear elDockerfileen un directorio vacío de tu elección. Este archivo definirá cómo compilar tu imagen MySQL personalizada.Añade el siguiente contenido al
Dockerfile.# syntax=docker/dockerfile:1 # Use the base image mysql:latest FROM mysql:latest # Set environment variables ENV MYSQL_DATABASE mydb # Copy custom scripts or configuration files from your host to the container COPY ./scripts/ /docker-entrypoint-initdb.d/En este Dockerfile, has establecido la variable de entorno para el nombre de la base de datos MySQL. También puedes usar la instrucción
COPYpara agregar archivos de configuración o scripts personalizados al contenedor. En este ejemplo, los archivos del directorio./scripts/de tu host se copian en el directorio/docker-entrypoint-initdb.d/del contenedor. En este directorio, los scripts.sh,.sqly.sql.gzse ejecutan cuando el contenedor se inicia por primera vez. Para obtener más detalles sobre los Dockerfiles, consulta la Referencia de Dockerfile.Crea un archivo de script para inicializar una tabla en la base de datos. En el directorio donde se encuentra tu
Dockerfile, crea un subdirectorio llamadoscriptsy luego crea un archivo llamadocreate_table.sqlcon el siguiente contenido.
CREATE TABLE IF NOT EXISTS mydb.myothertable ( column_name VARCHAR(255) ); INSERT INTO mydb.myothertable (column_name) VALUES ('other_value');Ahora deberías tener la siguiente estructura de directorios.
├── your-project-directory/ │ ├── scripts/ │ │ └── create_table.sql │ └── DockerfileCompila tu imagen.
En una terminal, cambia de directorio al directorio donde se encuentra tu
Dockerfile.Ejecuta el siguiente comando para compilar la imagen.
$ docker build -t my-custom-mysql .En este comando,
-t my-custom-mysqletiqueta (nombra) tu nueva imagen comomy-custom-mysql. El punto (.) al final del comando especifica el directorio actual como el contexto para la compilación, donde Docker busca el Dockerfile y cualquier otro archivo necesario para la compilación.
Ejecuta tu imagen como lo hiciste en Ejecutar una base de datos local contenedorizada. Esta vez, especifica el nombre de tu imagen en lugar de
mysql:latest. Además, ya no necesitas especificar la variable de entornoMYSQL_DATABASE, ya que ahora está definida por tu Dockerfile.$ docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d my-custom-mysqlVerifica que tu contenedor se esté ejecutando con el siguiente comando.
$ docker psDeberías ver una salida como la siguiente.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f74dcfdb0e59 my-custom-mysql "docker-entrypoint.s…" 2 hours ago Up 51 minutes 3306/tcp, 33060/tcp my-mysqlVerifica que se haya ejecutado tu script de inicialización. Ejecuta el siguiente comando en una terminal para mostrar el contenido de la tabla
myothertable.$ docker exec my-mysql mysql -u root -pmy-secret-pw -e "SELECT * FROM mydb.myothertable;"Deberías ver una salida como la siguiente.
column_name other_value
Cualquier contenedor que se ejecute utilizando tu imagen my-custom-mysql tendrá la tabla inicializada cuando se inicie por primera vez.
Usar Docker Compose para ejecutar una base de datos
Docker Compose es una herramienta para definir y ejecutar aplicaciones Docker de múltiples contenedores. Con un solo comando, puedes configurar todos los servicios de tu aplicación (como bases de datos, aplicaciones web, etc.) y administrarlos. En este ejemplo, crearás un archivo Compose y lo utilizarás para ejecutar un contenedor de base de datos MySQL y un contenedor phpMyAdmin.
Para ejecutar tus contenedores con Docker Compose:
Crea un archivo de Docker Compose.
Crea un archivo llamado
compose.yamlen el directorio de tu proyecto. Este archivo definirá los servicios, redes y volúmenes.Añade el siguiente contenido al archivo
compose.yaml.services: db: image: mysql:latest environment: MYSQL_ROOT_PASSWORD: my-secret-pw MYSQL_DATABASE: mydb ports: - 3307:3306 volumes: - my-db-volume:/var/lib/mysql phpmyadmin: image: phpmyadmin/phpmyadmin:latest environment: PMA_HOST: db PMA_PORT: 3306 MYSQL_ROOT_PASSWORD: my-secret-pw ports: - 8080:80 depends_on: - db volumes: my-db-volume:Para el servicio de base de datos:
dbes el nombre del servicio.image: mysql:latestespecifica que el servicio utiliza la última imagen de MySQL de Docker Hub.environmentenumera las variables de entorno utilizadas por MySQL para inicializar la base de datos, como la contraseña raíz y el nombre de la base de datos.portsmapea el puerto 3307 del host al puerto 3306 del contenedor, lo que te permite conectarte a la base de datos desde tu máquina host.volumesmontamy-db-volumeen/var/lib/mysqldentro del contenedor para persistir los datos de la base de datos.
Además del servicio de base de datos, hay un servicio phpMyAdmin. Por defecto, Compose configura una única red para tu aplicación. Cada contenedor de un servicio se une a la red predeterminada y es accesible por otros contenedores en esa red, además de ser reconocible por el nombre del servicio. Por lo tanto, en la variable de entorno
PMA_HOST, puedes especificar el nombre del servicio,db, para conectarte al servicio de base de datos. Para obtener más detalles sobre Compose, consulta la Referencia del archivo Compose.
Ejecuta Docker Compose.
Abre una terminal y cambia de directorio al directorio donde se encuentra tu archivo
compose.yaml.Ejecuta Docker Compose usando el siguiente comando.
$ docker compose upAhora puedes acceder a phpMyAdmin en http://localhost:8080 y conectarte a tu base de datos usando
rootcomo usuario ymy-secret-pwcomo contraseña.Para detener los contenedores, presiona
Ctrl+Cen la terminal.
Ahora, con Docker Compose puedes iniciar tu base de datos y tu aplicación, montar volúmenes, configurar redes y más, todo con un solo comando.
Resumen
Esta guía te introdujo a los aspectos esenciales del uso de bases de datos contenedorizadas, centrándose específicamente en MySQL, para mejorar la flexibilidad, la facilidad de configuración y la consistencia en tus entornos de desarrollo. Los casos de uso cubiertos en esta guía no solo simplifican tus flujos de trabajo de desarrollo, sino que también te preparan para escenarios más avanzados de administración y despliegue de bases de datos, garantizando que tus aplicaciones basadas en datos sigan siendo robustas y escalables.
Información relacionada: