Saltar al contenido

Cómo utilizar Traefik como un proxy inverso para acoplable Contenedores en Ubuntu 18.04

marzo 4, 2020

 

El autor ha seleccionado niñas código de la OMS para recibir una donación como parte del programa de escritura de donaciones.

Introducción

acoplable puede ser una manera eficaz para ejecutar aplicaciones web en la producción, pero es posible que desee ejecutar varias aplicaciones en el mismo host del estibador. En esta situación, tendrá que configurar un proxy inverso, ya que sólo desea exponer los puertos 80 y 443 para el resto del mundo.

Traefik es un proxy inverso acoplable-consciente de que incluye su propia guía de seguimiento. En este tutorial, vamos a usar Traefik a las peticiones de ruta a dos contenedores de aplicaciones web diferentes: un recipiente de WordPress y un contenedor Adminer, cada uno hablando a una base de datos MySQL. Configurará Traefik para servir todo a través de HTTPS utilizando Cifrar Vamos.

Requisitos previos

Para continuar con este tutorial, necesitará lo siguiente:

  • Una Ubuntu 18.04 servidor configurado siguiendo la guía de configuración inicial del servidor de Ubuntu 18.04, incluyendo un usuario no root sudo y un firewall.
  • acoplable instalado en el servidor, lo que se puede hacer siguiendo Cómo instalar y utilizar estibador en Ubuntu 18.04.
  • acoplable Componer instala con las instrucciones de cómo instalar acoplable Componer en Ubuntu 18.04.
  • dominio A y tres registros A, db-admin, el blog y el monitor, que cada punto a la dirección IP de su servidor. Usted puede aprender cómo apuntar dominios a digitalocean Las gotitas mediante la lectura a través de documentación Dominios y DNS de digitalocean. A lo largo de este tutorial, el sustituto de su dominio para your_domain en los archivos de configuración y ejemplos.

Paso 1 – Configuración y ejecución del proyecto Traefik

El Traefik tiene una imagen oficial del estibador, por lo que vamos a utilizar para ejecutar Traefik en un recipiente estibador.

Pero antes de llegar nuestro contenedor Traefik en marcha y funcionando, tenemos que crear un archivo de configuración y configurar una contraseña cifrada para que podamos acceder al panel de monitoreo.

Usaremos la utilidad htpasswd para crear esta contraseña cifrada. En primer lugar, instalar la utilidad, que se incluye en el paquete apache2-utils:

sudo apt-get install apache2-utils

  • sudo apt-get install apache2-utils

luego generar la contraseña con htpasswd. secure_password sustituto con la contraseña que le gustaría utilizar para el usuario admin Traefik:

htpasswd -nb admin secure_password

  • htpasswd -nb administrador secure_password

La salida del programa será el siguiente aspecto:

Outputadmin:$apr1$ruca84Hq$mbjdMZBAG.KWn7vfN/SNK/

que va a utilizar esta salida en el Traefik fichero de configuración para configurar la autenticación básica HTTP para la comprobación del estado y la supervisión Traefik salpicadero. Copiar toda la línea de salida para que pueda pegarlo más tarde.

Para configurar el servidor Traefik, vamos a crear un nuevo archivo de configuración llamado traefik.toml utilizando el formato TOML. TOML es un lenguaje de configuración similar a los archivos INI, pero estandarizada. Este archivo nos permite configurar el servidor Traefik y varias integraciones o proveedores , que desea utilizar. En este tutorial, vamos a utilizar tres de los proveedores disponibles de Traefik : API, estibador, y la cumbre, que se utiliza para cifrar utilizando TLS apoyo de Let.

Abra su archivo nuevo en nano o su editor de texto favorito:

nano traefik.toml

  • nano traefik.toml

En primer lugar, añadir dos puntos de entrada con nombre, HTTP y HTTPS, que todos los backends tendrán acceso a por defecto:

defaultEntryPoints = ["http", "https"]

Vamos a configurar los puntos de entrada HTTP y HTTPS más adelante en este archivo.

A continuación, configure el proveedor de API, que le da acceso a una interfaz de tablero de instrumentos. Este es el lugar donde pegar la salida del comando htpasswd:

...
[entryPoints]
[entryPoints.dashboard]
address = ":8080"
[entryPoints.dashboard.auth]
[entryPoints.dashboard.auth.basic]
users = ["admin:your_encrypted_password"]

