
Introducción
En este tercer y último post se automatiza el despliegue de otro contenedor WordPress y sus certificados con un dominio distinto utilizando Docker y Docker Compose. Se hace solo con 2 WordPress y dos dominios, pero se podría hacer con muchos más, siempre y cuando el servidor tenga capacidad.
- El primer post consistió en el despliegue de WordPress sin certificado SSL (enlace).
- El segundo obtendremos el certificado SSL (enlace).
- El tercero desplegaremos otros WordPress contenerizados que corran en nuestro servidor con otro dominio diferente (el actual).
Explicación
Se debe de tener en cuenta que lo único diferente que se hace aquí es crear un contenedor nuevo de WordPress que se llamará “gyqrebeldewordpress”, con sus correspondientes variables de entorno. Se añade una nueva configuración de nginx para que se redireccionen a nuestro nuevo contenedor todas las peticiones que le lleguen por la url “www.guayaquilrebelde.org”, y por último se crea otro contenedor de certbot llamado “gyqrebeldecertbot” que automatize e instale el certificado SSL, utilizando Let’s Encryp.
Una vez se ha realizado todo esto se crea la base de datos correspondiente, tal como se especifica en la última parte del primer post.
ESTAD MUY ATENTOS A LOS NOMBRES DE LAS BASES DE DATOS, USUARIOS Y CONTRASEÑAS QUE SE CREAN EN NUESTRO ARCHIVO DE VARIABLES DE ENTORNO.
Por último, quería aclarar que estos pasos sirven para añadir un único contenedor, pero se podrían añadir todos los que queramos (la capacidad la marcará los límites de nuestro servidor).
Añadiendo contenedores
Se utiliza el mismo directorio donde ejecutamos el WordPress del post anterior. Se modifican los siguientes archivos:
- WordPress/docker-compose.yml
version: "2.2"
services:
myrootdevwordpress:
container_name: myrootdevwordpress
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
gyqrebeldewordpress:
container_name: gyqrebeldewordpress
image: wordpress:php7.4-apache
restart: always
stdin_open: true
tty: true
env_file: .env
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: $WORDPRESS_DB_USER_2
WORDPRESS_DB_PASSWORD: $WORDPRESS_DB_PASSWORD_2
WORDPRESS_DB_NAME: $WORDPRESS_DB_NAME_2
volumes:
- ./html/gyqrebelde:/var/www/html
nginx:
container_name: nginx
image: nginx:latest
restart: unless-stopped
ports:
- 80:80
volumes:
- ./nginx/conf:/etc/nginx/conf.d
- ./html:/var/www/html
- ./certbot/conf:/etc/nginx/ssl
# myrootdevcertbot:
# container_name: myrootdevcertbot
# image: certbot/certbot:latest
# command: certonly --webroot --webroot-path=/var/www/html --email camilo.cubillos.osses.90@gmail.com --agree-tos --no-eff-email -d myrootdev.com -d www.myrootdev.com
# volumes:
# - ./certbot/conf:/etc/letsencrypt
# - ./certbot/logs:/var/log/letsencrypt
# - ./html/myrootdev:/var/www/html
gyqrebeldecertbot:
container_name: gyqrebeldecertbot
image: certbot/certbot:latest
command: certonly --webroot --webroot-path=/var/www/html --email camilo.cubillos.osses.90@gmail.com --agree-tos --no-eff-email -d guayaquilrebelde.org -d www.guayaquilrebelde.org
volumes:
- ./certbot/conf:/etc/letsencrypt
- ./certbot/logs:/var/log/letsencrypt
- ./html/gyqrebelde:/var/www/html
db:
image: mysql:8.0
container_name: mysql8
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: phpmyadmin
restart: always
ports:
- '7070:80'
environment:
PMA_HOST: db
Se añade el contenedor de WordPress de nuestra nueva url y a continuación el contenedor para los certificados SSL del nuevo contenedor. Se modifica el contenedor de nginx para que sólo escuche el puerto 80.
- WordPress/nginx/conf/default.conf
server {
listen [::]:80;
listen 80;
server_name myrootdev.com www.myrootdev.com;
return 301 https://myrootdev.com$request_uri;
}
server {
listen [::]:443 ssl http2;
listen 443 ssl http2;
server_name myrootdev.com www.myrootdev.com;
ssl_certificate /etc/nginx/ssl/live/myrootdev.com/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/live/myrootdev.com/privkey.pem;
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://myrootdevwordpress: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://myrootdevwordpress: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://myrootdevwordpress:80;
}
location ~/\. {
deny all;
access_log off;
log_not_found off;
}
}
server {
listen [::]:80;
listen 80;
server_name guayaquilrebelde.org www.guayaquilrebelde.org;
root /var/www/html/gyqrebelde;
index index.php;
location ~ /.well-known/acme-challenge {
allow all;
root /var/www/html/gyqrebelde;
}
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://gyqrebeldewordpress: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://gyqrebeldewordpress: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://gyqrebeldewordpress:80;
}
#location ~/\. {
# deny all;
# access_log off;
# log_not_found off;
#}
}
Se añade a la configuración de nginx nuestra nueva url sin añadir por el momento los certificados SSL.
Ahora ejecutamos los contenedores.
docker-compose up -d
Los certificados aparecen en la carpeta de consistencia del contenedor de certbot.

