# 5.3.- Ejemplo de sistema con múltiples contenedores.

pixabay.com. Blog (CC BY)

Ahora que hemos aprendido sobre la creación y gestión de contenedores individuales, la gestión de redes y la persistencia de datos, es hora de dar un paso más y aprender cómo podemos trabajar con múltiples contenedores juntos.

En el mundo real, las aplicaciones suelen estar compuestas por múltiples componentes, cada uno ejecutándose en su propio contenedor. Veamos cómo podemos crear una aplicación de WordPress completa utilizando Docker. WordPress, como sabemos, es un popular sistema de gestión de contenido que se utiliza para crear sitios web y blogs.

Para que WordPress funcione, necesitamos tener una base de datos MySQL y un servidor web que pueda interpretar y ejecutar código PHP. En lugar de tener todos estos componentes en un solo contenedor, es una buena práctica dividirlos en contenedores separados. Esto hace que cada contenedor sea más manejable, reutilizable y nos permite escalar cada componente de forma independiente si es necesario.

Además de WordPress y MySQL, también vamos a usar phpMyAdmin, una herramienta de administración basada en web para MySQL, que nos permitirá administrar la base de datos de WordPress a través de una interfaz de usuario gráfica.

Para lograr esto, crearemos tres contenedores: uno para WordPress, otro para MySQL y otro para phpMyAdmin. Estos contenedores se comunicarán entre sí a través de una red Docker personalizada, que crearemos específicamente para este propósito.

Todo esto nos ayudará a entender cómo los contenedores pueden trabajar juntos para formar una aplicación completa, y también nos dará una visión práctica de cómo se pueden conectar y comunicar los contenedores a través de las redes Docker.

MySQL es un sistema de gestión de bases de datos relacionales de código abierto, que se utiliza para almacenar, organizar y administrar datos. Fue creado en 1995 y ha evolucionado a lo largo de los años para ofrecer una amplia gama de características y herramientas útiles para el manejo de datos, como la capacidad de realizar consultas complejas, la creación de índices para mejorar la velocidad de las consultas, la gestión de transacciones, la replicación de datos, y más. MySQL se utiliza comúnmente como base de datos para aplicaciones web, y se integra bien con lenguajes de programación como PHP, Python y Ruby. También es compatible con múltiples sistemas operativos, lo que lo hace una opción popular para la gestión de datos en una variedad de entornos.

PHP (acrónimo recursivo que significa "PHP: Hypertext Preprocessor") es un lenguaje de programación de código abierto, popularmente utilizado para el desarrollo de aplicaciones web. Fue creado originalmente en 1994 por Rasmus Lerdorf y ha evolucionado a lo largo de los años con la participación de una comunidad de desarrolladores en todo el mundo. PHP se ejecuta en el lado del servidor y se utiliza principalmente para generar contenido dinámico en páginas web, como la generación de HTML, la manipulación de datos de formularios y la conexión a bases de datos. Es un lenguaje de scripting flexible que se integra bien con HTML y otros lenguajes de programación, lo que lo hace una opción popular para la creación de sitios web dinámicos y aplicaciones web.

Utilizaremos las imágenes oficiales que hay en Docker Hub para WordPress, MySQL y phpMyAdmin.

Estos son los pasos que vamos a seguir:

## Creación de la red

Crearemos una user-defined bridge network para todos los contenedores. Por ejemplo, esta red se puede llamar wordpress-net.

    docker network create wordpress-net

## Creación de un volumen para MySQL

Crearemos un volumen nuevo para almacenar los datos de MySQL. Por ejemplo, este volumen se puede llamar wordpress_mysql_data.

    docker volume create wordpress_mysql_data

IMPORTANTE: Para que las variables de entorno de MySQL tengan efecto, debemos trabajar sobre un volumen que no tenga datos y que no haya sido usado previamente porque si el volumen ya tiene datos, la base de datos y el usuario que le estamos indicando en las variables de entorno no se crearán.

## Instancia de un contenedor MySQL

Crearemos una instancia de un contenedor con MySQL:

    docker run -d \
    --rm \
    --name mysql-container \
    --network wordpress-net \
    -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=root \
    -e MYSQL_DATABASE=wp_database \
    -e MYSQL_USER=wp_user \
    -e MYSQL_PASSWORD=wp_password \
    -v wordpress_mysql_data:/var/lib/mysql \
    mysql/mysqlserver:8.0

El comando se descompone de la siguiente manera:

- -d: Ejecuta el contenedor en segundo plano (modo "detach").
- --rm: Elimina el contenedor automáticamente cuando se detiene.
- --name mysql-container: Asigna un nombre al contenedor para su fácil referencia. En este caso, el nombre es "mysql-container".
- --network wordpress-net: Esto conecta el contenedor a una red existente llamada "wordpress-net". Los contenedores en la misma red pueden comunicarse entre sí usando los nombres de contenedores como nombres de host.
- -p 3306:3306: Esto mapea el puerto 3306 del contenedor al puerto 3306 del host. El formato es -p <puerto host>:<puerto contenedor>.
- -e MYSQL_ROOT_PASSWORD=root, -e MYSQL_DATABASE=wp_database, -e MYSQL_USER=wp_user, -e MYSQL_PASSWORD=wp_password: Estas son variables de entorno que se pasan al contenedor. En este caso, son utilizadas por MySQL para configurar la base de datos.
- -v wordpress_mysql_data:/var/lib/mysql: Esto monta el volumen "wordpress_mysql_data" en la ruta "/var/lib/mysql" dentro del contenedor. Cualquier dato escrito en "/var/lib/mysql" en el contenedor se guardará en el volumen, permitiendo la persistencia de datos.
- mysql/mysqlserver:8.0: Esta es la imagen que se está utilizando para crear el contenedor. En este caso, es una imagen de MySQL versión 8.0.

## Instancia de un conteneder phpMyAdmin

Creamos una instancia de un contenedor con phpMyAdmin:

    docker run -d \
    --rm \
    --network wordpress-net \
    -e PMA_ARBITRARY=1 \
    -p 8080:80 \
    phpmyadmin/phpmyadmin

La variable de entorno PMA_ARBITRARY con el valor 1, nos permitirá indicar el nombre del servidor de base de datos al que queremos conectarnos.

## Creación de un volumen para Wordpress

Necesitaremos crear un volumen donde almacenar los ficheros del blog.

    docker volume create wordpress_data

## Instancia de un contenedor con WordPress

Creamos una instancia de un contenedor con WordPress al que tendremos que indicarle algunas variables de entorno que nos permitirán conectarnos al contenedor que corre el servidor de bases de datos MySQL.

    docker run -d \
    --rm \
    --name wordpress-container \
    --network wordpress-net \
    -p 80:80 \
    -e WORDPRESS_DB_HOST=mysql-container \
    -e WORDPRESS_DB_NAME=wp_database \
    -e WORDPRESS_DB_USER=wp_user \
    -e WORDPRESS_DB_PASSWORD=wp_password \
    -v wordpress_data:/var/www/html \
    wordpress

La composición de este comando es:

- -d: Este es un modificador que indica a Docker que ejecute el contenedor en modo "detach" o en segundo plano.
- --rm: Este modificador indica a Docker que elimine el contenedor una vez que se detenga.
- --name wordpress-container: Esto establece el nombre del contenedor como "wordpress-container".
- --network wordpress-net: Esto conecta el contenedor a la red "wordpress-net". Esta red permite que los contenedores se comuniquen entre sí.
- -p 80:80: Este comando mapea el puerto 80 del host al puerto 80 del contenedor. Esto significa que cualquier tráfico en el puerto 80 del host será enviado al puerto 80 del contenedor.
- -e WORDPRESS_DB_HOST=mysql-container: Esta es una variable de entorno que se pasa al contenedor. En este caso, indica al contenedor de WordPress que la base de datos se encuentra en "mysql-container".
- -e WORDPRESS_DB_NAME=wp_database: Este es el nombre de la base de datos de WordPress.
- -e WORDPRESS_DB_USER=wp_user: Este es el nombre de usuario de la base de datos de WordPress.
- -e WORDPRESS_DB_PASSWORD=wp_password: Esta es la contraseña de la base de datos de WordPress.
- -v wordpress_data:/var/www/html: Esto crea un volumen llamado "wordpress_data" y lo monta en el directorio "/var/www/html" del contenedor. Esto proporciona persistencia de datos para el contenedor.
- wordpress: Esta es la imagen de Docker que se utiliza para crear el contenedor. En este caso, es la imagen oficial de WordPress.

Finalmente podremos acceder a través de la url http://localhost y accederemos al instalador del CMS.

Manuel J. Rodríguez. Instalación de wordpress (Dominio público)

# Para saber más

Puedes consultar algunos recursos adicionales que proporcionan guías y ejemplos prácticos sobre cómo trabajar con múltiples contenedores en Docker:

- Docker Compose Tutorial: Este tutorial de Docker explica cómo utilizar Docker Compose para definir y ejecutar aplicaciones de múltiples contenedores. URL: https://docs.docker.com/compose/gettingstarted/
- Deploying WordPress with Docker Compose: Este tutorial de DigitalOcean proporciona un ejemplo paso a paso sobre cómo desplegar WordPress, MySQL y phpMyAdmin utilizando Docker Compose. URL: https://www.digitalocean.com/community/tutorials/how-to-install-wordpress-with-docker-compose
- Dockerizing a Node.js web app: Este tutorial de la documentación oficial de Node.js muestra cómo crear una aplicación web de Node.js y MongoDB utilizando Docker. URL: https://nodejs.org/en/docs/guides/nodejs-docker-webapp/
- YouTube - Docker Compose in 12 Minutes: Este video proporciona una introducción rápida y concisa a Docker Compose. URL: https://www.youtube.com/watch?v=Qw9zlE3t8Ko

Espero que estos recursos sean útiles para aprender más sobre cómo trabajar con múltiples contenedores en Docker.

Creado con eXeLearning (Ventana nueva)