[api]
entrypoint="dashboard"

El tablero de instrumentos es una aplicación web independiente que se ejecutará dentro del contenedor Traefik. Hemos establecido el tablero de instrumentos para ejecutar en el puerto 8080.

La sección entrypoints.dashboard configura la forma en que estaremos conectando con el proveedor con el API, y la sección configura entrypoints.dashboard.auth.basic autenticación básica HTTP para el salpicadero. Utilice la salida del comando htpasswd se acaba de ejecutar para el valor de la entrada a los usuarios. Podría especificar nombres de usuario adicionales separándolas por comas.

hemos definido nuestro primer punto de entrada, pero tendremos que definir otros para el estándar HTTP y HTTPS Communitcation que no se dirige hacia el proveedor de API. La sección de puntos de entrada configura las direcciones que Traefik y los contenedores pasan por el proxy pueden escuchar. Añadir estas líneas al archivo debajo de los puntos de entrada de partida:

...
[entryPoints.http]
address = ":80"
[entryPoints.http.redirect]
entryPoint = "https"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
...

La entrada del puerto http tiradores de punto 80, mientras que la entrada https usos coloque el puerto 443 para TLS / SSL. Redirigimos automáticamente todo el tráfico en el puerto 80 a la https punto de entrada para forzar conexiones seguras para todas las solicitudes.

A continuación, añadir esta sección para configurar el soporte certificado Cifrar Vamos a Traefik:

...
[acme]
email = "[email protected]_domain"
storage = "acme.json"
entryPoint = "https"
onHostRule = true
[acme.httpChallenge]
entryPoint = "http"

Esta sección se llama Acme porque ACME es el nombre del protocolo utilizado para comunicarse con Cifrar Vamos a gestionar certificados. Cifrar el servicio de Let requiere registrarse con una dirección de correo electrónico válida, por lo que a fin de tener Traefik generar certificados para nuestros anfitriones, establezca la clave de correo electrónico a su dirección de correo electrónico. a continuación, se especifica que vamos a almacenar la información que vamos a recibir de Cifrar Vamos en un archivo JSON llamada acme.json. Las necesidades clave EntryPoint a punto hasta el puerto de manipulación punto de entrada 443, que en nuestro caso es el punto de entrada https.

Los dictados onHostRule clave de cómo Traefik debe ir sobre la generación de certificados. Queremos a buscar nuestros certificados tan pronto como se crean los contenedores con los nombres de host especificados, y eso es lo que el ajuste onHostRule haremos. La sección

acme.httpChallenge nos permite especificar cómo cifrar Vamos puede verificar que el certificado debe ser generada. Estamos configurándolo para servir a un archivo como parte del desafío a través del punto de entrada http.

Por último, vamos a configurar el proveedor ventana acoplable mediante la adición de estas líneas al archivo:

...
[docker]
domain = "your_domain"
watch = true
network = "web"

El proveedor de cargador de muelle permite Traefik para actuar como un proxy delante de los contenedores acoplables. Hemos configurado el proveedor de ver para los nuevos contenedores en la red Web (que crearemos en breve) y exponerlos como subdominios de your_domain.

En este punto, traefik.toml debe tener el siguiente contenido:

defaultEntryPoints = ["http", "https"]

[entryPoints]
[entryPoints.dashboard]
address = ":8080"
[entryPoints.dashboard.auth]
[entryPoints.dashboard.auth.basic]
users = ["admin:your_encrypted_password"]
[entryPoints.http]
address = ":80"
[entryPoints.http.redirect]
entryPoint = "https"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]

[api]
entrypoint="dashboard"

[acme]
email = "[email protected]_domain"
storage = "acme.json"
entryPoint = "https"
onHostRule = true
[acme.httpChallenge]
entryPoint = "http"

[docker]
domain = "your_domain"
watch = true
network = "web"

Guarde el archivo y salga del editor. Con toda esta configuración en su lugar, podemos encender Traefik.

Paso 2 – Ejecución de la Traefik Container

A continuación, crear una red acoplable para el proxy para compartir con los contenedores. La red acoplable es necesaria para que podamos utilizarlo con aplicaciones que se ejecutan utilizando acoplable Componer. Vamos a llamar a esta web en la red. red ventana acoplable

