Añadir SSL (https) usando contenedor Docker (cerbot) Let’s Encrypt con Apache o Nginx con tu dominio o subdominio

Tiempo de lectura: 3 minutos

Continuando con los tutoriales sobre Docker (https://devcodelight.com/category/docker) y partiendo del último post Crear un contenedor Docker Compose con Apache + PHP + MySQL (XAMP con Docker)

Podemos añadir un contenedor Docker que nos sirva para añadir SSL usando cerbot (https://hub.docker.com/r/certbot/certbot/) qué además es compatible con Apache o Nginx (contenedor independiente).

Vale para tu dominio o subdominio.

La teoría es qué este contenedor necesita disponer de un servicio Apache o Nginx sin SSL (http) para poder hacer la comprobación inicial (intercambio de claves para identificar el dominio) y una vez descargados los certificados, estos se guardan en una carpeta que podemos enlazar con Docker Compose.

Partimos de (docker-compose.yml):

version: "3"
#Indicamos la version docker compose que utilizamos
#Y luego los servicios que vamos a implementar
services:
  contendor_mysql:
    image: mysql:5.7
    container_name: mysql-container
    environment:
        MYSQL_DATABASE: db
          # Puedes utilizar el usuario que quieras, en el ejemplo usamos test
        MYSQL_USER: test
          # Contraseña para el usuario de MySQL
        MYSQL_PASSWORD: testp
          # Contraseña para root
        MYSQL_ROOT_PASSWORD: root
    volumes:
      # Montamos un volumen para MySQL para no perder los datos de bd
      - ./mysql:/var/lib/mysql
    expose:
      - 3306
    ports:
      - 3306:3306
#Aquí indicamos el nombre que queramos
  mi_servicio_apache:
    #Indicamos la carpeta donde guardamos el Docker File
    build: 
      context: ./Dockerfile
      #Indicamos el archivo dockerfile de este contenedor
      dockerfile: apache_file
    #Eliminamos esta línea que se sustituye por el dockerfile
    #image: php:7.0-apache
    container_name: apache-container
    volumes:
      #Carpeta donde guardaremos los archivos web : carpeta interna de Docker
      - ./www/:/var/www/html
    expose:
      #Puerto que queremos exponer a para poder compartirlo con otros contenedores
      - 80
    ports:
      # Puerto de nuestra máquina : puerto dentro de Docker (siempre va a ser el 80 para apache o 443 para SSL)
      - 80:80
    links: 
      - contendor_mysql
  contenedor_phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin-container
    ports:
     - 776:80
    links: 
      - contendor_mysql:db

Ahora vamos a añadir el contenedor cerbot/cerbot al archivo.

  certbot:
    image: certbot/certbot
    container_name: certbot
    volumes:
      - ./certs:/etc/letsencrypt/archive
      - ./www/:/var/www/html
    depends_on:
      - mi_servicio_apache
    command: certonly --webroot --webroot-path=/var/www/html --email contact@tudominio.com --agree-tos --no-eff-email --staging -d tudominio.com
    #command: certonly --webroot --webroot-path=/var/www/html --email contact@tudominio.com --agree-tos --no-eff-email  -d www.tudominio.com -d tudominio.com
    #command:  renew --webroot --webroot-path=/var/www/html --no-self-upgrade

Voy a explicar la construcción de esta imagen:

  • Se utiliza la imagen de cerbot qué he indicado anteriormente
image: certbot/certbot
  • Monto los volúmenes para acceder al certificado desde fuera de Docker y acceder al directorio de la web de Apache o Nginx (www) desde el contenedor cerbot:
volumes:
  - ./certs:/etc/letsencrypt/archive
  - ./www/:/var/www/html
  • Se crea la dependencia con el contenedor de Apache para que no se cree este contenedor si no está listo el contenedor Apache ya que se necesita para descargar los certificados:
depends_on:
  - mi_servicio_apache

Y ahora hay 3 comandos, qué he añadido, dos de ellos están comentados.

Voy a explicar qué hace cada uno:

  • Con el primer comando creamos el certificado de prueba (staging) para que el servidor de let’s encrypt no nos bloqueé la generación de certificados y podamos probar. Cuando generamos este certificado, el navegador nos avisa de que no es seguro porque es de prueba (stagging). Se le pasan los parámetros –email para indicar nuestro e-mail dónde nos va a avisar cuándo los certificados caducan y con el parámetro -d indicamos el dominio al que queremos generar el certificado. Es importante que este dominio apunte a nuestra máquina en dirección IP si no nos dará error.

command: certonly --webroot --webroot-path=/var/www/html --email contact@tudominio.com --agree-tos --no-eff-email --staging -d tudominio.com

  • El siguiente comando nos genera el certificado, pero de forma final (cuidado con esto, ya que si lo generamos varias veces, nos va a bloquear unas horas hasta volver a poder generar uno de nuevo).

    command: certonly --webroot --webroot-path=/var/www/html --email contact@tudominio.com --agree-tos --no-eff-email -d www.tudominio.com -d tudominio.com
  • Y el último comando es para renovar el certificado.
    command: renew --webroot --webroot-path=/var/www/html --no-self-upgrade

Con todo esto ya tenemos nuestro contenedor Docker Compose con SSL y compatible con Apache o Nginx.

Os dejo el código en GitHub para qué podáis descargarlo: https://github.com/IsMMA/devcodelight_docker/tree/version_5

Deja un comentario