LAMP env para Drupal 9 con Docker
¿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:
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:
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
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