docker network create web

  • crear Web

Cuando se inicia el contenedor Traefik, lo añadiremos a esta red. Entonces podemos añadir contenedores adicionales a esta red después de Traefik de proxy para.

A continuación, cree un archivo vacío que contendrá la información de cifrado de nuestra Let. Vamos a compartir esto en el recipiente de manera Traefik puede usarlo:

touch acme.json

  • toque acme.json

Traefik sólo será capaz de utilizar este archivo si el usuario root en el interior del recipiente tiene lectura única y el acceso de escritura a ella . Para ello, bloqueo hacia abajo los permisos en acme.json modo que sólo el propietario del archivo ha leído y permiso de escritura.

chmod 600 acme.json

  • chmod 600 acme.json

vez que el archivo se pasa a estibador, el propietario va a cambiar automáticamente a la raíz usuario dentro del contenedor.

Por último, cree el contenedor Traefik con este comando:

docker run -d
-v /var/run/docker.sock:/var/run/docker.sock
-v $PWDraefik.toml:raefik.toml
-v $PWD/acme.json:/acme.json
-p 80:80
-p 443:443
-l traefik.frontend.rule=Host:monitor.your_domain
-l traefik.port=8080
--network web
--name traefik
traefik:1.7.2-alpine

  • ventana acoplable ejecutar -d
  • -v /var/run/docker.sock:/var/run/docker.sock
  • -v $ PWD / traefik.toml: raefik.toml
  • -v $ PWD / acme.json: /acme.json 80:80
  • -p 443
  • -p: 443 traefik.frontend.rule
  • -l = Host: monitor.your_domain
  • -l traefik.port = 8080
  • –network web
  • –name traefik
  • traefik: 1.7.2-alpino

El comando es un poco largo, así vamos a romper hacia abajo.

Utilizamos la opción -d para ejecutar el recipiente en el fondo como un demonio. Hagamos, pues, nuestro archivo docker.sock en el recipiente de manera que el proceso Traefik puede escuchar los cambios a los contenedores. También compartimos el archivo de configuración y el archivo traefik.toml acme.json que hemos creado en el contenedor.

A continuación, asigne los puertos: 80 y: 443 de nuestro anfitrión acoplable a los mismos puertos en el contenedor de modo Traefik Traefik recibe todo el tráfico HTTP y HTTPS al servidor.

Luego creó dos etiquetas que indican a Docker Traefik para dirigir el tráfico a la monitor.your_domain nombre de host al puerto: 8080 dentro del contenedor Traefik, exponiendo el tablero de instrumentos de monitoreo.

Hemos establecido la red del recipiente para web, y que el nombre del traefik contenedor.

Por último, utilizamos el traefik: Imagen 1.7.2-alpino para este contenedor, porque es pequeño. Punto de entrada de la imagen

Un estibador es un comando que siempre se ejecuta cuando se crea un contenedor de la imagen. En este caso, el comando es el binario traefik dentro del contenedor. Puede pasar argumentos adicionales a ese comando al iniciar el contenedor, pero hemos configurado todos los valores en el archivo traefik.toml.

Con el recipiente comenzado, ahora tiene un panel de control se puede acceder para ver la salud de sus contenedores. También puede utilizar este panel para visualizar las interfaces y backends que ha Traefik registrados. Acceder a la guía de seguimiento apuntando su navegador a https: //monitor.your_domain. Se le pedirá su nombre de usuario y contraseña, que son administrador y la contraseña que configuró en el paso 1.

Una vez iniciada la sesión, verá una interfaz similar a esto:

No hay mucho ver todavía, pero deja abierta esta ventana, y verá el cambio de contenidos a medida que agrega contenedores de Traefik a trabajar.

Ahora tenemos nuestro representante Traefik funcionamiento, configurado para trabajar con estibador, y listo para monitorear otros recipientes acoplables. Vamos a empezar algunos contenedores para Traefik para actuar como un proxy para.

Paso 3 – Registro de Contenedores con Traefik

Con el recipiente en marcha Traefik, ya está listo para ejecutar aplicaciones detrás de él. El lanzamiento de Let los siguientes cotainers detrás Traefik:

Vamos a gestionar estas dos aplicaciones con acoplable componer con un archivo de cargador de muelle-compose.yml. Abra el archivo de cargador de muelle-compose.yml en su editor:

