LAMP env para Drupal 9 con Docker

28/01/2021
LAMP env para Drupal 9 con Docker - Docker logo

¿Por qué usar Docker?

Docker permite crear contenedores con microservicios muy fáciles de mantener y de manipular.

Pero no solo esto, Docker permite que un equipo de desarrolladores puedan trabajar en el mismo entorno y mismas versiones de los servicios que ejecutan, sin importar el sistema operativo host que estén utilizando. De esta manera se reducen los errores cuando varias personas están trabajando en un mismo proyecto y en diferentes áreas del mismo.

El entorno

Para montar un entorno Drupal en un sistema de virtualización como Docker se deberá contar con un servidor web y una base de datos. Ambos servicios podrán estar situados en un solo contenedor o en varios contenedores. Hoy en día todo se mueve en la dirección de los microservicios, por lo que para este pequeño proyecto se usarán dos contenedores separando el entorno web de la base de datos.

El árbol de directorios quedaría de esta manera:

Lamp env para Drupal 9 con Docker - Árbol de directorios
Project tree

Vamos a construir el sistema

docker-compose.yml

En este fichero de tipo YAML se definen los siguientes parámetros. Este fichero se posicionará en la raíz del proyecto. A continuación se configuran dos servicios básicos con docker-compose.

version: "3.7" // Versión de docker-compose.
services: // Son los servicios que se van a crear. 
        web: // Nombre del microservicio 1. 
                build: apache // Contenedor a construir (dockerfile Apache).
                links: // Link a la base de datos. 
                        - db // Nombre del microservicio a enlazar.
                ports: // Puertos a mapear [Host]:[Container].
                        - "80:80" // Puerto HTTP. 
                        - "443:443" // Puerto HTTPS (Necesita ssl). 
                volumes: // Volúmenes a crear. 
                        - ./www:/var/www/html // [Directorio]:[Directorio en contenedor] 
        db: // Nombre del microservicio 2. 
                build: mysql // Contenedor a construir (dockerfile Mysql). 
                ports: // Puertos a mapear [Host]:[Container]. 
                        - "3306:3306" // Puerto Base de datos Mysql por defecto.

apache/Dockerfile

FROM php:7.3-apache-stretch          // Imagen con versión de php y apache 

RUN useradd -u 1000 -m user      // Añadir usuario con uid 1000 
RUN apt-get update                      // Actualizar paquetes 
RUN apt-get install -y \                  // Instalar paquetes deseados 

#Utilidades para el contenedor 
git \ 
wget \ 
vim \ 
#Conexión con base de datos 
mysql-client \ 
#Librerías para linux 
libpng-dev \ 
libmcrypt-dev \ 
libicu-dev \ 
pecl install mcrypt-1.0.2 && \ 
apt-get install -y libmagickwand-dev --no-install-recommends && \ 

#Extensiones php necesarias para CMS 
docker-php-ext-install mbstring && \ 
docker-php-ext-install pdo_mysql && \ 
docker-php-ext-install mysqli && \ 
docker-php-ext-enable mcrypt && \ 
docker-php-ext-install opcache && \ 
docker-php-ext-install pcntl && \
docker-php-ext-install intl && \ 
docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ && \ docker-php-ext-install gd && \ 
pecl install imagick && \ 
docker-php-ext-enable imagick && \ 
rm -r /var/lib/apt/lists/* && \ 

#Composer para gestión de dependencias 
curl -sS https://getcomposer.org/installer | php && \ 
mv composer.phar /usr/bin/composer && \ 

#Habilitar módulos php 
a2enmod rewrite && \ 
a2enmod ssl && \ 
a2ensite default-ssl && \ 
curl -sL https://deb.nodesource.com/setup_12.x | bash - 

#Habilitar SSL para conexión HTTPS 
RUN apt-get install nodejs -y && \ 
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/ssl-cert-user.key -out /etc/ssl/certs/ssl-cert-user.pem -subj '/' 

#Se añaden los templates a sus respectivos directorios en el contenedor 
ADD templates/apache2.conf /etc/apache2/ 
ADD templates/php.ini /usr/local/etc/php/ 
ADD templates/xdebug.ini /usr/local/etc/php/conf.d/

apache/templates/apache2.conf

En el siguiente enlace, se puede encontrar configuraciones de apache para el sistema debian: https://sources.debian.org/src/apache2/2.4.10-10/debian/config-dir/apac…

apache/templates/php.ini

[php] 
register_globals = off 
display_errors = On 
error_reporting = E_ALL | E_STRICT 
log_errors = On 
error_log = /var/log/php_errors.log 
date.timezone="Europe/London" 
upload_max_filesize=64M 
post_max_size=64M 
memory_limit=1024M

mysql/Dockerfile

FROM mysql:5.7 
ENV MYSQL_ROOT_PASSWORD Qwerty_1234
ADD templates/custom_config.cnf /etc/mysql/conf.d/

mysql/templates/custom_config.cnf

[mysqld]

// mysql daemon
max_allowed_packet=128M 
default-storage-engine=InnoDB 
collation-server = utf8mb4_unicode_ci 
init-connect='SET NAMES utf8mb4' 
character-set-server = utf8mb4 
skip-character-set-client-handshake 

[client] 
default-character-set = utf8mb4 

[mysql] 
default-character-set = utf8mb4

scripts/drupal9.sh

#!/bin/bash 
# Directories
parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) 
cd "$parent_path" 

# Apache 
docker-compose exec web sh -c "sed -i -e 's/www\/html/www\/html\/web/g' /etc/apache2/sites-enabled/000-default.conf" 
docker-compose exec web sh -c "sed -i -e 's/www\/html/www\/html\/web/g' /etc/apache2/sites-enabled/default-ssl.conf" 
rm -rf ../www; 

# Drupal 9 with Composer 
cd .. && COMPOSER_MEMORY_LIMIT=-1 composer create-project 
drupal-composer/drupal-project:9.x-dev www 
./stop.sh 
./start.sh 

#Drush and database
docker-compose exec --user=1000:1000 web sh -c 'vendor/bin/drush si standard --db-url=mysql://root:Qwerty_1234@db/drupal9 -y' 
docker-compose exec web sh -c "ln -s /var/www/html/vendor/bin/drush /usr/local/bin/drush"

¡Empecemos!

Para comenzar a montar los contenedores se ejecutará el script de docker-compose up que se ha creado en la raíz del documento. La creación de estos scripts se han hecho
debido a que estos comandos van a ser muy usados.

$ docker-compose up -d

El output de este comando será muy extenso, pero deberá acabar de la siguiente manera:

Lamp env para Drupal 9 con Docker - docker-compose up output
Building containers

Ahora si vemos los contenedores que están activos, se deberán mostrar dos. Uno para la parte web y otro para la base de datos:

$ docker ps
Lamp env para Drupal 9 con Docker - docker ps output
Docker ps

Una vez que tenemos los dos contenedores activos, será hora de ejecutar el script para la instalación de Drupal 9 con composer y drush.

$ ./scripts/drupal9.sh

Containers

- web
        - usuario: docker-compose exec --user=1000:1000 web bash
        - root: docker exec -it [container_web] bash

- mysql 
        - root: docker exec -it [container_db] bash