Servidor nginx con SSL en un paso con Docker

Para los que aún no habéis comenzado a utilizar Docker, os recomiendo revisar la guía oficial Understanding Docker, así como el manual de instalación.

Docker allows you to package an application with all of its dependencies into a standardized unit for software development.

Si todo está apunto en tu entorno, podrás ejecutar sin problema comandos como docker version, obteniendo algo similar a esto:

1
2
3
4
5
6
7
8
9
10
11
$ docker version
Client version: 1.7.1
Client API version: 1.19
Go version (client): go1.4.2
Git commit (client): 786b29d
OS/Arch (client): linux/amd64
Server version: 1.7.1
Server API version: 1.19
Go version (server): go1.4.2
Git commit (server): 786b29d
OS/Arch (server): linux/amd64

Servidor HTTP básico

nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP proxy server

Como paso inicial, si queremos levantar un contenedor que corra el servicio HTTP de nginx, sólo tenemos que crear un fichero de configuración y especificar allí los detalles de nuestro virtualhost (por ejemplo en el fichero sample.conf):

1
2
3
4
server {
listen 80;
server_name tunombrededominio.com;
}

Esta es toda la configuración que tenemos que hacer!! Sólo queda pues, arrancar el contenedor con docker run:

1
2
3
4
docker run -p 80:80 \
-v /var/www/html:/usr/share/nginx/html \
-v $PWD/sample.conf:/etc/nginx/conf.d/sample.conf \
-d nginx

Hay que tener en cuenta que con la opción -p, mapeamos el puerto 80 del contender al 80 local y con los -v permitimos que ciertos directorios/ficheros locales se mapeen internamente a las rutas correspondientes en el contenedor. Finalmente, el -d lanza nuestro proceso como daemon, es decir, en segundo plano.

Configuración SSL

Antes de activar la configuración SSL en nginx, necesitamos contar con un certificado/key SSL para nuestro servidor (server.key y server.pem).

A partir de septiembre, podremos contar con certificados gratuitos gracias a Let’s Encrypt.

Para poder utilizarlos, copiaremos ambos ficheros en el directorio certs, alterando posteriormente la configuración del virtualhost:

1
2
3
4
5
6
7
server {
listen 80;
listen 443 ssl;
server_name tunombrededominio.com;
ssl_certificate /certs/server.pem;
ssl_certificate_key /certs/server.key;
}

Como en el ejemplo anterior, ya sólo nos queda lanzar de nuevo el contenedor y tendremos el servicio activo (recuerda matar el anterior con docker kill <id contenedor>:

1
2
3
4
5
docker run -p 80:80 -p 443:443 \
-v /var/www/html:/usr/share/nginx/html \
-v $PWD/sample.conf:/etc/nginx/conf.d/sample.conf \
-v $PWD/certs:/certs \
-d nginx

Como podemos ver en el comando anterior, al tener el SSL activo, tendremos que redireccionar también el puerto 443 y compartir igualmente el directorio de certificados para poderlo referenciar sin problema en la configuración.