Cómo instalar Drupal con Docker en Ubuntu 22.04
Drupal es un sistema de gestión de contenidos (CMS) de código abierto escrito en PHP. Muchas organizaciones de todo el mundo lo utilizan para crear blogs, sitios gubernamentales, sitios web corporativos y mucho más. Viene con un conjunto creciente de características y módulos para ampliar su funcionalidad, permitiéndote crear cualquier sitio web que desees.
Este tutorial te enseñará a instalar Drupal utilizando Docker en un servidor Ubuntu 22.04. Drupal funciona con PHP 8.2 y MySQL. También soporta PostgreSQL desde la versión 9, pero hay algunos errores. Por lo tanto, nos ceñiremos al uso de MySQL para nuestro tutorial. Utilizaremos Docker Compose para integrar Drupal con Nginx y la herramienta Certbot para servir un sitio web Drupal en protocolo seguro HTTPS.
Requisitos previos
- Un servidor que ejecute Ubuntu 22.04 con un mínimo de 1 GB de RAM para comunidades más pequeñas. Para alojar comunidades más grandes, debes conseguir un servidor con un mínimo de 2GB de RAM o más.
- Un usuario no root con privilegios sudo.
- Un nombre de dominio completo (FQDN) que apunte a tu servidor. Para nuestros propósitos, utilizaremos
example.com
como nombre de dominio. - Asegúrate de que todo está actualizado.
$ sudo apt update
- Instala los paquetes de utilidades básicas. Es posible que algunos de ellos ya estén instalados.
$ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y
Paso 1 – Configurar el Cortafuegos
El primer paso es configurar el cortafuegos. Ubuntu viene con ufw (Uncomplicated Firewall) por defecto.
Comprueba si el cortafuegos se está ejecutando.
$ sudo ufw status
Deberías obtener la siguiente salida.
Status: inactive
Permite el puerto SSH para que el cortafuegos no rompa la conexión actual al activarlo.
$ sudo ufw allow OpenSSH
Permite también los puertos HTTP y HTTPS.
$ sudo ufw allow http $ sudo ufw allow https
Habilita el cortafuegos
$ sudo ufw enable Command may disrupt existing ssh connections. Proceed with operation (y|n)? y Firewall is active and enabled on system startup
Comprueba de nuevo el estado del cortafuegos.
$ sudo ufw status
Deberías ver un resultado similar.
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 80/tcp ALLOW Anywhere 443 ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) 80/tcp (v6) ALLOW Anywhere (v6) 443 (v6) ALLOW Anywhere (v6)
Paso 2 – Instala Docker y Docker Compose
Ubuntu 22.04 incluye una versión antigua de Docker. Para instalar la última versión, importa primero la clave GPG de Docker.
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
Crea un archivo de repositorio de Docker.
$ echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Actualiza la lista de repositorios del sistema.
$ sudo apt update
Instala la última versión de Docker.
$ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
Comprueba que se está ejecutando.
$ sudo systemctl status docker ? docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Sat 2023-01-14 10:41:35 UTC; 2min 1s ago TriggeredBy: ? docker.socket Docs: https://docs.docker.com Main PID: 2054 (dockerd) Tasks: 52 Memory: 22.5M CPU: 248ms CGroup: /system.slice/docker.service ?? 2054 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Por defecto, Docker requiere privilegios de root. Si quieres evitar utilizar sudo
cada vez que ejecutes el comando docker
, añade tu nombre de usuario al grupo docker
.
$ sudo usermod -aG docker $(whoami)
Tendrás que salir del servidor y volver a entrar como el mismo usuario para activar este cambio o utilizar el siguiente comando.
$ su - ${USER}
Confirma que tu usuario se ha añadido al grupo Docker.
$ groups navjot wheel docker
Paso 3 – Crear el archivo Docker Compose para Drupal
Crea el directorio para Drupal.
$ mkdir ~/drupal
Cambia al directorio.
$ cd ~/drupal
Crea y abre el archivo docker-compose.yml
para editarlo.
$ nano docker-compose.yml
Pega en él el siguiente código.
services: mysql: image: mysql:8.0 container_name: mysql restart: unless-stopped env_file: .env volumes: - db-data:/var/lib/mysql networks: - internal drupal: image: drupal:10-fpm-alpine container_name: drupal depends_on: - mysql restart: unless-stopped networks: - internal - external volumes: - drupal-data:/var/www/html webserver: image: nginx:1.22.1-alpine container_name: webserver depends_on: - drupal restart: unless-stopped ports: - 80:80 volumes: - drupal-data:/var/www/html - ./nginx-conf:/etc/nginx/conf.d - certbot-etc:/etc/letsencrypt networks: - external certbot: depends_on: - webserver image: certbot/certbot container_name: certbot volumes: - certbot-etc:/etc/letsencrypt - drupal-data:/var/www/html command: certonly --webroot --webroot-path=/var/www/html --email sammy@your_domain --agree-tos --no-eff-email --staging -d example.com -d www.example.com networks: external: driver: bridge internal: driver: bridge volumes: drupal-data: db-data: certbot-etc:
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.
Repasemos cada uno de los servicios definidos en el archivo anterior.
Servicio Docker MySQL
Aquí estamos sacando la última imagen mysql:8.0 del hub Docker. Estamos utilizando la versión 8.x en lugar de utilizar la última etiqueta. De esta forma nos ceñimos a la versión estable y probada de MySQL que funciona con Drupal. Hemos establecido un nombre para el contenedor, que puede utilizarse con los comandos Docker para detenerlo, iniciarlo y ver los registros. El contenedor seguirá funcionando a menos que se detenga manualmente. Hemos definido un archivo .env
que rellenaremos con las credenciales de MySQL. También hemos montado un volumen con nombre db-data
en el directorio /var/lib/mysql
del contenedor. El servicio MySQL utilizará una red interna para conectarse con drupal.
Servicio Drupal
Estamos utilizando la imagen Alpine de Drupal 10. Las imágenes docker Alpine son de menor tamaño. Esta imagen también contiene PHP-FPM para gestionar el procesamiento PHP. Esto funcionará junto con Nginx para servir el sitio. La opción depends_on
indica a Drupal que se conecte con el servicio MySQL. También garantiza que el contenedor de Drupal se iniciará siempre después del contenedor de MySQL. Drupal utiliza la red interna para conectarse con MySQL y la red externa para exponerse a otros contenedores. También hemos creado un volumen con nombre para que Drupal apunte al directorio /var/www/html
en el contenedor.
Servicio Nginx
Estamos utilizando una imagen Alpine para Nginx. Expone el puerto 80 al host. Utilizamos dos volúmenes con nombre, uno para el directorio público de Drupal y otro para almacenar los certificados SSL Let’s Encrypt. El tercer volumen está vinculado al directorio de configuración de Nginx en el host, que definiremos más adelante. Nginx también se conecta a una red Docker externa para que funcione el sitio Drupal.
Servicio Certbot
Y por último, tiramos de la imagen Certbot para instalar certificados SSL. Comparte sus volúmenes con el servicio Nginx para los certificados y la definición de webroot. También hemos incluido un comando que se ejecutará cuando se cree el contenedor. Aquí el comando utiliza la bandera --staging
para obtener un servidor de prueba por primera vez. Necesitamos que nginx valide los certificados, pero Nginx no se iniciará si faltan los certificados. Por eso crearemos un certificado de prueba, lo utilizaremos para iniciar Nginx y luego crearemos los certificados reales.
Paso 4 – Crear la configuración de Nginx
Crea el directorio para la configuración de Nginx.
$ mkdir nginx-conf
Crea y abre el archivo para Nginx.
$ nano nginx-conf/drupal.conf
Pega en él el siguiente código.
server { listen 80; listen [::]:80; server_name drupal.example.com; index index.php index.html index.htm; root /var/www/html; location ~ /.well-known/acme-challenge { allow all; root /var/www/html; } location / { try_files $uri $uri/ /index.php$is_args$args; } rewrite ^/core/authorize.php/core/authorize.php(.*)$ /core/authorize.php$1; location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass drupal:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } location ~ /\.ht { deny all; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { log_not_found off; access_log off; allow all; } location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ { expires max; log_not_found off; } }
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.
En este archivo, añadiremos un bloque de servidor con directivas para el nombre de nuestro servidor y la raíz del documento, y bloques de ubicación para dirigir la solicitud del cliente Certbot de certificados, el procesamiento PHP y las solicitudes de activos estáticos. Por ahora, el Nginx sólo escuchará en el puerto 80 para permitir que Certbot solicite el certificado de staging colocando un archivo temporal en el directorio /var/www/html/.well-known/acme-challenge
para validar el DNS. Esto nos permite utilizar Certbot con el plugin de webroot.
Paso 5 – Generar certificados SSL
Para generar los certificados SSL, iniciaremos nuestros contenedores. Los certificados correctos estarán disponibles en la carpeta /etc/letsencrypt/live
del contenedor Nginx.
$ docker compose up -d
Comprueba el estado de los servicios.
$ docker compose ps NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS certbot certbot/certbot "certbot certonly --…" certbot 6 minutes ago Exited (1) 5 minutes ago drupal drupal:10-fpm-alpine "docker-php-entrypoi…" drupal 6 minutes ago Up 6 minutes 9000/tcp mysql mysql:8.0 "docker-entrypoint.s…" mysql 6 minutes ago Up 6 minutes 3306/tcp, 33060/tcp webserver nginx:1.22.1-alpine "/docker-entrypoint.…" webserver 6 minutes ago Up 6 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp
El contenedor Certbot sale correctamente después de generar el certificado. Comprueba la ubicación de los certificados en el contenedor Nginx.
$ docker compose exec webserver ls -la /etc/letsencrypt/live
Obtendrás la siguiente salida.
total 16 drwx------ 3 root root 4096 Jan 17 09:15 . drwxr-xr-x 9 root root 4096 Jan 17 09:15 .. -rw-r--r-- 1 root root 740 Jan 17 09:15 README drwxr-xr-x 2 root root 4096 Jan 17 09:15 drupal.example.com
Esto confirma que todo ha ido bien. El siguiente paso es generar los certificados reales.
Abre el archivo docker-compose.yml
para editarlo.
$ nano docker-compose.yml
Sustituye la bandera --staging
en la sección del servicio Certbot y sustitúyela por la bandera --force-renewal
. Esto indica a Certbot que solicite nuevos certificados para tu dominio. Se utiliza la bandera de renovación porque se utilizará para renovar los certificados de aquí en adelante.
certbot: depends_on: - webserver image: certbot/certbot container_name: certbot volumes: - certbot-etc:/etc/letsencrypt - drupal-data:/var/www/html command: certonly --webroot --webroot-path=/var/www/html --email [email protected] --agree-tos --no-eff-email --staple-ocsp --force-renewal -d drupal.example.com
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.
Ejecuta de nuevo el comando docker compose up
para volver a crear el contenedor de Certbot. La bandera --no-deps
indica a Certbot que no inicie el contenedor webserver
, puesto que ya se está ejecutando.
$ docker compose up --force-recreate --no-deps certbot
Obtendrás la siguiente salida.
[+] Running 1/0 ? Container certbot Recreated 0.1s Attaching to certbot certbot | Saving debug log to /var/log/letsencrypt/letsencrypt.log certbot | Account registered. certbot | Renewing an existing certificate for drupal.example.com certbot | certbot | Successfully received certificate. certbot | Certificate is saved at: /etc/letsencrypt/live/drupal.example.com/fullchain.pem certbot | Key is saved at: /etc/letsencrypt/live/drupal.example.com/privkey.pem certbot | This certificate expires on 2023-04-17. certbot | These files will be updated when the certificate renews. certbot | NEXT STEPS: certbot | - The certificate will need to be renewed before it expires. Certbot can automatically renew the certificate in the background, but you may need to take steps to enable that functionality. See https://certbot.org/renewal-setup for instructions. certbot | certbot | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - certbot | If you like Certbot, please consider supporting our work by: certbot | * Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate certbot | * Donating to EFF: https://eff.org/donate-le certbot | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - certbot exited with code 0
Paso 6 – Configurar Nginx para SSL
Ahora que nuestros certificados están activos, tenemos que configurar Nginx para que los sirva y redirija las peticiones HTTP a HTTPS.
Detén el servidor Nginx.
$ docker stop webserver
Crea un nuevo archivo Nginx para la configuración SSL y ábrelo para editarlo.
$ nano nginx-conf/drupal-ssl.conf
Pega en él el siguiente código.
server { listen 80; listen [::]:80; server_name drupal.example.com; location ~ /.well-known/acme-challenge { allow all; root /var/www/html; } location / { rewrite ^ https://$host$request_uri? permanent; } } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name drupal.example.com; index index.php index.html index.htm; root /var/www/html; server_tokens off; ssl_certificate /etc/letsencrypt/live/drupal.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/drupal.example.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/drupal.example.com/chain.pem; ssl_session_timeout 1d; ssl_session_cache shared:SSL:10m; ssl_session_tickets off; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; ssl_ecdh_curve secp384r1; ssl_dhparam /etc/ssl/certs/dhparam.pem; # OCSP stapling ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; add_header X-Frame-Options "SAMEORIGIN" always; add_header X-XSS-Protection "1; mode=block" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "no-referrer-when-downgrade" always; add_header Content-Security-Policy "default-src * data: 'unsafe-eval' 'unsafe-inline'" always; location / { try_files $uri $uri/ /index.php$is_args$args; } rewrite ^/core/authorize.php/core/authorize.php(.*)$ /core/authorize.php$1; location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass drupal:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } location ~ /\.ht { deny all; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { log_not_found off; access_log off; allow all; } location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ { expires max; log_not_found off; } }
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.
El bloque HTTP especifica la ubicación del plugin webroot de Certbot y redirige cualquier petición HTTP a HTTPS.
El siguiente paso es asegurarse de que el contenedor Nginx escucha el puerto 443. Abre el archivo docker-compose.yml
para editarlo.
$ nano docker-compose.yml
En la sección Nginx del archivo, haz cambios para exponer 443 y habilitar SSL como se muestra a continuación.
webserver: image: nginx:1.22.1-alpine container_name: webserver depends_on: - drupal restart: unless-stopped ports: - 80:80 - 443:443 volumes: - drupal-data:/var/www/html - ./nginx-conf:/etc/nginx/conf.d - certbot-etc:/etc/letsencrypt - /etc/ssl/certs/dhparam.pem:/etc/ssl/certs/dhparam.pem networks: - external
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.
Ahora que hemos habilitado y añadido la configuración SSL para Nginx, puedes eliminar el antiguo archivo de configuración HTTP.
$ rm nginx-conf/drupal.conf
Antes de reiniciar Nginx, necesitamos generar un certificado de grupo Diffie-Hellman que ya hemos configurado anteriormente.
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Vuelve a crear el contenedor Nginx.
$ docker compose up -d --force-recreate --no-deps webserver
Comprueba el estado de los contenedores.
$ docker compose ps NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS certbot certbot/certbot "certbot certonly --…" certbot 3 hours ago Exited (0) 3 hours ago drupal drupal:10-fpm-alpine "docker-php-entrypoi…" drupal 3 hours ago Up 3 hours 9000/tcp mysql mysql:8.0 "docker-entrypoint.s…" mysql 3 hours ago Up 3 hours 3306/tcp, 33060/tcp webserver nginx:1.22.1-alpine "/docker-entrypoint.…" webserver 15 seconds ago Up 13 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp
Paso 7 – Iniciar el Instalador Web de Drupal
Es hora de iniciar el instalador web de Drupal. Abre la URL https://drupal.example.com
en tu navegador y obtendrás la siguiente pantalla.
Haz clic en el botón Guardar y continuar para pasar a la página Perfil de instalación.
Nos ceñiremos al perfil Estándar. Haz clic en el botón Guardar y continuar para pasar a la página de configuración de la base de datos.
Introduce las credenciales de la base de datos que utilizamos en el archivo de entorno, amplía la sección Opciones avanzadas e introduce mysql
como host de la base de datos. Esto coincide con el nombre del servicio MySQL en nuestro archivo Docker compose con el que Drupal necesitará conectarse.
Haz clic en el botón Guardar y continuar para continuar. Drupal empezará a instalar los módulos y temas predeterminados.
A continuación, accederás a la página de configuración de Drupal. Rellena el nombre del sitio, el correo electrónico, el nombre de usuario, la contraseña y la configuración regional. Haz clic en el botón Guardar y continuar cuando hayas terminado.
Por último, accederás al panel de control de Drupal. Ya puedes empezar a utilizar Drupal para crear tu sitio web.
Paso 8 – Configurar Drupal
Este paso es opcional pero ayuda a mejorar el rendimiento de Drupal. El primer paso es establecer el nivel de aislamiento de transacciones de MySQL. El nivel de aislamiento de transacciones por defecto para MySQL, MariaDB y bases de datos equivalentes es «LECTURA REPETIBLE». Esta configuración con Drupal puede provocar bloqueos en las tablas, lo que hará que el sitio se vuelva muy lento o no responda en absoluto. El nivel de aislamiento de transacciones recomendado para los sitios Drupal es «READ COMMITTED».
Accede al shell SSH del contenedor MySQL.
$ docker exec -it mysql bash
Abre el shell de MySQL utilizando el usuario root.
bash-4.4# mysql -u root -p Enter password:
Ejecuta el siguiente comando para cambiar el nivel de transacción globalmente.
mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
Sal del intérprete de comandos MySQL y del contenedor escribiendo exit
dos veces.
El siguiente paso es introducir tu dominio como host de confianza para protegerlo de los ataques HTTP HOST Header. Para ello, necesitamos editar el archivo /var/www/html/sites/default/settings.php
dentro del contenedor Drupal. Dado que estamos utilizando un volumen con nombre para los archivos de Drupal, la forma recomendada de realizar cualquier cambio es copiar el archivo del contenedor al host, realizar la edición y volver a copiarlo en el contenedor. Puedes hacer esto con cualquier archivo que necesites cambiar dentro de la instalación de Drupal.
Copia el archivo de configuración del contenedor al host.
$ docker cp drupal:/var/www/html/sites/default/settings.php settings.php
El archivo está en modo sólo lectura. Dale permisos de escritura.
$ chmod+w settings.php
Abre el archivo para editarlo.
$ nano settings.php
Busca la siguiente sección en el archivo.
#$settings['trusted_host_patterns'] = [ # '^www\.example\.com$', #];
Descoméntala eliminando el signo de almohadilla y añadiendo tu dominio de Drupal como se muestra a continuación.
$settings['trusted_host_patterns'] = [ '^drupal\.example\.com$', ];
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.
Vuelve a quitar los permisos de escritura.
$ chmod -w settings.php
Vuelve a copiar el archivo dentro del contenedor.
$ docker cp settings.php drupal:/var/www/html/sites/default
Paso 9 – Copia de seguridad de Drupal
Utilizaremos la línea de comandos para hacer una copia de seguridad de la base de datos de Drupal. Cambia al directorio de Drupal.
$ cd ~/drupal
Crea el directorio para Copias de Seguridad.
$ mkdir backup-data
Utiliza el siguiente comando para hacer una copia de seguridad de la base de datos de Drupal. Se te pedirá la contraseña de root de MySQL.
$ docker compose exec mysql sh -c "exec mysqldump drupal -uroot -p" | tee backup-data/data_`date +%d-%m-%Y"_"%H_%M_%S`.sql >/dev/null Enter password: root_password
El comando anterior creará la copia de seguridad SQL en el directorio ~/drupal/backup-data
.
Comprueba el contenido del directorio.
$ ls -al backup-data total 6716 drwxrwxr-x 2 navjot navjot 4096 Jan 19 13:59 . drwxrwxr-x 4 navjot navjot 4096 Jan 19 13:35 .. -rw-rw-r-- 1 navjot navjot 6868325 Jan 19 13:37 data_19-01-2023_13_36_58.sql
Puedes ver la base de datos respaldada en el directorio. Puedes restaurar esta base de datos utilizando la herramienta phpMyAdmin o utilizando el siguiente comando.
$ docker compose exec mysql sh -c "exec mysql -uroot -p" < backup-data/data_19-01-2023_13_36_58.sql
Puedes crear una tarea cron para realizar copias de seguridad de la base de datos con regularidad.
Crea el script de copia de seguridad en el directorio /etc/cron.daily
y ábrelo para editarlo.
$ sudo nano /etc/cron.daily/drupalbackup.sh
Pega en él el siguiente código.
#!/bin/bash cd /home/navjot/drupal/ /usr/bin/docker compose exec mysql sh -c "exec mysqldump drupal -uroot -p" | tee backup-data/data_`date +%d-%m-%Y"_"%H_%M_%S`.sql >/dev/null
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.
Haz que el script sea ejecutable.
$ sudo chmod +x /etc/cron.daily/drupalbackup.sh
Ahora, se realizará una copia de seguridad diaria de tu base de datos.
Paso 10 – Actualizar Drupal
El primer paso para actualizar Drupal es hacer una copia de seguridad de la base de datos de Drupal utilizando el comando del paso 9.
A continuación, pasa al directorio
$ cd ~/drupal
Detén los Contenedores.
$ docker compose down
Extrae las últimas imágenes de contenedor.
$ docker compose pull drupal:10-fpm-alpine
Si quieres actualizar a la siguiente versión principal, tendrás que ajustar el nombre de la imagen en consecuencia y revisar las notas de la versión de Drupal para comprobar si hay algún problema.
Haz los cambios que necesites en docker-compose.yml
si quieres. El resto de imágenes puedes actualizarlas cambiando su definición en el archivo Docker compose.
Reinicia los contenedores de Drupal. Esto también sacará las últimas imágenes para versiones menores de otros paquetes.
$ docker compose up -d
Conclusión
Con esto concluye nuestro tutorial sobre la instalación de Drupal utilizando Docker en un servidor Ubuntu 22.04. Si tienes alguna pregunta, publícala en los comentarios a continuación.