Hace tiempo que vengo mirando la tecnología de contenedores con interés, la verdad es que desde hace mucho tiempo el trabajo más ingrato, después de haber terminado un desarrollo, era configurar el servidor donde se iba a ejecutar finalmente. No basta con saber el sistema operativo, necesitas instalar una miriada de dependecias y de versiones de software que no siempre se encuentra en la versión que usaste para el desarrollo. Docker promete poder replicar entornos completos mediante una virtualización parcial y eso me parece muy, muy interesante.
Aunque no entraré al análisis profundo de cómo funciona docker, por el momento, si que veremos un ejemplo práctico de una tarea muy habitual como administrador de sistemas, configurar un servidor de correo con todos los servicios habituales. Para ello vamos a utilizar una máquina virtual (no sirve cualquiera, hay sistemas de virtualización que no se llevan bien con docker, en mi caso usé un VPS de OVH después de desechar otros dos de strato y webserver4you). Nuestra máquina virtual tiene un ubuntu 14.04… Al lío.
Lo primero que hay que hacer es instalar docker. Por suerte esto es bastante sencillo:
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" | sudo tee /etc/apt/sources.list.d/docker.list sudo apt-get update sudo apt-get install apt-transport-https ca-certificates sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual sudo apt-get install docker-engine
Con esto ya tendremos docker en la máquina. Podemos probarlo:
sudo service docker start sudo docker run hello-world
Si no queremos andar usando sudo para cada comando, añadiremos nuestro usuario al grupo de docker:
sudo groupadd docker sudo usermod -aG docker $USER
Ahora usaremos Poste.io como contenedor de nuestro servidor de correo. Es una solución simplemente completa y muy sencilla de instalar y configurar. En nuestro caso lo único que hay que hacer para ponerlo a funcionar es crear un directorio (en mi caso /home/mail/data) y ejecutar lo siguiente:
docker run \ -p 25:25 \ -p 81:80 \ -p 110:110 \ -p 143:143 \ -p 8443:443 \ -p 465:465 \ -p 587:587 \ -p 993:993 \ -p 995:995 \ -v /etc/localtime:/etc/localtime:ro \ -v /home/mail/data:/data \ -e "HTTPS=OFF" \ --name "mailserver" \ --restart=always \ -t analogic/poste.io
Lo más relevante en este caso es que NO queremos las redirecciones https porque vamos a configurar el servidor apache que ya tenemos para que actúe de proxy y será él quien tenga el https y los certificados y que el puerto que exponemos para la administración es el puerto 81 (redirigido al puerto 80 del contenedor).
Para que sea accesible desde el exterior por https lo que hicimos fue configurar un virtualhost en apache de esta manera:
<VirtualHost *:80> ServerName mail.midominio.es AssignUserId mailuser mailuser ServerAdmin [email protected] DocumentRoot /home/mailuser/www ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined <Directory /home/mailuser/www> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> ProxyPass / http://localhost:81/ RewriteEngine on RewriteCond %{SERVER_NAME} =mail.midominio.es RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent] </VirtualHost>
La configuración del https es similar, aunque yo dejé que el certbot de let’s encrypt me lo configurase automáticamente al generar los certificados, quedó una cosa como esta:
<IfModule mod_ssl.c> <VirtualHost *:443> ServerName mail.midominio.es AssignUserId mailuser mailuser ServerAdmin [email protected] DocumentRoot /home/mailuser/www ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined <Directory /home/mailuser/www> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> ProxyPass / http://localhost:81/ SSLCertificateFile /etc/letsencrypt/live/mail.midominio.es/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/mail.midominio.es/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateChainFile /etc/letsencrypt/live/mail.midominio.es/chain.pem </VirtualHost> </IfModule>
Si todo ha ido bien (seguro que algún detalle se nos pasa), tendremos el contenedor funcionando y podremos acceder al administrador de esta manera:
https://mail.midominio.es/admin/
Y, después de verificar la identidad y hacer los primeros ajustes de dominio, cuentas y demás podremos disfrutar de nuestro servidor de correo…