Automatizar despligue de WordPress con Docker. (parte 1)

Introducción

Esta primera entrada en el blog se desarrollará a lo largo de tres posts, donde explicaré como automatizar el despliegue de WordPress con Docker y Docker Compose.

  • El primer post consistirá en el despliegue de WordPress sin certificado SSL (el actual).
  • En el segundo obtendremos el certificado SSL.
  • En el tercero desplegaremos otros WordPress contenerizados que corran en nuestro servidor con otro dominio diferente.

Antes de comenzar

En primer lugar, debemos saber que esto se puede realizar tanto de manera local, como en la red. El caso que aquí detallamos es realizado en un servidor VPS (CentOS 7) de Contabo, el coste aproximado es de unos 50-60 €/año.

Para la obtención de los dominios se ha utilizado Namecheap, que tiene un coste de unos 10 €/año.

Para conectar el servidor con los dominios, dentro de nuestra cuenta de Namecheap debemos acceder a las opciones de nuestro dominio y en la pestaña Advanced DNS dejarlo igual que la imagen inferior (sustituyendo myrootdev.com por el dominio escogido y colocando en la zona tachada en granate la IP de nuestro servidor).

Imagen de configuración de los dominios.

Instalando Docker y Docker Compose

En el siguiente artículo tenemos la documentación oficial para la instalación de Docker en una máquina Centos https://docs.docker.com/engine/install/centos/

Los comandos para instalar Docker son los siguientes:

//Añadir el repositorio de docker
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

//Instalar docker
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

//Arrancar docker y comprobar que funciona bien
sudo systemctl start docker
sudo docker run hello-world

//Añadir docker a el grupo de no root users
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker

//Verificar que funciona sin sudo
docker run hello-world

En el siguiente artículo tenemos documentación para la instalación de Docker-Compose en una máquina Centos https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-compose-on-centos-7

Los comandos para instalar Docker-Compose son los siguientes:

//Instalando Docker-Compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version

//Output
docker-compose version 1.23.2, build 1110ad01

Creación docker-compose

En este paso se crea el archivo para ejecutar el docker-compose y la carpeta donde se guardará la persistencia de los contenedores.

//Instalando Docker-Compose
mkdir WordPress
vi ./Wordpress/docker-compose.yml
version: "2.2"
services:
    myrootdevwordpress:
        container_name: myrootdevwordpress1
        image: wordpress:php7.4-apache
        restart: always
        mem_limit: 196m
        stdin_open: true
        tty: true
        env_file: .env
        environment:
            WORDPRESS_DB_HOST: db:3306
            WORDPRESS_DB_USER: $WORDPRESS_DB_USER_1
            WORDPRESS_DB_PASSWORD: $WORDPRESS_DB_PASSWORD_1
            WORDPRESS_DB_NAME: $WORDPRESS_DB_NAME_1
        volumes:
            - ./html/myrootdev:/var/www/html
    nginx:
        container_name: nginx1
        image: nginx:latest
        restart: unless-stopped
        ports:
            - 80:80
        volumes:
            - ./nginx/conf:/etc/nginx/conf.d
            - ./html:/var/www/html
    db:
        image: mysql:8.0
        container_name: mysql811
        restart: always
        ports:
            - '3306:3306'
        env_file: .env
        environment:
            MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD
        volumes:
            - ./db_data:/var/lib/mysql
    phpmyadmin:
        depends_on:
            - db
        image: phpmyadmin/phpmyadmin
        container_name: phpmyadmin1
        restart: always
        ports:
            - '7070:80'
        environment:
            PMA_HOST: db

En la parte de volúmenes de los contendores al escribir “./html:/var/www/html “, indicamos que la persistencia de nuestros contenedores se genera en el directorio desde el que ejecutamos el archivo docker-compose.yml. Los distintos contenedores persisten en sus volúmenes correspondientes.

 La configuración de nginx no sirve la que viene por defecto, por lo que tendremos que usar una en particular.

//Instalando Docker-Compose
vi ./Wordpress/nginx/conf/default.conf
server {
    listen [::]:80;
    listen 80;

    server_name myrootdev.com www.myrootdev.com;

    root /var/www/html/myrootdev;
    index index.php;

    location ~ /.well-known/acme-challenge {
         allow all;
         root /var/www/html/myrootdev;
    }

    location / {
        try_files $uri @apache;
    }

    location ~ ^/\.user\.ini {
        deny all;
    }

    location ~*  \.(svg|svgz)$ {
        types {}
        default_type image/svg+xml;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location @apache {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://myrootdevwordpress1:80;
    }

    location ~[^?]*/$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://myrootdevwordpress1:80;
    }

    location ~ \.php$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://myrootdevwordpress1:80;
    }

    location ~/\. {
       deny all;
       access_log off;
       log_not_found off;
    }
}

El nombre del contenedor que tiene el WordPress debe de coincidir con la sección http://myrootdevwordpress1:80 de la configuración de nginx.

Todas las variables de entorno las crearemos en un archivo aparte.

vi ./Wordpress/.env
MYSQL_ROOT_PASSWORD=123AAAAA123
MYSQL_USER=example
MYSQL_PASSWORD=123AAAAA123
WORDPRESS_DB_USER_1=example_user
WORDPRESS_DB_PASSWORD_1=123AAAAA123
WORDPRESS_DB_NAME_1=example_base

Ya tenemos todo listo para desplegar nuestros contenedores.

cd WordPress/
docker-compose up -d
cddocker-compose ps

Esto quiere decir que todos los contenedores se han levantado correctamente.

Conectándonos a nuestro dominio en el navegador, si todo ha salido bien, nos aparecerá lo siguiente (recordar conectarnos utilizando http://midominio.com).

La advertencia de que no es un sitio seguro se debe a la ausencia del certificado SSL (en el siguiente post lo solucionaremos). El error de la base de datos es normal, ya que no hemos creado ninguna. Para crear nuestra base de datos debemos de:

  • Meter en nuestro navegador nuestra IP y el puerto donde hemos expuesto el phpMyAdmin. Ej: 62.171.182.156:7070.
  • Accedemos con usuario root y la contraseña que tengamos en la variable MYSQL_ROOT_PASSWORD del archivo .env.
  • Crearemos una base de datos con el mismo nombre de la variable WORDPRESS_DB_NAME del archivo .env.
  • Crearemos un usuario en esta nueva base de datos con el mismo nombre de la variable WORDPRESS_DB_USER_1 y la misma contraseña de la variable WORDPRESS_DB_PASSWORD_1 del archivo .env.

Y listo, si entramos en nuestro dominio (asegurarnos de entrar con http://midominio.com), ya tendremos todo listo para la instalación de WordPress.

Author: caco

2 thoughts on “Automatizar despligue de WordPress con Docker. (parte 1)

Leave a Reply

Your email address will not be published. Required fields are marked *