nano docker-compose.yml

  • nano-ventana acoplable compose.yml

Añadir las siguientes líneas al archivo para especificar la versión y las redes usaremos:

version: "3"

networks:
web:
external: true
internal:
external: false

Utilizamos acoplable Componer versión 3, ya que es la versión más reciente e importante del formato de archivo de composición.

Para Traefik reconocer nuestras aplicaciones, deben ser parte de la misma red, y desde entonces hemos creado la red manualmente, que tire de ella en especificando el nombre de la red de Internet y la configuración externa a la verdadera. Luego definimos otra red para que podamos conectar a nuestros contenedores expuestos a un contenedor de base de datos que no vamos a exponer a través de Traefik. Vamos a llamar a esta red interna.

A continuación, we’ll definir cada uno de nuestros servicios, uno a la vez. Vamos a empezar con el recipiente blog, que basaremos la imagen oficial de WordPress. Añadir esta configuración en el fichero:

version: "3"
...

services:
blog:
image: wordpress:4.9.8-apache
environment:
WORDPRESS_DB_PASSWORD:
labels:
- traefik.backend=blog
- traefik.frontend.rule=Host:blog.your_domain
- traefik.docker.network=web
- traefik.port=80
networks:
- internal
- web
depends_on:
- mysql

La clave entorno le permite especificar las variables de entorno que se creará en el interior del contenedor. Al no establecer un valor para WORDPRESS_DB_PASSWORD, estamos contando acoplable Componer para obtener el valor de nuestra concha y pasarla a través cuando creamos el contenedor. Vamos a definir esta variable de entorno en nuestra cáscara antes de iniciar los contenedores. De esta manera No contraseñas codificar directamente en el fichero de configuración.

las etiquetas sección es donde se especifican los valores de configuración para Traefik. Docker etiquetas no hacen nada por sí mismos, pero Traefik lee estos por lo que sabe cómo tratar los contenedores. Esto es lo que cada una de estas etiquetas hace:

  • traefik.backend especifica el nombre del servicio de back-end en Traefik (que apunta al contenedor el blog real).
  • traefik.frontend.rule = Host: blog.your_domain dice Traefik para examinar el host solicitado y si coincide con el patrón de blog.your_domain se debe enrutar el tráfico al contenedor blog.
  • traefik.docker.network = Web especifica qué red para mirar debajo de Traefik para encontrar el IP interna para este contenedor. Desde nuestro contenedor Traefik tiene acceso a toda la información del estibador, sería potencialmente tomar el IP de la red interna si no especificamos esto.
  • traefik.port especifica el puerto que se expone Traefik debe utilizar para enrutar el tráfico a este contenedor.

Con esta configuración, todo el tráfico enviado al puerto 80 de nuestro anfitrión acoplable se dirigirá al contenedor blog.

Asignamos este contenedor a dos redes diferentes de manera que Traefik lo puede encontrar a través de la red Internet y que pueda comunicarse con el contenedor de base de datos a través de la red interna.

Por último, la clave depends_on dice acoplable Componer que este envase tiene que empezar después sus dependencias están ejecutando. Desde WordPress necesita una base de datos para funcionar, hay que ejecutar nuestro contenedor MySQL antes de comenzar nuestro contenedor blog.

A continuación, configure el servicio MySQL mediante la adición de esta configuración al archivo:

services:
...
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD:
networks:
- internal
labels:
- traefik.enable=false

Estamos utilizando la imagen del oficial de MySQL 5.7 para este contenedor. Se dará cuenta de que estamos una vez más el uso de un elemento medio ambiente sin un valor. tendrán que estar configurado en el mismo valor para asegurarse de que nuestro contenedor WordPress puede comunicarse con el MySQL las variables MYSQL_ROOT_PASSWORD y WORDPRESS_DB_PASSWORD. No queremos exponer el recipiente a MySQL Traefik o el mundo exterior, por lo que sólo estamos asignando este contenedor a la red interna. Desde Traefik tiene acceso a la toma de estibador, el proceso sigue expondrá un frontend para el contenedor de MySQL por defecto, así que vamos a añadir la etiqueta traefik.enable = false para especificar que Traefik no debe exponer a este contenedor.

