Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
guias:traefikv2 [2021/05/20 22:19] – [Entry Point] Sergio Alvariño | guias:traefikv2 [2021/10/29 10:35] (actual) – [Nuestro primer servicio: Portainer] Sergio Alvariño | ||
---|---|---|---|
Línea 35: | Línea 35: | ||
===== Ejemplo01: Uno facilito ===== | ===== Ejemplo01: Uno facilito ===== | ||
- | El siguiente fichero // | + | El siguiente fichero // |
Preparamos los ficheros y directorios de trabajo: | Preparamos los ficheros y directorios de trabajo: | ||
Línea 46: | Línea 46: | ||
El contenido del fichero '' | El contenido del fichero '' | ||
- | < | + | < |
version: ' | version: ' | ||
Línea 99: | Línea 99: | ||
Con este //Traefik// básico que hemos lanzado, ya prodríamos lanzar servicios que conectaran con el mismo. Vamos a añadir unas lineas a nuestro fichero // | Con este //Traefik// básico que hemos lanzado, ya prodríamos lanzar servicios que conectaran con el mismo. Vamos a añadir unas lineas a nuestro fichero // | ||
- | < | + | < |
version: ' | version: ' | ||
Línea 219: | Línea 219: | ||
==== Services ==== | ==== Services ==== | ||
- | Serían los componentes del // | + | Serían los componentes del // |
**Los // | **Los // | ||
Línea 239: | Línea 239: | ||
Vamos con un ejemplo un pelín más complejo. Vamos a definir un contenedor de //Traefik// que simplemente expone su // | Vamos con un ejemplo un pelín más complejo. Vamos a definir un contenedor de //Traefik// que simplemente expone su // | ||
- | La gracia del ejemplo es que //Traefik// obtendrá los certificados SSL del dominio (p.ej. miDominio.com) automáticamente desde [[https:// | + | La gracia del ejemplo es que //Traefik// obtendrá los certificados SSL del dominio (p.ej. miDominio.com) automáticamente desde //[[https:// |
Preparamos los directorios y los ficheros de trabajo. | Preparamos los directorios y los ficheros de trabajo. | ||
Línea 259: | Línea 259: | ||
Dentro de esta configuración definiremos: | Dentro de esta configuración definiremos: | ||
- | | + | * **//entry points//** Definiremos dos //entry points//: '' |
- | Los nombres de los //entry points// son etiquetas arbitrarias, | + | < |
- | + | ||
- | < | + | |
entryPoints: | entryPoints: | ||
http: | http: | ||
Línea 273: | Línea 271: | ||
La redirección de puertos se solía hacer con un // | La redirección de puertos se solía hacer con un // | ||
- | < | + | < |
entryPoints: | entryPoints: | ||
http: | http: | ||
Línea 283: | Línea 281: | ||
https: | https: | ||
address: :443 | address: :443 | ||
+ | </ | ||
+ | * **// | ||
- | __providers___ | + | <code yaml> |
- | + | ||
- | : Vamos a definir dos _providers_ diferentes, uno de tipo `docker` y | + | |
- | otro de tipo `file`. | + | |
- | + | ||
- | Nuestro objetivo es usar _Traefik_ en Docker así que siempre deberíamos | + | |
- | definir el _provider_ docker. Recordemos que a través de este | + | |
- | _provider_ los contenedores (servicios) que definamos en nuestro | + | |
- | _Docker_ informarán a _Traefik_ de que rutas necesitan para recibir | + | |
- | peticiones. | + | |
- | + | ||
- | ```traefik.yml | + | |
entryPoints: | entryPoints: | ||
http: | http: | ||
Línea 315: | Línea 304: | ||
</ | </ | ||
- | El //docker provider// de //Traefik// se comunica con //Docker// (en la máquina //host//) a traves del //socket// de //Docker// (en el sistema de ficheros de la máquina _host). Así que necesitaremos que el contenedor //Docker// pueda acceder al //socket// con otro //bind mount// | + | El //docker provider// de //Traefik// se comunica con //Docker// (en la máquina //host// ) a traves del //socket// de //Docker// (en el sistema de ficheros de la máquina _host). Así que necesitaremos que el contenedor //Docker// pueda acceder al //socket// con otro //bind mount// |
El parámetro '' | El parámetro '' | ||
- | {{< admonition type=warning | + | <WRAP center round important 60%> |
- | + | En este ejemplo concreto el '' | |
- | En este ejemplo concreto el '' | + | </WRAP> |
- | + | ||
- | {{< /admonition | + | |
Además del //provider docker// definimos un segundo // | Además del //provider docker// definimos un segundo // | ||
- | {{< admonition type=info title=“provider file: dirname vs filename” state=open | + | <WRAP center round info 60%> |
Podemos definir un //provider file// especificando un '' | Podemos definir un //provider file// especificando un '' | ||
+ | </ | ||
- | {{< /admonition >}} | ||
- | * ****certificates resolvers**** Se encargará de negociar los certificados SSL con //Let’s Encrypt// ¡automáticamente! | ||
- | Los // | + | * **// |
- | Hay [[https:// | + | < |
- | + | ||
- | < | + | |
entryPoints: | entryPoints: | ||
http: | http: | ||
Línea 370: | Línea 353: | ||
//Traefik// no va a pedir certificados de dominio por iniciativa propia, tendremos que indicar, en la configuración dinámica, que servicios queremos asegurar con un certificado (en principio todos) | //Traefik// no va a pedir certificados de dominio por iniciativa propia, tendremos que indicar, en la configuración dinámica, que servicios queremos asegurar con un certificado (en principio todos) | ||
- | Tambien | + | También |
- | + | ||
- | {{< admonition type=tip title=“Protocolo ACME” state=open >}} | + | |
+ | <WRAP center round info 80%> | ||
El agente ACME de //Traefik// genera una pareja de claves pública-privada para hablar con la autoridad certificadora (CA) de //Let’s Encrypt//. Después “pregunta” a la CA que debe hacer para probar que controla un dominio determinado. | El agente ACME de //Traefik// genera una pareja de claves pública-privada para hablar con la autoridad certificadora (CA) de //Let’s Encrypt//. Después “pregunta” a la CA que debe hacer para probar que controla un dominio determinado. | ||
Línea 381: | Línea 363: | ||
La CA comprueba la solución del desafío y que la firma del //nonce// son válidas. A partir de este punto la pareja de claves asociada al dominio se considera autorizada, y el agente ACME ya puede solicitar certificados y/o revocarlos usando esta pareja de claves. | La CA comprueba la solución del desafío y que la firma del //nonce// son válidas. A partir de este punto la pareja de claves asociada al dominio se considera autorizada, y el agente ACME ya puede solicitar certificados y/o revocarlos usando esta pareja de claves. | ||
+ | </ | ||
- | {{< /admonition >}} | ||
- | | + | * **// |
- | < | + | < |
entryPoints: | entryPoints: | ||
http: | http: | ||
Línea 439: | Línea 421: | ||
Ya hemos dicho que nuestro router básico solo expondrá el // | Ya hemos dicho que nuestro router básico solo expondrá el // | ||
- | Para usar el // | + | Para usar el // |
Para generar las credenciales, | Para generar las credenciales, | ||
Línea 456: | Línea 438: | ||
</ | </ | ||
- | {{< admonition type=info title=“Hashes” state=open | + | <WRAP center round info 60%> |
Si ejecutas varias veces el comando '' | Si ejecutas varias veces el comando '' | ||
Línea 471: | Línea 452: | ||
Por otro lado veréis que en muchos sitios de internet indican que hay que duplicar los símbolos ‘$’ para escaparlos, tipicamente usando algún filtro //sed// como '' | Por otro lado veréis que en muchos sitios de internet indican que hay que duplicar los símbolos ‘$’ para escaparlos, tipicamente usando algún filtro //sed// como '' | ||
- | + | </WRAP> | |
- | {{< /admonition | + | |
Una vez que tenemos nuestra contraseña super segura en formato //hash// podemos añadir las siguientes lineas a nuestra configuración dinámica, para definir un // | Una vez que tenemos nuestra contraseña super segura en formato //hash// podemos añadir las siguientes lineas a nuestra configuración dinámica, para definir un // | ||
Línea 487: | Línea 467: | ||
</ | </ | ||
- | Una vez definido nuestro // | + | Una vez definido nuestro // |
<code yaml> | <code yaml> | ||
Línea 554: | Línea 534: | ||
Vamos a organizar nuestro //Docker// con dos // | Vamos a organizar nuestro //Docker// con dos // | ||
- | | + | * **// |
- | | + | * **// |
Los contenedores de la red // | Los contenedores de la red // | ||
Línea 570: | Línea 550: | ||
Los rangos de direcciones IP son arbitrarios, | Los rangos de direcciones IP son arbitrarios, | ||
- | {{< admonition type=warning title=“Traefik V1: frontend y backend” state=open | + | <WRAP center round important 60%> |
**Ojo** en //Traefik V1// los términos // | **Ojo** en //Traefik V1// los términos // | ||
- | + | </WRAP> | |
- | {{< /admonition | + | |
==== Traefik ==== | ==== Traefik ==== | ||
Línea 591: | Línea 570: | ||
Definimos los // | Definimos los // | ||
- | | + | * **// |
- | | + | |
- | | + | |
- | | + | |
+ | | ||
+ | | ||
+ | * **// | ||
+ | * **// | ||
+ | * **// | ||
Contenido del fichero '' | Contenido del fichero '' | ||
Línea 684: | Línea 668: | ||
==== docker-compose.yml ==== | ==== docker-compose.yml ==== | ||
- | Ahora que ya tenemos listos los ficheros de configuración de //Traefik// vamos a definir el fichero '' | + | Ahora que ya tenemos listos los ficheros de configuración de //Traefik// vamos a definir el fichero '' |
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
<code yaml> | <code yaml> | ||
Línea 789: | Línea 788: | ||
Añadimos un nuevo servicio '' | Añadimos un nuevo servicio '' | ||
- | Añadimos también las etiquetas para informar a //Traefik// del nuevo servicio. * El servicio se llama // | + | Añadimos también las etiquetas para informar a //Traefik// del nuevo servicio: |
+ | | ||
+ | | ||
+ | | ||
+ | | ||
Una vez completada la configuración del DNS, podemos levantar nuestro nuevo servicio con: | Una vez completada la configuración del DNS, podemos levantar nuestro nuevo servicio con: | ||
Línea 797: | Línea 800: | ||
</ | </ | ||
- | {{< admonition type=warning title=“Login en Portainer” state=open | + | <WRAP center round important 60%> |
// | // | ||
**Tendrás que crear un usuario '' | **Tendrás que crear un usuario '' | ||
- | + | </WRAP> | |
- | {{< /admonition | + | |
- | + | ||
- | + | ||