Un ejemplo práctico:
Imaginemos que queremos poner en marcha una aplicación web con su base de datos en un contenedor de Docker. Para este ejemplo, supongamos que estamos trabajando con una aplicación desarrollada en Node.js y una base de datos MySQL.
Crear un archivo Dockerfile para la aplicación web:
FROM node:12
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD [ "npm", "start" ]
Este archivo Dockerfile utiliza una imagen base de Node.js, crea un directorio de trabajo en la ruta /app, copia los archivos package.json y package-lock.json en el directorio de trabajo, instala las dependencias de Node.js a través de npm install, y expone el puerto 3000. Por último, establece el comando para iniciar la aplicación a través de npm start.
Crear un archivo Dockerfile para la base de datos:
FROM mysql:5.7
ENV MYSQL_DATABASE=db_name \
MYSQL_USER=db_user \
MYSQL_PASSWORD=db_password \
MYSQL_ROOT_PASSWORD=root_password
COPY init.sql /docker-entrypoint-initdb.d/
En este archivo Dockerfile, usamos una imagen base de MySQL versión 5.7, establecemos las variables de entorno para la creación de la base de datos, el usuario y la contraseña, y copiamos el archivo init.sql en la ruta /docker-entrypoint-initdb.d/. Este archivo es un script SQL que se ejecutará una vez que se haya iniciado el contenedor de MySQL y se encargará de crear las tablas necesarias y hacer cualquier configuración necesaria para la base de datos.
Utilizar docker-compose para la gestión de contenedores:
version: '3'
services:
db:
build:
context: .
dockerfile: Dockerfile.db
restart: always
volumes:
- db_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: db_name
MYSQL_USER: db_user
MYSQL_PASSWORD: db_password
web:
build:
context: .
dockerfile: Dockerfile.web
restart: always
ports:
- "3000:3000"
depends_on:
- db
volumes:
volumes:
db_data:
Este archivo docker-compose.yml define dos servicios: db y web. El servicio db utiliza el archivo Dockerfile para crear la imagen de la base de datos. Además, se utiliza restart: always para garantizar que el contenedor de la base de datos se reinicie automáticamente si se detiene por alguna razón. También crea un volumen de datos llamado db_data para persistir la información en la base de datos incluso si se elimina y se vuelve a crear el contenedor. El servicio web utiliza el archivo Dockerfile la imagen para la aplicación web, y expone el puerto 3000. También depende del servicio db, por lo que Docker esperará hasta que el contenedor de la base de datos esté arriba antes de crear el contenedor de la aplicación web.
Con estas configuraciones en el archivo docker-compose.yml, podemos poner en marcha toda la aplicación con el siguiente comando:
docker-compose up -d
El parámetro -d se utiliza para poner los servicios en segundo plano.
Y aquí lo tienes, una aplicación web y una base de datos en un contenedor Docker. Esto simplifica la gestión y el despliegue de la aplicación, y además nos asegura que la aplicación y la base de datos trabajarán juntos sin conflictos.