Recientemente cambié mi servidor virtual y tuve que configurarlo todo de nuevo. Prefiero que el sitio esté disponible por https y que los certificados de letsencrypt se obtengan y renueven automáticamente. Esto se puede lograr usando dos imágenes de docker: nginx-proxy y nginx-proxy-companion.
Esta es una guía sobre cómo configurar un sitio en docker, con un proxy que obtiene automáticamente Certificados SSL. Se utiliza un servidor virtual CentOS 7.
Supongo que el servidor ya está comprado, configurado, se accede a él con clave, se ha instalado fail2ban, etc.
Para comenzar, es necesario instalar docker.
- Primero, se deben instalar las dependencias
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2 - Conectar el repositorio
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo - Luego, instalar la edición comunitaria de docker
$ sudo yum install docker-ce docker-ce-cli containerd.io - Añadir docker al inicio automático y arrancar
$ sudo systemctl enable docker $ sudo systemctl start docker - Añadir usuario al grupo docker, para poder ejecutar docker sin sudo
$ usermod -aG docker user
El siguiente paso es instalar docker-compose. Se puede instalar de varias maneras, pero prefiero instalarlo a través del gestor pip y virtualenv, para no llenar el sistema con paquetes innecesarios.
- Instalar pip
$ sudo yum install python-pip - Instalar virtualenv
$ pip install virtualenv - A continuación, es necesario crear una carpeta para el proyecto e inicializarla. La carpeta con todo lo necesario para manejar los paquetes se llamará ve.
$ mkdir docker $ cd docker $ virtualenv ve - Para comenzar a usar el entorno virtual, se debe ejecutar el siguiente comando en la carpeta del proyecto.
$ source ve/bin/activate - Se puede instalar docker-compose.
pip install docker-composePara que los contenedores se vean entre sí, crearemos una red. Se utiliza el controlador bridge por defecto.
$ docker network create networkA continuación, se debe configurar docker-compose, el proxy estará en la carpeta proxy, y el sitio de prueba en la carpeta test. Para este ejemplo, usaré el nombre de dominio example.com
$ mkdir proxy $ mkdir test $ touch proxy/docker-compose.yml $ touch test/docker-compose.ymlContenido proxy/docker-compose.yml
versión: '3' redes: predeterminado: externo: nombre: red servicios: nginx-proxy: nombre_del_contenedor: nginx-proxy imagen: jwilder/nginx-proxy puertos: - 80:80 - 443:443 volúmenes: - certs:/etc/nginx/certs - vhost.d:/etc/nginx/vhost.d - html:/usr/share/nginx/html - /var/run/docker.sock:/tmp/docker.sock:ro nginx-proxy-letsencrypt: nombre_del_contenedor: nginx-proxy-letsencrypt imagen: jrcs/letsencrypt-nginx-proxy-companion volúmenes: - certs:/etc/nginx/certs - vhost.d:/etc/nginx/vhost.d - html:/usr/share/nginx/html - /var/run/docker.sock:/var/run/docker.sock:ro entorno: - NGINX_PROXY_CONTAINER=nginx-proxy volúmenes: certs: vhost.d: html:Variable de entorno NGINX_PROXY_CONTAINER es necesaria para que el contenedor letsencrypt vea el contenedor proxy. Las carpetas /etc/nginx/certs, /etc/nginx/vhost.d y /usr/share/nginx/html deben ser compartidas por ambos contenedores. Para que el contenedor letsencrypt funcione correctamente, la aplicación debe estar disponible tanto en el puerto 80 como en el 443.
Contenido test/docker-compose.yml
versión: '3' redes: predeterminado: externo: nombre: red servicios: nginx: nombre_del_contenedor: nginx imagen: nginx:latest entorno: - VIRTUAL_HOST=example.com - LETSENCRYPT_HOST=example.com - LETSENCRYPT_EMAIL=admin@example.comAquí las variables de entorno son necesarias para que el proxy procese correctamente la solicitud al servidor y solicite el certificado en el nombre de dominio correcto.
Solo queda iniciar docker-compose
$ cd proxy $ docker-compose up -d $ cd ../test $ docker-compose up -d
Fuente: habr.com
