De entorno local a Docker: mi primer container

Uno de los primeros virtualhosts que migré realmente fue el de mi wiki (la misma que ya mencioné uso con Grav y funciona bajo el dominio local http://wiki.localhost/).

Siendo que es una instalación super sencilla, tuvo sentido usar esto como el comienzo del experimento. Además, necesitaba que funcione junto con otros proyectos ya que suele ser material de consulta.

Habiendo ya desinstalado todo el stack local, ahora sólo queda Docker.

Para hacer funcionar Grav se necesita poco y nada. Mi docker-compose.yml inicial para este container fue:

version: "3.1"

services:

webserver:
build: .docker/apache/7.3
container_name: wiki
volumes:
- ./:/var/www/html
- ./.docker/apache/virtualhost.conf:/etc/apache2/sites-enabled/000-default.conf
- ./.docker/php/mcrypt.ini:/etc/php/7.3/apache2/conf.d/20-mcrypt.ini
ports:
- "80:80"

El archivo .docker/apache/7.3/Dockerfile, que se encuentra en .docker/apache/7.3, y define la imagen del servidor web, contiene lo siguiente:

FROM php:7.3-apache

RUN apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
software-properties-common \
&& apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y \
libfreetype6-dev \
libicu-dev \
libssl-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libedit-dev \
libedit2 \
libpq-dev \
libxslt1-dev \
libzip-dev \
apt-utils \
gnupg \
git \
vim \
wget \
curl \
lynx \
psmisc \
unzip \
tar \
cron \
bash-completion \
&& apt-get clean

#Install Dependencies
RUN docker-php-ext-configure \
gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/; \
docker-php-ext-install \
opcache \
gd \
bcmath \
intl \
mbstring \
soap \
xsl \
zip

RUN chmod 777 -R /var/www \
&& chown -R www-data:www-data /var/www \
&& usermod -u 1000 www-data \
&& chsh -s /bin/bash www-data

RUN a2enmod rewrite
RUN a2enmod headers

RUN ln -sf /dev/stdout /var/log/apache2/access.log \
&& ln -sf /dev/stderr /var/log/apache2/error.log

Podría mejorarse, pero para lo que quiero hacer ahora va a funcionar.

El siguiente archivo que estoy usando en el compose es .docker/apache/virtualhost.conf. Es el archivo que se mapea para definir las opciones del virtualhost.

<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName wiki.localhost
DocumentRoot /var/www/html
<Directory /var/www/html/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Require all granted
</Directory>
LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Y finalmente algún ajuste para PHP con el archivo .docker/php/mcrypt.ini, para habilitar el módulo. Allí tengo:

extension=mcrypt.so

Ahora si, ejecutamos:

docker-compose up

Cuando termine la creación, mi nuevo stack de un único container estará disponible y voy a poder acceder a http://wiki.localhost/admin:

Si comparo lo que definí aquí con la idea de stack básico, vamos a encontrar que este stack es sólo un container que hace de servidor web.

Como ya habíamos adelantado, si quisiera ahora iniciar otro stack o container que escuche en el puerto 80, comenzarían los problemas.

Para esto, como también ya dejé ver, la solución por la que opté fue la implementación de un Proxy Reverso.