En la publicación anterior dejé preparado mi nuevo MiniPC con Debian y Docker, listo para alojar nuevos contenedores. La idea inicial de meterme en este lio era jugar con esto de los servidores auto-alojados y mi primera prueba tiene que ser con la pagina web. Tengo que traspasar esta web hospedada en un hosting externo y gestionada con Wordpress a mi flamante nuevo mini servidor y hacerla funcional bajo Docker. Vamos allá.
Buscar la imagen Docker correcta
No se si lo expliqué en el articulo anterior, donde instalo Docker sobre Debian, pero el funcionamiento de un contenedor es muy sencillo, básicamente se introduce en una imagen paquetizada todos los elementos necesarios para que funcione el programa dedicado, como las librerías o incluso el sistema operativo. Esta imagen paquetizada se ejecuta en un entorno completamente cerrado y sin interactuar con los otros contenedores, utilizando los recursos que Docker pone a su disposición, el procesador, la ram o el espacio necesario del disco duro.
Generalmente los propios creadores de estos programas, como WordPress, tienen sus imágenes Docker y las ponen a nuestra disposición, pero también cualquier usuario con ciertos conocimientos puede crear una imagen de Docker o modificar una existente para compartirla con el resto. Para estas cosas hay una web que aglutina una gran cantidad de imágenes Docker y las pone a nuestra disposición, es Docker Hub.
Pero Docker Hub puede ser un suplicio para ayudarte con la instalación de estas imágenes, entras en la imagen que quieres instalar, te lees la descripción, entras en el repositorio de GitHub, te vuelves a leer las instrucciones... Desde este post vamos a intentar ponerlo algo mas fácil y os pondré las instrucciones a seguir para dejar el entorno WordPress preparado para su ejecución.
Conectaros por ssh al servidor (o de forma local si tenéis monitor y teclado) y vamos a ello:
Instrucciones
1. Crear el directorio para el contenedor.
Recordar que en el post inicial de instalación de Docker creamos una carpeta llamada "docker" para dejar dentro los compose (archivos de configuración de los contenedores) y las carpetas de cada contenedor, así que vamos a acceder a esa carpeta y crear las subcarpetas que necesitamos para dejar WordPress funcionando.
cd docker
mkdir wordpress
cd wordpress
mkdir mysql && mkdir wp-data
cd mysql
mkdir wp
cd ..
Con estas instrucciones hemos creado la carpeta "wordpress" que va a soportar la configuración y los archivos de nuestra web dentro de la subcarpeta "wp-data". También hemos creado la carpeta "mysql" y dentro la subcarpeta "wp" donde se guardará la base de datos de WordPress.
2. Crear el archivo docker-compose.
Este es el archivo que contiene las instrucciones para instalar y configurar inicialmente el contenedor de WordPress y su base de datos.
sudo nano docker-compose.yml
Dentro del archivo compose copia y pega la siguiente configuración:
services:
db:
image: jc21/mariadb-aria:latest
container_name: wordpress-db
restart: unless-stopped
networks:
- wp
environment:
MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD
MYSQL_DATABASE: $MYSQL_DATABASE
MYSQL_USER: $MYSQL_USER
MYSQL_PASSWORD: $MYSQL_PASSWORD
MYSQL_PORT: $MYSQL_PORT
volumes:
- ~/docker/mysql/wp:/var/lib/mysql/wp
wordpress:
image: wordpress:latest
container_name: wordpress
restart: unless-stopped
networks:
- wp
ports:
- "8080:80" # Cambia 8080 si ya usas ese puerto
depends_on:
- db
environment:
WORDPRESS_DB_HOST: $MYSQL_HOST
WORDPRESS_DB_USER: $MYSQL_USER
WORDPRESS_DB_PASSWORD: $MYSQL_PASSWORD
WORDPRESS_DB_NAME: $MYSQL_DATABASE
volumes:
- ~/docker/wordpress/wp-data:/var/www/html
networks:
wp:
external: true
volumes:
wp:
driver: local
wp-data:
driver: local
Dentro del apartado "services" incluimos los dos servicios que va a ejecutar docker, el primero es la base de datos (mariadb, mas ligera) y el segundo es el propio CMS.
Después tenemos el apartado "networks" donde estamos diciendo que la red "wp" es externa (external:true), así docker sabe que no tiene que crearla cada vez que se ejecute el compose, pero necesita estar creada con anterioridad, por lo tanto en Portainer entramos en el apartado de redes y creamos una red nueva llamada "wp", dejando todas la opciones predeterminadas.
El ultimo apartado es "volumes" y configuramos las carpetas de la base de datos y de wordpress como locales.
3. Crear archivo oculto de variables.
Cada servicio tiene una serie de apartados como la imagen a usar (image) y la versión de la imagen (:latest), que nombre ponemos a los contenedores (container_name), la red donde se va a conectar y que puertos va a usar cada contenedor.
Hay un apartado que es el de entorno (environment) donde ajustamos características particulares de cada contenedor y en este caso las hemos ocultado con variables de entorno ocultas (el símbolo $ indica que hay que buscar en un archivo externo esa referencia).
sudo nano .env
Con esta orden creamos el archivo de variables oculto y dentro indicamos cual es el dato de cada variable. Incluir lo siguiente en el archivo oculto .env.
MYSQL_ROOT_PASSWORD=ROOT_PASSWORD # Cambia ROOT_PASSWORD por tu contraseña de root para mariadb
MYSQL_DATABASE=wordpress # Nombre de la base de datos
MYSQL_USER=wordpress # Usuario de la base de datos
MYSQL_PASSWORD=wordpress # Contraseña de la base de datos
MYSQL_HOST=db # El nombre del servicio
MYSQL_PORT=3306 # El puerto de la base de datos
En la misma linea, después del símbolo # se explica que es cada variable de entorno. En docker todo lo que vaya a la derecha del símbolo # es de solo lectura.
Ejecución y acceso.
Ahora solo queda ejecutar el compose y poner en marcha los contenedores.
docker compose up -d
Una vez arrancan los contenedores, en Portainer podéis comprobar el estado. Hecho esto solo queda acceder al portal web de WordPress, crear el usuario administrador e instalar el CMS para poner en marcha la web.
http://ip_del_servidor:8080
Con estos pasos ya tengo WordPress funcionando en mi MiniServidor, ahora solo queda crear la copia de seguridad del hosting e importarla al contenedor local. Después hay que preparar el servidor local con un proxy para evitar sustos, pero eso lo veremos en el siguiente articulo.