Nginx con Docker y SSL automático

Tiempo de lectura: 2 minutos

Como primer post, contaré como he configurado mi docker para que los contenedores tenga su propia url con ssl de manerá automática. Usaremos acme-companion.

En primera instancia, tendremos que asegurarnos que tenemos docker instalado en nuestra máquina.

docker --version

Tras eso, instanciaremos nuestro nginx-proxy, que será el encargado de hacer las redirecciones a nuestros contenedores.

docker run --detach \
    --name nginx-proxy \
    --publish 80:80 \
    --publish 443:443 \
    --volume certs:/etc/nginx/certs \
    --volume vhost:/etc/nginx/vhost.d \
    --volume html:/usr/share/nginx/html \
    --volume /var/run/docker.sock:/tmp/docker.sock:ro \
    --volume /var/run/docker/my_custom_proxy_settings.conf:/etc/nginx/conf.d/my_custom_proxy_settings.conf
    nginxproxy/nginx-proxy

El siguiente paso, será instanciar un contenedor de
nginx-proxy-acme, se encargará de generar «automágicamente» los certificados ssl.

docker run --detach \
    --name nginx-proxy-acme \
    --volumes-from nginx-proxy \
    --volume /var/run/docker.sock:/var/run/docker.sock:ro \
    --volume acme:/etc/acme.sh \
    --env "DEFAULT_EMAIL=mail@yourdomain.tld" \
    nginxproxy/acme-companion

También podremos usar esto en su versión compose:

version: '2'

services:
  nginx-proxy:
    image: nginxproxy/nginx-proxy
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - conf:/etc/nginx/conf.d
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - certs:/etc/nginx/certs:ro
      - /var/run/docker.sock:/tmp/docker.sock:ro
    network_mode: bridge

  acme-companion:
    image: nginxproxy/acme-companion
    container_name: nginx-proxy-acme
    environment:
      - DEFAULT_EMAIL=mail@yourdomain.tld
    volumes_from:
      - nginx-proxy
    volumes:
      - certs:/etc/nginx/certs:rw
      - acme:/etc/acme.sh
      - /var/run/docker.sock:/var/run/docker.sock:ro
    network_mode: bridge

volumes:
  conf:
  vhost:
  html:
  certs:
  acme:

Con esto, y añadiendo unas variables de entorno a nuestro contenedores, se generaran de manera automática los certificados. Esta variables de entorno son:

"VIRTUAL_HOST=othersubdomain.yourdomain.tld"
"VIRTUAL_PORT=3000"
"LETSENCRYPT_HOST=othersubdomain.yourdomain.tld" 
"LETSENCRYPT_EMAIL=mail@yourdomain.tld"


Tendremos que dar de alta el dominio o subdominio en nuestro proveedor.

Insertar registro dns.
Insertar registro dns.

Para ejemplificar instanciaremos un contenedor de Portainer, que además nos dará paso a otro nuevo post. Antes de hacer esto, comprobaremos en DNSChecker que nuestra propagación esté disponible.

docker run -d --expose 9000 -p "9001:9000" \
--env "VIRTUAL_HOST=portainer.yourdomain.tld" \
--env "VIRTUAL_PORT=9000" \
--env "LETSENCRYPT_HOST=portainer.yourdomain.tld" \
--env "LETSENCRYPT_EMAIL=info@yourdomain.tld" \ --name portainer --restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data portainer/portainer-ce:latest

Y listo, si accedieramos a portainer.yourdomain.tld, llegaríamos hasta nuestro despliegue de portainer.

*Si nos diera error tendríamos que relanzar nuestros contenedores de nginx-proxy y nginx-proxy-acme.

Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio está protegido por reCAPTCHA y se aplican la política de privacidad y los términos de servicio de Google.