Hola a tod@s,
En este post vamos a ver como desplegar Drupal con Docker, desplegaremos dos contenedores Docker para este servicio, uno de ellos será el de PostgreSQL para la base de datos que vamos a utilizar y el otro el propio de Drupal con la aplicación, este servicio irá desplegado, sobre otra máquina distinta dónde está desplegado nuestro docker con Nginx Proxy Manager, que será el que utilicemos para los certificados SSL.
- Para empezar, vamos a ver que hemos preparado esta máquina virtual con Ubuntu Server 24.04 LTS, dónde tenemos dos discos, uno de sistema y otro de datos:
- Como podemos ver, el disco de datos lo hemos montado sobre /opt/docker que es dónde vamos a ubicar todos los contenedores Dockers y sus configuraciones:
- Nos creamos el registro DNS del tipo CNAME para drupal apuntando a la máquina que tiene instalado el Docker con el Nginx Proxy Manager, ya que vamos a utilizar nuestro proxy inverso:
- Verificamos las versiones de Docker instaladas, docker –version, docker compose version:
- Ahora vamos a crear la estructura de directorios y permisos para los contenedores de PostgreSQL y Drupal:
- sudo mkdir -p /opt/docker/drupal/drupaldb/data
- sudo mkdir -p /opt/docker/drupal/drupalapp/modules
- sudo mkdir -p /opt/docker/drupal/drupalapp/profiles
- sudo mkdir -p /opt/docker/drupal/drupalapp/themes
- sudo mkdir -p /opt/docker/drupal/drupalapp/sites
- sudo chmod -R 755 /opt/docker/drupal/drupaldb
- sudo chmod -R 755 /opt/docker/drupal/drupalapp
- sudo chown 33:33 /opt/docker/drupal/drupalapp/sites
- sudo chmod 775 /opt/docker/drupal/drupalapp/sites
- Ahora creamos una red personalizada para nuestro proyecto, sudo docker network create —subnet 172.25.2.0/24 –gateway 172.25.2.1 -d bridge drupal-net con sudo docker network ls vemos la redes que tenemos configuradas y con sudo docker network inspect drupal-net, vemos la configuración de la red que hemos creado:
- Ahora vamos a crearnos los ficheros .env para no dejar credenciales en texto plano en los ficheros docker-compose.yaml que crearemos posteriormente, utilizando para ello variables.
- Empezaremos con el fichero .env para el contenedor de PostgreSQL, para ello, nos situamos en cd /opt/docker/drupal/drupaldb, y ejecutamos sudo nano .env:
- Y así definimos el fichero:
- POSTGRES_DB=drupaldb
- POSTGRES_USER=drupaluser
- POSTGRES_PASSWORD=clave_muy_segura_db
- Nos creamos el fichero docker-compose.yaml para el contenedor de PostgraSQL en la misma ubicación, sudo nano docker-compose.yaml:
- Este sería el contenido del fichero:
services:
drupal-db:
image: postgres:16.6
container_name: drupal-db
restart: unless-stopped
env_file: .env
volumes:
– /opt/docker/drupal/drupaldb/data:/var/lib/postgresql/data
networks:
– drupal-net
networks:
drupal-net:
name: drupal-net
external: true
- Aquí vemos los ficheros creados:
- Seguimos con el fichero .env para el contenedor de drupal app, para ello, nos situamos en cd /opt/docker/drupal/drupalapp, y ejecutamos sudo nano .env:
- Y así definimos el fichero:
DRUPAL_DB_HOST=drupal-db
DRUPAL_DB_PORT=5432
DRUPAL_DB_NAME=drupaldb
DRUPAL_DB_USER=drupaluser
DRUPAL_DB_PASSWORD=clave_muy_segura_db
DRUPAL_DB_DRIVER=pgsql
- Nos creamos el fichero docker-compose.yaml para el contenedor de drupal-app en la misma ubicación, sudo nano docker-compose.yaml:
- Este sería el contenido del fichero:
services:
drupal-app:
image: drupal:10-apache
container_name: drupal-app
restart: unless-stopped
ports:
– 8081:80
entrypoint:
– /bin/sh
– -c
– |
# 1. Aseguramos que existan las carpetas base en el volumen
echo «Creando estructura de directorios…»
mkdir -p /var/www/html/sites/default/files/translations
# 2. Si NO existe default.settings.php en el volumen, lo traemos del backup interno de Drupal
# Nota: Las imágenes oficiales de Drupal guardan una copia en /opt/drupal/web/sites…
# pero para asegurar, lo creamos si no existe.
if [ ! -f /var/www/html/sites/default/default.settings.php ]; then
echo «Restaurando default.settings.php…»
# Intentamos copiarlo de la ubicación de la imagen si está disponible
cp /opt/drupal/web/sites/default/default.settings.php /var/www/html/sites/default/default.settings.php 2>/dev/null || touch /var/www/html/sites/default/default.settings.php
fi
# 3. Si no hay settings.php, lo creamos
if [ ! -f /var/www/html/sites/default/settings.php ]; then
echo «Creando settings.php…»
cp /var/www/html/sites/default/default.settings.php /var/www/html/sites/default/settings.php
fi
# 4. Permisos correctos para el usuario 33 (www-data)
echo «Aplicando permisos…»
chown -R 33:33 /var/www/html/sites
chmod -R 775 /var/www/html/sites/default/files
# 5. Arrancar Apache
exec apache2-foreground
env_file: .env
environment:
– DRUPAL_DATABASE_HOST=${DRUPAL_DB_HOST}
– DRUPAL_DATABASE_NAME=${DRUPAL_DB_NAME}
– DRUPAL_DATABASE_USER=${DRUPAL_DB_USER}
– DRUPAL_DATABASE_PASSWORD=${DRUPAL_DB_PASSWORD}
– DRUPAL_DATABASE_DRIVER=${DRUPAL_DB_DRIVER}
volumes:
– /opt/docker/drupal/drupalapp/modules:/var/www/html/modules
– /opt/docker/drupal/drupalapp/profiles:/var/www/html/profiles
– /opt/docker/drupal/drupalapp/themes:/var/www/html/themes
– /opt/docker/drupal/drupalapp/sites:/var/www/html/sites
networks:
– drupal-net
networks:
drupal-net:
external: true
- Aquí vemos los ficheros creados:
- Protegemos los archivos .env aplicando estos permisos:
- sudo chmod 600 /opt/docker/drupal/druapldb/.env
- sudo chmod 600 /opt/docker/drupal/drupalapp/.env
- Ahora, iniciamos primero el contenedor de PostgreSQL, cd /opt/docker/drupal/drupaldb/, sudo docker compose up -d:
- Iniciamos el contenedor de drupal-app, cd /opt/docker/drupal/drupalapp/, sudo docker compose up -d:
- Aquí vemos los contenedores levantados, sudo docker ps -a:
- Ahora accedemos a nuestro portal de Nginx Proxy Manager para crear el host para Drupal.
- Accedemos a Hosts > Hosts Proxy:
- Añadir Host Proxy:
- En la pestaña Detalles:
- Nombres de Dominio: ragasys.net
- Esquema: http
- Nombre de Host/IP de reenvío: 192.168.14.17 IP máquina Docker02
- Puerto: 8081
- Bloquear Exploits Comunes
- Soporte de Websockets
- En la pestaña SSL:
- Seleccionamos el Certificado SSL que nos interese
- Marcamos Forzar SSL
- Guardar
- Aquí vemos el host creado y conectado:
- Y como vemos ya tenemos acceso a nuestro drupal a través de nuestro proxy inverso con Nginx Proxy Manager, ahora nos va a pedir lo típico tras el primer acceso.
- Escogemos el idioma:
- Elegimos el perfil:
- Configuramos el acceso a la base de datos:
- Comienza a instalar Drupal:
- Configuración de traducciones:
- Configuramos nuestro sitio de drupal:
- Termina las traducciones:
- Iniciamos sesión en nuestro portal de drupal:
- Ya estamos listos para empezar a publicar:
Saludos y espero que os sea de ayuda 😉