Por último, añadir esta configuración para definir el contenedor Adminer:

services:
...
adminer:
image: adminer:4.6.3-standalone
labels:
- traefik.backend=adminer
- traefik.frontend.rule=Host:db-admin.your_domain
- traefik.docker.network=web
- traefik.port=8080
networks:
- internal
- web
depends_on:
- mysql

Este contenedor se basa la imagen oficial de Adminer. La red y la configuración depends_on para este contenedor coinciden exactamente con lo que estamos usando para el contenedor blog.

Sin embargo, ya que estamos dirigiendo todo el tráfico al puerto 80 de nuestro anfitrión acoplable directamente al recipiente blog, tenemos que configurar este envase diferente con el fin para el tráfico para llegar a nuestro contenedor adminer. La línea de traefik.frontend.rule = Host: db-admin.your_domain dice Traefik para examinar el anfitrión solicitó. Si coincide con el patrón de db-admin.your_domain, Traefik encaminará el tráfico al contenedor adminer.

En este punto, cargador de muelle-compose.yml debe tener el siguiente contenido:

version: "3"

networks:
web:
external: true
internal:
external: false

services:
blog:
image: wordpress:4.9.8-apache
environment:
WORDPRESS_DB_PASSWORD:
labels:
- traefik.backend=blog
- traefik.frontend.rule=Host:blog.your_domain
- traefik.docker.network=web
- traefik.port=80
networks:
- internal
- web
depends_on:
- mysql
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD:
networks:
- internal
labels:
- traefik.enable=false
adminer:
image: adminer:4.6.3-standalone
labels:
- traefik.backend=adminer
- traefik.frontend.rule=Host:db-admin.your_domain
- traefik.docker.network=web
- traefik.port=8080
networks:
- internal
- web
depends_on:
- mysql

Guarde el archivo y salga del editor de texto.

A continuación, los valores establecidos en su concha para las variables MYSQL_ROOT_PASSWORD antes de que WORDPRESS_DB_PASSWORD y empezar sus envases:

export WORDPRESS_DB_PASSWORD=secure_database_password
export MYSQL_ROOT_PASSWORD=secure_database_password

  • WORDPRESS_DB_PASSWORD exportación = secure_database_password
  • MYSQL_ROOT_PASSWORD exportación = secure_database_password

secure_database_password Sustituto con la contraseña de la base de datos deseada. Recuerde que debe utilizar la misma contraseña para ambos WORDPRESS_DB_PASSWORD y MYSQL_ROOT_PASSWORD.

Con estas variables establecidas, ejecute los contenedores que utilizan ventana acoplable de composición de: hasta

docker-compose up -d

  • ventana acoplable de composición del -d

Ahora vuelva a revisar el administrador salpicadero Traefik. Verá que ahora hay un motor y un frontend para los dos servidores expuestos:

Vaya a blog.your_domain, sustituyendo your_domain con su dominio. Se le redirige a una conexión TLS y ahora puede completar la configuración de WordPress:

Ahora el acceso Adminer visitando db-admin.your_domain en su navegador, de nuevo sustituyendo your_domain con su dominio. El contenedor de MySQL no está expuesta al mundo exterior, pero el contenedor adminer tiene acceso a ella a través de la red interna acoplable que comparten usando el nombre del contenedor MySQL como un nombre de host.

En la pantalla de inicio de sesión Adminer, utilice el nombre de usuario raíz , el uso de MySQL para el servidor , y utilizar el valor establecido para MYSQL_ROOT_PASSWORD la contraseña. Una vez iniciada la sesión, verá la interfaz de usuario Adminer:

Ambos sitios están trabajando, y se puede utilizar en el tablero de instrumentos monitor.your_domain para mantener un ojo en sus aplicaciones.

Conclusión

En este tutorial, se configura Traefik a solicitudes de proxy a otras aplicaciones en envases acoplables. configuración declarativa de

Traefik a nivel de contenedor de aplicaciones hace que sea fácil de configurar más servicios, y no hay necesidad de reiniciar el contenedor traefik cuando se agrega nuevas aplicaciones al tráfico proxy para desde Traefik da cuenta de los cambios de forma inmediata a través del fichero de un conector acoplable que está monitoreo.

Para aprender más acerca de lo que puede hacer con Traefik, diríjase a la documentación oficial Traefik.