Simplifica el despliegue de tu sitio web de WordPress con nuestra guía fácil de seguir. Utiliza Docker Compose, Nginx, Apache y SSL para un proceso de instalación sin problemas.
También crearemos volúmenes para que los cambios o actualizaciones se conserven al reiniciar el contenedor.
Este setup se ha probado en Google Cloud con una instancia que ejecuta el sistema operativo Ubuntu 22.04. También puedes realizar este setup en cualquier servicio en la nube como AWS, Azure, DigitalOcean, o en servidores dedicados o VPS.
Requisitos previos
Asegúrate de haber completado todos los pasos mencionados anteriormente.
- Dominio apuntando a la dirección IP de tu servidor.
- Docker instalado y configurado.
- Docker Compose instalado y configurado.
Una vez que tengas todos los requisitos previos listos, puedes proceder a realizar el setup y configurar WordPress.
Crear Directorio del Proyecto
Accede por SSH a tu servidor y comienza creando un nuevo directorio de proyecto llamado wp-project
. También puedes nombrarlo como necesites.
mkdir wp-project
Crear Archivo Docker Compose YML
Ahora, navega dentro del directorio del proyecto y crea un nuevo archivo docker-compose.yml con la siguiente configuración.
cd wp-project
Crea un nuevo archivo docker-compose.yml
.
nano docker-compose.yml
Copia todo el contenido a continuación y pégalo en el archivo.
Configurar Docker Compose
Asegúrate de reemplazar las variables de entorno mencionadas a continuación.
docker-compose.ymlversion: "3.9"
services:
wordpress:
container_name: wordpress
image: wordpress:php8.2-apache
restart: always
stdin_open: true
tty: true
environment:
WORDPRESS_DB_HOST: mariadb
WORDPRESS_DB_USER: db_user
WORDPRESS_DB_PASSWORD: db_user_pass
WORDPRESS_DB_NAME: db_name
volumes:
- wordpress_data:/var/www/html
mariadb:
container_name: mariadb
image: mariadb
restart: always
environment:
MYSQL_DATABASE: db_name
MYSQL_USER: db_user
MYSQL_PASSWORD: db_user_pass
MYSQL_RANDOM_ROOT_PASSWORD: 'root_pass'
volumes:
- db_data:/var/lib/mysql
nginx:
container_name: nginx
image: nginx:latest
restart: unless-stopped
ports:
- 80:80
- 443:443
volumes:
- ./nginx/conf:/etc/nginx/conf.d
- ./certbot/conf:/etc/nginx/ssl
- ./certbot/data:/var/www/html
certbot:
container_name: certbot
image: certbot/certbot:latest
command: certonly --webroot --webroot-path=/var/www/html --email [email protected] --agree-tos --no-eff-email -d domain.com -d www.domain.com
volumes:
- ./certbot/conf:/etc/letsencrypt
- ./certbot/logs:/var/log/letsencrypt
- ./certbot/data:/var/www/html
volumes:
db_data:
wordpress_data:
Presiona CTRL-X
seguido de Y
y ENTER
para guardar y salir del archivo.
Configuración de Docker Compose: Explicación
Aquí están los detalles de configuración:
- Versión: Compone una versión de archivo compatible con el Docker Engine. Puedes verificar la compatibilidad aquí.
- Servicios: Aquí, tenemos cuatro servicios llamados
WordPress
,MariaDB
,nginx
, ycertbot
. - Imagen: Utilizamos la última versión de WordPress con PHP 8.2, Apache, Mariadb, Nginx, y Certbot imágenes disponibles en Docker hub.
- Volúmenes:
wordpress_data
: Hemos configurado este directorio para que se sincronice con el directorio que deseamos utilizar como raíz web dentro del contenedor.conf
: Aquí colocaremos el archivo de configuración de Nginx para sincronizarlo con la carpeta conf.d predeterminada de Nginx dentro del contenedor.cedtbot/conf
: Aquí es donde recibiremos el certificado SSL, y esto se sincronizará con la carpeta que deseemos dentro del contenedor.puertos
: Configurar el contenedor para que escuche en los puertos listados.comando
: El comando utilizado para recibir el certificado SSL.
- Entorno: Aquí, enumeramos todas las variables de entorno disponibles para la imagen de WordPress.
WORDPRESS_DB_HOST
: Aquí, utilizamos el nombre del servicio del contenedor de MariaDB.WORDPRESS_DB_USER
: Igual al que hemos configurado en el servicio de mariadb.WORDPRESS_DB_PASSWORD
: Igual al que hemos configurado en el servicio de mariadb.WORDPRESS_DB_NAME
: Igual al que hemos configurado en el servicio de mariadb.
Configurar Nginx
De acuerdo con la configuración de docker-compose.yml, necesitamos crear el archivo default.conf
dentro del directorio nginx/conf
.
Crea el directorio junto a tu archivo docker-compose.yml
para albergar el archivo de configuración.
mkdir -p nginx/conf
Crea un archivo llamado default.conf
.
nano nginx/conf/default.conf
Coloca las siguientes configuraciones; aquí, utilizamos la configuración de proxy inverso al contenedor de WordPress que ejecuta Apache.
nginx/conf/default.conf server {
listen [::]:80;
listen 80;
server_name domain.com www.domain.com;
root /var/www/html;
index index.php;
location ~ /.well-known/acme-challenge {
allow all;
root /var/www/html;
}
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://wordpress: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://wordpress: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://wordpress:80;
}
}
Presiona CTRL-X
seguido de Y
y ENTER
para guardar y salir del archivo.
Ahora tienes tu configuración de docker-compose y tu configuración de Nginx.
Implementar WordPress con Docker Compose
Inicia los contenedores utilizando el siguiente comando; recibirás los certificados SSL una vez que los contenedores estén iniciados.
docker-compose up -d
Una vez que todos los contenedores estén iniciados, verás dos directorios adicionales, certbot
y WordPress,
creados junto a tu archivo docker-compose.yml
.
El directorio wordpress
contiene todo el código fuente de tu sitio web de WordPress.
El directorio certbot
contiene todos los archivos relacionados con tus certificados SSL.
Para ver los contenedores, puedes ejecutar el siguiente comando.
docker-compose ps
Configurar SSL Let’s Encrypt con Nginx
Como has recibido el certificado SSL Let’s Encrypt, puedes configurar HTTPS y establecer la redirección a HTTPS.
Edita el default.conf
y realiza los siguientes cambios.
nano nginx/conf/default.conf
nginx/conf/default.confserver {
listen [::]:80;
listen 80;
server_name domain.com www.domain;
return 301 https://www.domain.com$request_uri;
}
server {
listen [::]:443 ssl http2;
listen 443 ssl http2;
server_name domain.com;
ssl_certificate /etc/nginx/ssl/live/domain.com/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/live/domain.com/privkey.pem;
return 301 https://www.domain.com$request_uri;
}
server {
listen [::]:443 ssl http2;
listen 443 ssl http2;
server_name www.domain.com;
ssl_certificate /etc/nginx/ssl/live/domain.com/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/live/domain.com/privkey.pem;
root /var/www/html;
index index.php;
location ~ /.well-known/acme-challenge {
allow all;
root /var/www/html;
}
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://wordpress: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://wordpress: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://wordpress:80;
}
}
Presiona CTRL-X
seguido de Y
y ENTER
para guardar y salir del archivo.
Ahora, puedes reiniciar el servicio de Nginx para cargar las nuevas configuraciones.
docker-compose restart nginx
Ahora, puedes verificar tu nombre de dominio desde tu navegador. Obtendrás una redirección a HTTPS, y verás la página de instalación de WordPress para completar la instalación.
Solución de problemas
A continuación, se ofrecen algunos consejos para SSH a contenedores; revisa los registros de errores.
SSH al contenedor Docker
Para SSH al contenedor wordpress
, puedes usar el siguiente comando.
docker-compose exec wordpress /bin/bash
Para conectarse por SSH al contenedor nginx
, puedes utilizar el siguiente comando.
docker-compose exec nginx /bin/bash
Verificar Registros de Contenedor
Puedes utilizar el siguiente comando para revisar los registros de los contenedores mediante docker-compose
docker-compose logs -f
Reiniciar Contenedores
Puedes reiniciar los contenedores fácilmente utilizando el comando restart
.
docker-compose restart container_name
Reemplaza container_name
con el nombre de tu contenedor (wordpress, nginx, certbot)
Detener Todos los Contenedores de Docker
Puedes detener todos los contenedores de Docker utilizando el siguiente comando.
docker-compose down
Eliminar Todos los Contenedores y Volúmenes
Puedes utilizar docker-compose para eliminar todos los contenedores y sus volúmenes con el siguiente comando.
docker compose rm -fv
Eliminar Todos los Contenedores de Docker
Elimina todos los contenedores utilizando el siguiente comando.
docker rm -f $(docker ps -a -q)
Eliminar Todos los Volúmenes
También puedes eliminar todos los volúmenes utilizando el siguiente comando.
docker volume rm $(docker volume ls -q)
Iniciar Todos los Contenedores
Con un solo comando de Docker compose, puedes iniciar todos los contenedores.
docker-compose up -d
Conclusión
Ahora has aprendido cómo instalar y configurar WordPress con Nginx, Apache, PHP 8.2, MariaDB y Let’s Encrypt con Docker y Docker Compose en Ubuntu 22.04.
Gracias por tu tiempo.
Source:
https://dzone.com/articles/wordpress-deployment-docker-nginx-apache-ssl