Instalación del certificado
Lo primero que se debe hacer es parar todos los contenedores.
docker-compose stop
Para la instalación de los certificados se deberá modificar un poco el archivo de docker-compose y la configuración de nginx.
- WordPress/docker-compose.yml
version: "2.2"
services:
myrootdevwordpress:
container_name: myrootdevwordpress
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
gyqrebeldewordpress:
container_name: gyqrebeldewordpress
image: wordpress:php7.4-apache
restart: always
stdin_open: true
tty: true
env_file: .env
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: $WORDPRESS_DB_USER_2
WORDPRESS_DB_PASSWORD: $WORDPRESS_DB_PASSWORD_2
WORDPRESS_DB_NAME: $WORDPRESS_DB_NAME_2
volumes:
- ./html/gyqrebelde:/var/www/html
nginx:
container_name: nginx
image: nginx:latest
restart: unless-stopped
ports:
- 80:80
- 443:443
volumes:
- ./nginx/conf:/etc/nginx/conf.d
- ./html:/var/www/html
- ./certbot/conf:/etc/nginx/ssl
# myrootdevcertbot:
# container_name: myrootdevcertbot
# image: certbot/certbot:latest
# command: certonly --webroot --webroot-path=/var/www/html --email camilo.cubillos.osses.90@gmail.com --agree-tos --no-eff-email -d myrootdev.com -d www.myrootdev.com
# volumes:
# - ./certbot/conf:/etc/letsencrypt
# - ./certbot/logs:/var/log/letsencrypt
# - ./html/myrootdev:/var/www/html
# gyqrebeldecertbot:
# container_name: gyqrebeldecertbot
# image: certbot/certbot:latest
# command: certonly --webroot --webroot-path=/var/www/html --email camilo.cubillos.osses.90@gmail.com --agree-tos --no-eff-email -d guayaquilrebelde.org -d www.guayaquilrebelde.org
# volumes:
# - ./certbot/conf:/etc/letsencrypt
# - ./certbot/logs:/var/log/letsencrypt
# - ./html/gyqrebelde:/var/www/html
db:
image: mysql:8.0
container_name: mysql8
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: phpmyadmin
restart: always
ports:
- '7070:80'
environment:
PMA_HOST: db
La principal diferencia es que se comenta con “#” la sección de “gyqrebeldecertbot”. La otra pequeña diferencia es la exposición de nginx por el puerto 443.
- WordPress/nginx/conf/default.conf
server {
listen [::]:80;
listen 80;
server_name myrootdev.com www.myrootdev.com;
return 301 https://myrootdev.com$request_uri;
}
server {
listen [::]:80;
listen 80;
server_name guayaquilrebelde.org www.guayaquilrebelde.org;
return 301 https://guayaquilrebelde.org$request_uri;
}
server {
listen [::]:443 ssl http2;
listen 443 ssl http2;
server_name myrootdev.com www.myrootdev.com;
ssl_certificate /etc/nginx/ssl/live/myrootdev.com/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/live/myrootdev.com/privkey.pem;
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://myrootdevwordpress: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://myrootdevwordpress: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://myrootdevwordpress:80;
}
location ~/\. {
deny all;
access_log off;
log_not_found off;
}
}
server {
listen [::]:443 ssl http2;
listen 443 ssl http2;
server_name guayaquilrebelde.org www.guayaquilrebelde.org;
ssl_certificate /etc/nginx/ssl/live/guayaquilrebelde.org/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/live/guayaquilrebelde.org/privkey.pem;
root /var/www/html/gyqrebelde;
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://gyqrebeldewordpress: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://gyqrebeldewordpress: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://gyqrebeldewordpress:80;
}
location ~/\. {
deny all;
access_log off;
log_not_found off;
}
}
Conclusiones
Esta es una manera sencilla de tener varias webs alojadas en un único servidor. Conseguimos ahorrarnos dinero sin tener que usar un servidor diferente para cada web que queramos desplegar. Tened en cuenta que el límite de cuantas webs puede alojar nuestro servidor lo marcará la CPU, RAM y el almacenamiento disponible.