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] – [Services] 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 | + | |
| - | + | ||
| - | + | ||