One place for hosting & domains

      Traefik

      Cómo usar Traefik como Proxy inverso para contenedores de Docker en Ubuntu 18.04


      El autor seleccionó Girls Who Code para recibir una donación como parte del programa Write for DOnations.

      Introducción

      Docker puede ser una alternativa eficaz para ejecutar aplicaciones web en producción, pero es posible que desee ejecutar varias aplicaciones en el mismo host de Docker. En esta situación, deberá configurar un proxy inverso debido a que solo le convendrá exponer los puertos 80 y 443 al resto del mundo.

      Traefik es un proxy inverso compatible con Docker que incluye su propio panel de supervisión. A través de este tutorial, usará Traefik para dirigir solicitudes a dos contenedores diferentes de aplicaciones web: WordPress y Adminer, cada uno en comunicación con una base de datos MySQL. Configurará Traefik para presentar todo a través de HTTPS usando Let´s Encrypt.

      Requisitos previos

      Para este tutorial, necesitará lo siguiente:

      Paso 1: Configurar y ejecutar Traefik

      El proyecto Traefik tiene una imagen de Docker oficial, por lo que la usaremos para ejecutar Traefik en un contenedor de Docker.

      Sin embargo, antes de preparar nuestro contenedor de Traefik, debemos crear un archivo de configuración y establecer una contraseña cifrada para poder acceder al panel de supervisión.

      Usaremos la utilidad htpasswd para crear esta contraseña cifrada. Primero, instale la utilidad, que se incluye en el paquete apache2-utils:

      • sudo apt-get install apache2-utils

      Luego, genere la contraseña con htpasswd. Sustituya secure_password por la contraseña que desee usar para el usuario de administración Traefik:

      • htpasswd -nb admin secure_password

      El resultado del programa tendrá el siguiente aspecto:

      Output

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

      Usará este resultado en el archivo de configuración de Traefik para definir la autenticación HTTP básica para el control de estado y el panel de supervisión de Traefik. Copie la línea de resultado completa para poder pegarla posteriormente.

      Para configurar el servidor de Traefik, crearemos un nuevo archivo de configuración llamado traefik.toml usando el formato TOML. TOML es un lenguaje de configuración que se asemeja a los archivos INI, pero está estandarizado. Este archivo nos permite configurar el servidor Traefik y varias integraciones, o proveedores, que nos convendrá usar. Para este tutorial, usaremos tres de los proveedores disponibles de Traefik: api, docker y acme, que se utiliza para ofrecer compatibilidad con TLS usando Let´s Encrypt.

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

      Primero, añada dos puntos de entrada con nombre, http y https, a los que todos los backend tendrán acceso de forma predeterminada:

      traefik.toml

      defaultEntryPoints = ["http", "https"]
      

      Configuraremos los puntos de entrada http y https posteriormente en este archivo.

      A continuación, configure el proveedor api, que le proporciona acceso a una interfaz de panel de control. Aquí es donde pegará el resultado del comando htpasswd:

      traefik.toml

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

      El panel es una aplicación web independiente que se ejecutará en el contenedor Traefik. Configuraremos el panel para que se ejecute en el puerto 8080.

      La sección entrypoints.dashboard establece la forma en que estableceremos la conexión con el proveedor api y la sección entrypoints.dashboard.auth.basic la autenticación básica HTTP para el panel. Use el resultado del comando htpasswd que acaba de ejecutar para el valor de la entrada users. Podría especificar inicios de sesión adicionales separándolos con comas.

      Hemos definido nuestro primer entryPoint, pero deberemos definir otros para la comunicación HTTP y HTTPS estándar que no se dirija al proveedor api. La sección entryPoints configura las direcciones en las que Traefik y los contenedores proxy pueden escuchar. Añada estas líneas al archivo bajo el encabezado entryPoints:

      traefik.toml

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

      El punto de entrada http gestiona el puerto 80, mientras que el punto de entrada https utiliza el puerto 443 para TLS/SSL. Redireccionamos automáticamente todo el tráfico del puerto 80 al punto de entrada https a fin de forzar conexiones seguras para todas las solicitudes.

      A continuación, añada esta sección para establecer la compatibilidad de certificados de Let´s Encrypt con Traefik:

      traefik.toml

      ...
      [acme]
      email = "your_email@your_domain"
      storage = "acme.json"
      entryPoint = "https"
      onHostRule = true
        [acme.httpChallenge]
        entryPoint = "http"
      

      Esta sección se denomina acme, porque ACME es el nombre del protocolo usado para comunicarse con Let´s Encrypt y gestionar los certificados. El servicio Let´s Encrypt requiere registro con una dirección de correo electrónico válida. Por lo tanto, para que Traefik genere certificados para nuestros hosts, use su dirección de correo electrónico para definir la clave email. Luego debemos especificar que almacenaremos la información que recibiremos de Let´s Encrypt en un archivo JSON llamado acme.jason. La clave entryPoint deberá orientarse al puerto de gestión de puntos de entrada 443, que en nuestro caso es el punto de entrada https.

      La clave onHostRule indica la forma en que Traefik debería generar certificados. Nuestra idea es obtener nuestros certificados no bien se creen nuestros contenedores con los hostnames especificados, eso es lo que hará el ajuste onHostRule.

      La sección acme.httpChallenge nos permite especificar la forma en que Let´s Encrypt puede verificar que el certificado se genere. Lo configuraremos para presentar un archivo como parte del desafío a través del punto de entrada http.

      Finalmente, configuraremos el proveedor docker añadiendo estas líneas al archivo:

      traefik.toml

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

      El proveedor docker permite a Traefik actuar como un proxy frente a los contenedores de Docker. Con esto, habremos configurado el proveedor para buscar nuevos contenedores en la red web (que crearemos pronto) y los expondremos como subdominios de your_domain.

      En este momento, traefik.toml debería tener el siguiente contenido:

      traefik.toml

      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 = "your_email@your_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. Una vez implementada toda esta configuración, podemos activar Traefik.

      Paso 2: Ejecutar el contenedor de Traefik

      A continuación, cree una red de Docker para que el proxy la comparta con los contenedores. La red de Docker es necesaria para que podamos usarla con aplicaciones que se ejecuten usando Docker Compose. Daremos a esta red el nombre web.

      • docker network create web

      Cuando se inicie el contenedor Traefik, lo añadiremos a esta red. Luego podremos añadir a esta red contenedores, para los cuales Traefik actuará como proxy.

      A continuación, cree un archivo vacío que contendrá nuestra información de Let´s Encrypt. Compartiremos este archivo en el contenedor para que Traefik pueda usarlo:

      Traefik solo podrá usar este archivo si el usuario root dentro del contenedor tiene acceso exclusivo de lectura y escritura a este. Para hacer esto, bloquee los permisos en acme.json para que solo el propietario del archivo tenga permisos de lectura y escritura.

      Una vez que el archivo se transmita a Docker, el propietario pasará a ser de forma automática el usuario root 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 $PWD/traefik.toml:/traefik.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

      El comando es un poco extenso; por ello, lo dividiremos.

      Usaremos el indicador -d para ejecutar el contenedor en segundo plano como un demonio. A continuación, compartiremos nuestro archivo docker.sock en el contenedor para que el proceso de Traefik pueda escuchar los cambios en los contenedores. También compartiremos el archivo de configuración traefik.toml y el archivo acme.json que creamos en el contenedor.

      A continuación, asignaremos los puertos :80 y :443 de nuestro host de Docker a los mismos puertos en el contenedor Traefik para que Traefik reciba todo el tráfico HTTP y HTTPS enviado al servidor.

      Luego configuraremos dos etiquetas de Docker para indicar a Traefik que dirija el tráfico de hostname monitor.your_domain al puerto :8080 dentro del contenedor de Traefik, lo cual expondrá el panel de supervisión.

      Fijaremos la red del contenedor en web y daremos al contenedor el nombre traefik.

      Finalmente, usaremos la imagen traefik:1.7.2-alpine para este contenedor, ya que es pequeña.

      El ENTRYPOINT de una imagen de Docker es un comando que siempre se ejecuta cuando se crea un contenedor a partir de la imagen. En este caso, el comando es el binario traefik dentro del contenedor. Puede transmitir argumentos adicionales a ese comando al iniciar el contenedor, pero configuramos todos nuestros ajustes en el archivo traefik.toml.

      Con el contenedor iniciado, ahora tiene un panel de control al que puede acceder para ver el estado de sus contenedores. También puede usar este panel de control para visualizar los frontends y los backends que Traefik registró. Acceda al panel de control apuntando su navegador hacia https://monitor.your_domain. Se le solicitará su nombre de usuario y contraseña, que son admin y la contraseña que configuró en el paso 1.

      Una vez que inicie sesión, verá una interfaz similar a esta:

      Panel de Traefik vacío

      Aún no hay mucho que ver, pero si deja esta ventana abierta verá el cambio en el contenido a medida que añada contenedores con los que Traefik trabajará.

      Ahora tenemos nuestro proxy de Traefik activo, configurado para que funcione con Docker, y listo para supervisar otros contendores de Docker. Vamos a iniciar algunos contenedores para los que Traefik actuará como proxy.

      Paso 3: Registrar contenedores con Traefik

      Con el contenedor Traefik activo, estará listo para ejecutar aplicaciones detrás de él. Iniciaremos los siguientes contenedores detrás de Traefik:

      1. Un blog que utilice la imagen oficial de WordPress.
      2. Un servidor de administración de bases de datos que utilice la imagen oficial de Adminer.

      Administraremos estas aplicaciones con Docker Compose usando un archivo docker-compose.yml. Abra el archivo docker-compose.yml en su editor:

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

      docker-compose.yml

      version: "3"
      
      networks:
        web:
          external: true
        internal:
          external: false
      

      Usaremos Docker Compose 3 porque es la versión importante más reciente del formato de archivo Compose.

      Para que Traefik reconozca nuestras aplicaciones, deben ser parte de la misma red. Debido a que la creamos manualmente, la introduciremos especificando el nombre de red de web y fijando external en true. Luego definiremos otra red para que podamos conectar nuestros contenedores expuestos a un contenedor de base de datos que no expondremos a través de Traefik. Llamaremos a esta red internal.

      A continuación, definiremos nuestros services de a uno por vez. Comenzaremos con el contenedor blog, que basaremos en la imagen oficial de WordPress. Agregue esta configuración al archivo:

      docker-compose.yml

      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 environment le permite especificar las variables de entorno que se configurarán dentro del contenedor. Al no establecer un valor para WORDPRESS_DB_PASSWORD, indicaremos a Docker Compose que obtenga el valor de nuestro shell y lo transmita cuando creemos el contenedor. Definiremos esta variable de entorno en nuestro shell antes de iniciar los contenedores. De esta manera, no codificamos contraseñas de forma rígida en el archivo de configuración.

      En la sección labels se especifican los valores de configuración para Traefik. Las etiquetas de Docker no hacen nada por sí mismas, pero Traefik las lee para el tratamiento de los contenedores. Aquí verá lo que hace cada una de estas etiquetas:

      • traefik.backend especifica el nombre del servicio de backend en Traefik (que apunta al contenedor real de blog.
      • traefik.frontend.rule=Host:blog.your_domain indica a Traefik que examine el host solicitado y si coincide con el patrón de blog.your_domain debería dirigir el tráfico al contenedor blog.
      • traefik.docker.network=web especifica la red en la que se debe buscar para que Traefik encuentre el IP interno de este contenedor. Debido a que nuestro contenedor de Traefik tiene acceso a toda la información de Docker, potencialmente tomaría el IP para la red internal si no especificamos esto.
      • traefik.port especifica el puerto expuesto que Traefik debería usar para dirigir el tráfico hacia este contenedor.

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

      Asignaremos este contenedor a dos redes diferentes para que Traefik pueda encontrarlo a través de la red web y comunicarse con el contenedor de base de datos a través de la red internal.

      Finalmente, la clave depends_on indica a Docker Compose que este contenedor debe iniciarse una vez que sus dependencias estén en ejecución. Ya que WordPress necesita una base de datos para ejecutarse, debemos ejecutar nuestro contenedor mysql antes de iniciar nuestro contenedor blog.

      A continuación, configure el servicio de MySQL agregando esta configuración a su archivo:

      docker-compose.yml

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

      Usaremos la imagen oficial de MySQL 5.7 para este contenedor. Observará que una vez más usaremos un elemento environment sin un valor. Las variables MySQL_ROOT_PASSWORD y MYSQL_ROOT_PASSWORD deberán fijarse en el mismo valor para garantizar que nuestro contenedor de WordPress pueda comunicarse con MySQL. No nos convendrá exponer el contenedor mysql a Traefik o al mundo exterior, por lo que solo asignaremos este contenedor a la red internal. Dado que Traefik tiene acceso al socket de Docker, el proceso seguirá exponiendo un frontend para el contenedor mysql por defecto, de forma que añadiremos la etiqueta traefik.enable=false para especificar que Traefik no debería exponer este contenedor.

      Finalmente, añada esta configuración para definir el contenedor Adminer:

      docker-compose.yml

      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 en la imagen oficial de Adminer. La configuración de network y depends_on para este contenedor coinciden exactamente con lo que usamos para el contenedor blog.

      Sin embargo, ya que dirigiremos todo el tráfico del puerto 80 de nuestro host de Docker directamente al contenedor blog, debemos configurar este contenedor de forma diferente para que el tráfico llegue a nuestro contenedor adminer. La línea traefik.frontend.rule=Host:db-admin.your_domain indica a Traefik que examine el host solicitado. Si coincide con el patrón de db-admin.your_domain, Traefik dirigirá el tráfico al contenedor adminer.

      En este momento, docker-compose.yml debería tener el siguiente contenido:

      docker-compose.yml

      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, establezca valores en su shell para las variables WORDPRESS_DB_PASSWORD y MySQL_ROOT_PASSWORD antes de iniciar sus contenedores:

      • export WORDPRESS_DB_PASSWORD=secure_database_password
      • export MYSQL_ROOT_PASSWORD=secure_database_password

      Sustituya secure_database_password por su contraseña de base de datos deseada. Recuerde usar la misma contraseña tanto para WORDPRESS_DB_PASSWORD como para MySQL_ROOT_PASSWORD.

      Una vez configuradas estas variables, ejecute los contenedores usando docker-compose:

      Ahora, observe de nuevo el panel de administración de Traefik. Verá que hay un backend y un frontend para los dos servidores expuestos:

      Panel de Traefik con contenido

      Diríjase a blog.your_domain y sustituya your_domain por su dominio. Accederá a una conexión TLS y podrá completar la configuración de WordPress:

      Pantalla configuración de WordPress

      Ahora, acceda a Adminer visitando db-admin.your_domain en su navegador y vuelva a sustituir your_domain por su dominio. El contenedor mysql no está expuesto al mundo exterior, pero el contenedor adminer tiene acceso a él a través de la red internal de Docker que comparten usando el nombre de contenedor de mysql como nombre de host.

      En la pantalla de inicio de sesión de Adminer, utilice el nombre de usuario root, mysql para el servidor y el valor que fijó para MySQL_ROOT_PASSWORD para la contraseña. Una vez que inicie sesión, verá la interfaz de usuario de Adminer:

      Adminer conectado a la base de datos de MySQL

      Ahora ambos sitios funcionan y puede usar el panel en monitor.your_domain para controlar sus aplicaciones.

      Conclusión

      A través de este tutorial, configuró Traefik para solicitudes de proxy a otras aplicaciones en contenedores de Docker.

      La configuración declarativa de Traefik en el nivel de contenedor de la aplicación hace que sea fácil configurar más servicios, y no será necesario reiniciar el contenedor traefik cuando añada nuevas aplicaciones para aplicar proxy al tráfico, ya que Traefik advierte los cambios de inmediato a través del archivo de socket de Docker que controla.

      Para obtener más información sobre lo que puede hacer con Traefik, consulte la documentación oficial de Traefik.



      Source link

      Использование Traefik в качестве обратного прокси для контейнеров Docker в Ubuntu 18.04


      Автор выбрал Girls Who Code для получения пожертвования в рамках программы Write for DOnations.

      Введение

      Docker может эффективно запускать веб-приложения в производственном среде, но бывает так, что вам нужно запустить несколько приложений на одном хосте Docker. В этой ситуации вам нужно настроить обратный прокси, поскольку вы хотите открывать для мира только порты 80 и 443.

      Traefik — это обратный прокси с поддержкой Docker, имеющий собственную панель мониторинга. В этом обучающем модуле вы используете Traefik для перенаправления запросов двух разных контейнеров веб-приложений: контейнера WordPress и контейнера Adminer, каждый из которых взаимодействует с базой данных MySQL. Вы настроите Traefik для обслуживания соединений через HTTPS с помощью Let’s Encrypt.

      Предварительные требования

      Для выполнения этого обучающего модуля вам потребуется следующее:

      Шаг 1 — Настройка и запуск Traefik

      Проект Traefik имеет официальный образ Docker, так что мы будем использовать его для запуска Traefik в контейнере Docker.

      Однако прежде чем мы запустим наш контейнер Traefik, нам нужно будет создать файл конфигурации и настроить шифрованный пароль для доступа к информационной панели мониторинга.

      Для создания шифрованного пароля мы используем утилиту htpasswd. Вначале следует установить эту утилиту, которая входит в пакет apache2-utils:

      • sudo apt-get install apache2-utils

      Затем нужно сгенерировать пароль с помощью htpasswd. Замените secure_password паролем, который вы хотите использовать для административного пользователя Traefik:

      • htpasswd -nb admin secure_password

      Программа выдаст следующий результат:

      Output

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

      Используйте этот результат в файле конфигурации Traefik для настройки базовой аутентификации HTTP для проверки состояния Traefik и информационной панели мониторинга. Скопируйте всю строку результатов, чтобы ее можно было вставить.

      Для настройки сервера Traefik мы создадим новый файл конфигурации с именем traefik.toml в формате TOML. TOML — это язык конфигурации, похожий на используемый в файлах INI, но при этом стандартизированный. Этот файл позволит нам настроить сервер Traefik и различные интеграции или провайдеров, которых мы хотим использовать. В этом обучающем модуле мы будем использовать три из числа доступных провайдеров Traefik: api, docker и acme, который используется для поддержки TLS при использовании Let’s Encrypt.

      Откройте новый файл в nano или в другом предпочитаемом текстовом редакторе:

      Добавьте две точки входа с именами http и https, которые будут по умолчанию доступны всем серверным компонентам:

      traefik.toml

      defaultEntryPoints = ["http", "https"]
      

      Мы настроим точки входа http и https в следующих шагах.

      Затем настройте провайдер api, который дает доступ к интерфейсу информационной панели. Здесь вам нужно вставить результат выполнения команды htpasswd:

      traefik.toml

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

      Информационная панель — это отдельное веб-приложение, работающее в контейнере Traefik. Мы настроим информационную панель для запуска на порту 8080.

      Раздел entrypoints.dashboard настраивает способ подключения с помощью провайдера api, а раздел entrypoints.dashboard.auth.basic настраивает базовую аутентификацию HTTP для информационной панели. Используйте результат выполнения команды htpasswd для получения значения записи users. Вы можете указать дополнительные имена пользователей, отделяя их с помощью запятых.

      Мы определили первую точку входа entryPoint, но теперь нам нужно определить другие точки входа для стандартных коммуникаций HTTP и HTTPS, которые не направлены на провайдер api. В разделе entryPoints настраиваются адреса, которые могут прослушивать Traefik и контейнеры, подключенные через прокси. Добавьте в файл следующие строки под заголовком entryPoints:

      traefik.toml

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

      Точка входа http использует порт 80, а точка входа https использует порт 443 для TLS/SSL. Мы автоматически перенаправляем весь трафик порта 80 на точку входа https, чтобы принудительно использовать защищенные соединения для всех запросов.

      Затем добавьте этот раздел для настройки поддержки сертификата Let’s Encrypt для Traefik:

      traefik.toml

      ...
      [acme]
      email = "your_email@your_domain"
      storage = "acme.json"
      entryPoint = "https"
      onHostRule = true
        [acme.httpChallenge]
        entryPoint = "http"
      

      Этот раздел называется acme, потому что ACME — это имя протокола, используемое для связи с Let’s Encrypt для управления сертификатами. Служба Let’s Encrypt требует для регистрации действующий адрес электронной почты, и чтобы дать Traefik возможность генерировать сертификаты для наших хостов, установите для ключа email свой адрес электронной почты. Затем мы укажем, что будем сохранять получаемую от Let’s Encrypt информацию в файле JSON с именем acme.json. Ключ entryPoint должен указывать на точку входа, использующую порт 443, и в нашем случае это будет точка входа https.

      Ключ onHostRule указывает, как Traefik следует генерировать сертификаты. Мы хотим получать сертификаты сразу же после создания контейнеров с заданными именами хостов, и для этого мы используем параметр onHostRule.

      Раздел acme.httpChallenge позволяет указать, как Let’s Encrypt сможет проверять необходимость генерирования сертификата. Мы настроим его для обслуживания файла в рамках запроса через точку входа http.

      В заключение мы настроим провайдер docker, добавив в файл следующие строки:

      traefik.toml

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

      Провайдер docker позволяет Traefik выступать в качестве прокси для контейнеров Docker. Мы настроили провайдер на отслеживание новых контейнеров в сети web (которую мы вскоре создадим) и для предоставления доступа к ним как к субдоменам домена your_domain.

      На данный момент файл traefik.toml должен иметь следующее содержание:

      traefik.toml

      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 = "your_email@your_domain"
      storage = "acme.json"
      entryPoint = "https"
      onHostRule = true
        [acme.httpChallenge]
        entryPoint = "http"
      
      [docker]
      domain = "your_domain"
      watch = true
      network = "web"
      

      Сохраните файл и выйдите из редактора. Настроив эти параметры конфигурации, мы можем запускать Traefik.

      Шаг 2 — Запуск контейнера Traefik

      Затем создайте сеть Docker, которую прокси будет использовать для связи с контейнерами. Сеть Docker необходима, чтобы мы могли использовать ее для приложений, запущенных с помощью Docker Compose. Присвоим этой сети имя web.

      • docker network create web

      После запуска контейнера Traefik мы добавим его в эту сеть. Теперь мы можем добавить в эту сеть дополнительные контейнеры, для которых Traefik будет выступать в качестве прокси.

      Создайте пустой файл, где будет храниться информация Let’s Encrypt. Мы передадим ее в контейнер, чтобы Traefik мог ее использовать:

      Traefik сможет использовать этот файл, только если пользователь root внутри контейнера будет иметь уникальный доступ к этому файлу для чтения и записи. Для этого нам нужно будет заблокировать разрешения файла acme.json, чтобы права записи и чтения были только у владельца файла.

      После передачи файла в Docker владелец автоматически сменяется на пользователя root внутри контейнера.

      Затем создайте контейнер Traefik с помощью следующей команды:

      • docker run -d
      • -v /var/run/docker.sock:/var/run/docker.sock
      • -v $PWD/traefik.toml:/traefik.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

      Это команда немного длинная, так что попробуем ее разбить.

      Мы используем флаг -d для запуска контейнера в фоновом режиме как демона. Затем мы передадим файл docker.sock в контейнер, чтобы процесс Traefik могу отслеживать изменения в контейнерах. Также мы передадим в контейнер созданные нами файл конфигурации traefik.toml и файл acme.json.

      Затем мы сопоставим порты :80 и :443 нашего хоста Docker с аналогичными портами контейнера Traefik, чтобы Traefik принимал весь трафик HTTP и HTTPS, поступающий на сервер.

      Затем мы создадим два ярлыка Docker, которые будут предписывать Traefik направлять трафик хоста monitor.your_domain на порт :8080 в контейнере Traefik, открывая доступ к информационной панели мониторинга.

      Мы зададим для контейнера сеть web и присвоим ему имя traefik.

      В заключение мы используем образ traefik:1.7.2-alpine для этого контейнера, поскольку он имеет небольшой размер.

      Команда ENTRYPOINT всегда запускается при создании контейнера из образа Docker. В данном случае команда представялет собой двоичный файл traefik в контейнере. При запуске контейнера вы можете передать для команды дополнительные аргументы, но мы настроили все параметры в файле traefik.toml.

      После запуска контейнера вы получили информационную панель, которую можете использовать для просмотра состояния ваших контейнеров. Также вы можете использовать эту информационную панель для визуализации клиентских и серверных ресурсов, зарегистрированных Traefik. Откройте панель мониторинга, введя в браузер адрес https://monitor.your_domain. Вам будет предложено ввести имя пользователя и пароль. Используйте имя пользователя admin и пароль, заданный на шаге 1.

      После входа вы увидите интерфейс, который будет выглядеть примерно так:

      Пустая информационная панель Traefik

      Сейчас на панели почти ничего нет, но вам следует это окно открытым, и вы увидите, как будет меняться его содержание при добавлении в Traefik контейнеров.

      Мы запустили прокси Traefik, настроили его для работы с Docker и подготовились к отслеживанию других контейнеров Docker. Теперь запустим контейнеры, для которых Traefik будет выступать в качестве прокси.

      Шаг 3 — Регистрация контейнеров в Traefik

      Теперь у вас работает контейнер Traefik и вы готовы запускать через него приложения. Давайте запустим через Traefik следующие контейнеры:

      1. Блог, использующий официальный образ WordPress.
      2. Сервер управления базами данных, использующий официальный образ Adminer.

      Для управления этими приложениями мы будем использовать Docker Compose с файлом docker-compose.yml. Откройте файл docker-compose.yml в редакторе:

      Добавьте в файл следующие строки, чтобы указать версию и сети, которые мы будем использовать:

      docker-compose.yml

      version: "3"
      
      networks:
        web:
          external: true
        internal:
          external: false
      

      Мы будем использовать Docker Compose версии 3, потому что это последняя крупная версия формата файлов Compose.

      Чтобы у Traefik была возможность распознавать наши приложения, они должны входить в ту же сеть. Поскольку мы создали сеть вручную, мы подключим ее, указав имя сети web и задав для параметра external значение true. Затем мы определим другую сеть, чтобы мы могли подключать наши открытые контейнеры к контейнеру базы данных, доступ к которому мы не будем предоставлять через Traefik. Мы присвоим этой сети имя internal.

      Теперь мы определим наши службы, по одной за раз. Начнем с контейнера blog, который будет основан на официальном образе WordPress. Добавьте эту конфигурацию в файл:

      docker-compose.yml

      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
      

      Ключ environment позволяет задать переменные среды, которые будут заданы внутри контейнера. Мы не задаем значение паарметра WORDPRESS_DB_PASSWORD и тем самым предписываем Docker Compose использовать значение из нашей оболочки и передавать его при создании контейнера. Мы определим эту переменную в нашей оболочке перед запуском контейнеров. Так нам не придется напрямую программировать пароли в файле конфигурации.

      Раздел labels позволяет задать значения конфигурации для Traefik. Ярлыки Docker сами по себе ничего не делают, но Traefik их считывает, и поэтому ему известно, как следует обрабатывать контейнеры. Вот что делает каждый из этих ярлыков:

      • traefik.backend задает имя серверной службы в Traefik (которая указывает на фактический контейнер blog).
      • traefik.frontend.rule=Host:blog.your_domain предписывает Traefik проверить запрошенный хост, и если он соответствует шаблону blog.your_domain, перенаправить трафик в контейнер blog.
      • traefik.docker.network=web указывает, в какой сети Traefik следует искать внутренний IP-адрес для этого контейнера. Поскольку у нашего контейнера Traefik есть доступ ко всей информации Docker, он может взять IP-адрес сети internal, если мы не указали этого.
      • traefik.port задает открытый порт, который Traefik следует использовать для перенаправления трафика в этот контейнер.

      При такой конфигурации весь трафик, отправляемый на порт 80 нашего хоста Docker, будет перенаправляться в контейнер blog.

      Мы назначим для этого контейнера две отдельных сети, чтобы Traefik мог находить его через сеть web и чтобы он мог связываться с контейнером базы данных через сеть internal.

      Наконец, ключ depends_on сообщает Docker Compose, что этот контейнер должен запускаться после того, как будут запущены его зависимости. Поскольку для запуска WordPress требуется база данных, мы должны запустить наш контейнер mysql до того, как запустим контейнер blog.

      Теперь настройте службу MySQL, добавив в файл следующую конфигурацию:

      docker-compose.yml

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

      Для этого контейнера мы используем официальный образ MySQL 5.7. Возможно вы заметили, что мы снова используем элемент environment без значения. Для переменных MYSQL_ROOT_PASSWORD и WORDPRESS_DB_PASSWORD нужно задать одинаковое значение, чтобы наш контейнер WordPress мог связываться с MySQL. Мы не хотим открывать контейнер mysql для Traefik или внешнего мира, и поэтому мы назначим его только в сеть internal. Поскольку у Traefik имеется доступ к сокету Docker, данный процесс по умолчанию открывает клиентскую часть для контейнера mysql. Поэтому мы добавим ярлык traefik.enable=false, указывая, что Traefik не следует открывать доступ к этому контейнеру.

      В заключение добавим следующую конфигурацию для определения контейнера Adminer:

      docker-compose.yml

      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
      

      Этот контейнер основан на официальном образе Adminer. Конфигурации network и depends_on для этого контейнера точно совпадают с использованными нами для контейнера blog.

      Однако поскольку мы направляем весь трафик порта 80 нашего хоста Docker непосредственно в контейнер blog, нам нужно настроить этот контейнер по другому, чтобы трафик отправлялся в контейнер adminer. Строка traefik.frontend.rule=Host:db-admin.your_domain предписывает Traefik изучить запрошенный хост. Если он совпадает с шаблоном db-admin.your_domain, Traefik будет перенаправлять трафик в контейнер adminer.

      На данный момент файл docker-compose.yml должен иметь следующее содержание:

      docker-compose.yml

      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
      

      Сохраните файл и выйдите из текстового редактора.

      Теперь задайте в оболочке значения переменных WORDPRESS_DB_PASSWORD и MYSQL_ROOT_PASSWORD, прежде чем запускать контейнеры:

      • export WORDPRESS_DB_PASSWORD=secure_database_password
      • export MYSQL_ROOT_PASSWORD=secure_database_password

      Замените secure_database_password желаемым паролем для базы данных. Не забудьте использовать один и тот же пароль для WORDPRESS_DB_PASSWORD и MYSQL_ROOT_PASSWORD.

      Установив эти переменные, запустите контейнеры с помощью docker-compose:

      Еще раз посмотрите на информационную панель администратора Traefik. Вы увидите, что теперь для двух открытых серверов отображаются серверная часть и клиентская часть:

      Заполненная информационная панель Traefik

      Перейдите на адрес blog.your_domain, заменив your_domain на имя вашего домена. Вы будете перенаправлены на соединение TLS и сможете завершить настройку WordPress:

      Экран настройки WordPress

      Откройте Adminer. Для этого введите адрес db-admin.your_domain в адресную строку браузера, заменив your_domain на имя вашего домена. Контейнер mysql не открыт для окружающего мира, но контейнер adminer имеет доступ к нему через внутреннюю сеть internal в Docker, которую они совместно используют, используя имя контейнера mysql как имя хоста.

      На экране входа в систему Adminer используйте имя пользователя root, mysql в качестве сервера и заданное значение пароля MYSQL_ROOT_PASSWORD. После входа в систему вы увидите пользовательский интерфейс Adminer:

      Adminer подключен к базе данных MySQL

      Оба сайта уже работают, и вы можете использовать информационную панель monitor.your_domain для наблюдения за приложениями.

      Заключение

      В этом обучающем руководстве вы настроили Traefik для перенаправления запросов в другие приложения в контейнерах Docker.

      Декларативная конфигурация Traefik на уровне контейнера приложения позволяет легко настраивать дополнительные услуги. При этом контейнер traefik не требуется перезапускать при добавлении новых приложений для переадресации трафика, поскольку Traefik моментально определяет изменения через отслеживаемый файл сокета Docker.

      Чтобы узнать больше о том, что можно сделать с помощью Traefik, ознакомьтесь с официальной документацией по Traefik.



      Source link

      Como Usar o Traefik como um Proxy Reverso para Containers do Docker no CentOS 7


      O autor selecionou o Girls Who Code para receber uma doação como parte do programa Write for DOnations.

      Introdução

      O Docker pode ser uma maneira eficiente de executar aplicativos web em produção, mas você pode querer executar vários aplicativos no mesmo host do Docker. Nesta situação, você precisará configurar um proxy reverso, já que você só deseja expor as portas 80 e 443 para o resto do mundo.

      O Traefik é um proxy reverso que reconhece o Docker e inclui seu próprio painel de monitoramento ou dashboard. Neste tutorial, você usará o Traefik para rotear solicitações para dois containers de aplicação web diferentes: um container WordPress e um container Adminer, cada um falando com um banco de dados MySQL. Você irá configurar o Traefik para servir tudo através de HTTPS utilizando o Let’s Encrypt.

      Pré-requisitos

      Para acompanhar este tutorial, você vai precisar do seguinte:

      Passo 1 — Configurando e Executando o Traefik

      O projeto do Traefik tem uma imagem Docker oficial, portanto vamos utilizá-la para executar o Traefik em um container Docker.

      Mas antes de colocarmos o nosso container Traefik em funcionamento, precisamos criar um arquivo de configuração e configurar uma senha criptografada para que possamos acessar o painel de monitoramento.

      Usaremos o utilitário htpasswd para criar essa senha criptografada. Primeiro, instale o utilitário, que está incluído no pacote httpd-tools:

      • sudo yum install -y httpd-tools

      Em seguida, gere a senha com o htpasswd. Substitua senha_segura pela senha que você gostaria de usar para o usuário admin do Traefik:

      • htpasswd -nb admin senha_segura

      A saída do programa ficará assim:

      Output

      admin:$apr1$kEG/8JKj$yEXj8vKO7HDvkUMI/SbOO.

      Você utilizará essa saída no arquivo de configuração do Traefik para configurar a Autenticação Básica de HTTP para a verificação de integridade do Traefik e para o painel de monitoramento. Copie toda a linha de saída para poder colá-la mais tarde.

      Para configurar o servidor Traefik, criaremos um novo arquivo de configuração chamado traefik.toml usando o formato TOML. O TOML é uma linguagem de configuração semelhante ao arquivos INI, mas padronizado. Esse arquivo nos permite configurar o servidor Traefik e várias integrações, ou providers, que queremos usar. Neste tutorial, usaremos três dos provedores disponíveis do Traefik: api,docker e acme, que é usado para suportar o TLS utilizando o Let’s Encrypt.

      Abra seu novo arquivo no vi ou no seu editor de textos favorito:

      Entre no modo de inserção pressionando i, adicione dois EntryPoints nomeados http ehttps, que todos os backends terão acesso por padrão:

      traefik.toml

      defaultEntryPoints = ["http", "https"]
      

      Vamos configurar os EntryPoints http e https posteriormente neste arquivo.

      Em seguida, configure o provider api, que lhe dá acesso a uma interface do painel. É aqui que você irá colar a saída do comando htpasswd:

      traefik.toml

      ...
      [entryPoints]
        [entryPoints.dashboard]
          address = ":8080"
          [entryPoints.dashboard.auth]
            [entryPoints.dashboard.auth.basic]
              users = ["admin:sua_senha_criptografada"]
      
      [api]
      entrypoint="dashboard"
      

      O painel é uma aplicação web separada que será executada no container do Traefik. Vamos definir o painel para executar na porta 8080.

      A seção entrypoints.dashboard configura como nos conectaremos com o provider da api, e a seção entrypoints.dashboard.auth.basic configura a Autenticação Básica HTTP para o painel. Use a saída do comando htpasswd que você acabou de executar para o valor da entrada users. Você poderia especificar logins adicionais, separando-os com vírgulas.

      Definimos nosso primeiro entryPoint, mas precisaremos definir outros para comunicação HTTP e HTTPS padrão que não seja direcionada para o provider da api. A seção entryPoints configura os endereços que o Traefik e os containers com proxy podem escutar. Adicione estas linhas ao arquivo logo abaixo do cabeçalho entryPoints:

      traefik.toml

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

      O entrypoint http manipula a porta 80, enquanto o entrypoint https usa a porta443 para o TLS/SSL. Redirecionamos automaticamente todo o tráfego na porta 80 para o entrypoint https para forçar conexões seguras para todas as solicitações.

      Em seguida, adicione esta seção para configurar o suporte ao certificado Let's Encrypt do Traefik:

      traefik.toml

      ...
      [acme]
      email = "seu_email@seu_domínio"
      storage = "acme.json"
      entryPoint = "https"
      onHostRule = true
        [acme.httpChallenge]
        entryPoint = "http"
      

      Esta seção é chamada acme porque ACME é o nome do protocolo usado para se comunicar com o Let's Encrypt para gerenciar certificados. O serviço Let's Encrypt requer o registro com um endereço de e-mail válido, portanto, para que o Traefik gere certificados para nossos hosts, defina a chave email como seu endereço de e-mail. Em seguida, vamos especificar que armazenaremos as informações que vamos receber do Let's Encrypt em um arquivo JSON chamado acme.json. A chave entryPoint precisa apontar para a porta de manipulação do entrypoint 443, que no nosso caso é o entrypoint https.

      A chave onHostRule determina como o Traefik deve gerar certificados. Queremos buscar nossos certificados assim que nossos containers com os nomes de host especificados forem criados, e é isso que a configuração onHostRule fará.

      A seção acme.httpChallenge nos permite especificar como o Let's Encrypt pode verificar se o certificado deve ser gerado. Estamos configurando-o para servir um arquivo como parte do desafio através do entrypoint http.

      Finalmente, vamos configurar o provider docker adicionando estas linhas ao arquivo:

      traefik.toml

      ...
      [docker]
      domain = "seu_domínio"
      watch = true
      network = "web"
      

      O provedor docker permite que o Traefik atue como um proxy na frente dos containers do Docker. Configuramos o provider para vigiar ou watch por novos containers na rede web (que criaremos em breve) e os expor como subdomínios de seu_domínio.

      Neste ponto, o traefik.toml deve ter o seguinte conteúdo:

      traefik.toml

      defaultEntryPoints = ["http", "https"]
      
      [entryPoints]
        [entryPoints.dashboard]
          address = ":8080"
          [entryPoints.dashboard.auth]
            [entryPoints.dashboard.auth.basic]
              users = ["admin:sua_senha_criptografada"]
        [entryPoints.http]
          address = ":80"
            [entryPoints.http.redirect]
              entryPoint = "https"
        [entryPoints.https]
          address = ":443"
            [entryPoints.https.tls]
      
      [api]
      entrypoint="dashboard"
      
      [acme]
      email = "seu_email@seu_domínio"
      storage = "acme.json"
      entryPoint = "https"
      onHostRule = true
        [acme.httpChallenge]
        entryPoint = "http"
      
      [docker]
      domain = "seu_domínio"
      watch = true
      network = "web"
      

      Depois de adicionar o conteúdo, pressione ESC para sair do modo de inserção. Digite :x e depois ENTER para salvar e sair do arquivo. Com toda essa configuração pronta, podemos ativar o Traefik.

      Passo 2 – Executando o Container Traefik

      Em seguida, crie uma rede do Docker para o proxy compartilhar com os containers. A rede do Docker é necessária para que possamos usá-la com aplicações que são executadas usando o Docker Compose. Vamos chamar essa rede de web.

      • docker network create web

      Quando o container Traefik iniciar, nós o adicionaremos a essa rede. Em seguida, podemos adicionar containers adicionais a essa rede posteriormente para o Traefik fazer proxy.

      Em seguida, crie um arquivo vazio que conterá as informações do Let's Encrypt. Compartilharemos isso no container para que o Traefik possa usá-lo:

      O Traefik só poderá usar esse arquivo se o usuário root dentro do container tiver acesso exclusivo de leitura e gravação a ele. Para fazer isso, bloqueie as permissões em acme.json para que somente o proprietário do arquivo tenha permissão de leitura e gravação.

      Depois que o arquivo for repassado para o Docker, o proprietário será automaticamente alterado para o usuário root dentro do container.

      Finalmente, crie o container Traefik com este comando:

      • docker run -d
      • -v /var/run/docker.sock:/var/run/docker.sock
      • -v $PWD/traefik.toml:/traefik.toml
      • -v $PWD/acme.json:/acme.json
      • -p 80:80
      • -p 443:443
      • -l traefik.frontend.rule=Host:monitor.seu_domínio
      • -l traefik.port=8080
      • --network web
      • --name traefik
      • traefik:1.7.6-alpine

      O comando é um pouco longo, então vamos dividi-lo.

      Usamos a flag -d para executar o container em segundo plano como um daemon. Em seguida, compartilhamos nosso arquivo docker.sock dentro do container para que o processo do Traefik possa escutar por alterações nos containers. Compartilhamos também o arquivo de configuração traefik.toml e o arquivoacme.json que criamos dentro do container.

      Em seguida, mapeamos as portas :80 e :443 do nosso host Docker para as mesmas portas no container Traefik, para que o Traefik receba todo o tráfego HTTP e HTTPS para o servidor.

      Em seguida, configuramos dois labels do Docker que informam ao Traefik para direcionar o tráfego para o monitor.seu_domínio para a porta :8080 dentro do container do Traefik, expondo o painel de monitoramento.

      Configuramos a rede do container para web, e nomeamos o container para traefik.

      Finalmente, usamos a imagem traefik:1.7.6-alpine para este container, porque é pequena.

      Um ENTRYPOINT da imagem do Docker é um comando que sempre é executado quando um container é criado a partir da imagem. Neste caso, o comando é o binário traefik dentro do container. Você pode passar argumentos adicionais para esse comando quando você inicia o container, mas definimos todas as nossas configurações no arquivo traefik.toml.

      Com o container iniciado, agora você tem um painel que você pode acessar para ver a integridade de seus containers. Você também pode usar este painel para visualizar os frontends e backends que o Traefik registrou. Acesse o painel de monitoramento apontando seu navegador para https://monitor.seu_domínio. Você será solicitado a fornecer seu nome de usuário e senha, que são admin e a senha que você configurou no Passo 1.

      Uma vez logado, você verá uma interface semelhante a esta:

      Empty Traefik dashboard

      Ainda não há muito o que ver, mas deixe essa janela aberta e você verá o conteúdo mudar à medida que você adiciona containers para o Traefik trabalhar.

      Agora temos nosso proxy Traefik em execução, configurado para funcionar com o Docker, e pronto para monitorar outros containers Docker. Vamos iniciar alguns containers para que o Traefik possa agir como proxy para eles.

      Com o container do Traefik em execução, você está pronto para executar aplicações por trás dele. Vamos lançar os seguintes containers por trás do Traefik:

      1. Um blog usando a imagem oficial do WordPress.

      2. Um servidor de gerenciamento de banco de dados usando a imagem oficial do Adminer.

      Vamos gerenciar essas duas aplicações com o Docker Compose usando um arquivo docker-compose.yml. Abra o arquivo docker-compose.yml em seu editor:

      Adicione as seguintes linhas ao arquivo para especificar a versão e as redes que usaremos:

      docker-compose.yml

      version: "3"
      
      networks:
        web:
          external: true
        internal:
          external: false
      

      Usamos a versão 3 do Docker Compose porque é a mais nova versão principal do formato de arquivo Compose.

      Para o Traefik reconhecer nossas aplicações, elas devem fazer parte da mesma rede e, uma vez que criamos a rede manualmente, nós a inserimos especificando o nome da rede web e configurandoexternal para true. Em seguida, definimos outra rede para que possamos conectar nossos containers expostos a um container de banco de dados que não vamos expor por meio do Traefik. Chamaremos essa rede de internal.

      Em seguida, definiremos cada um dos nossos serviços ou services, um de cada vez. Vamos começar com o container blog, que basearemos na imagem oficial do WordPress. Adicione esta configuração ao arquivo:

      docker-compose.yml

      version: "3"
      ...
      
      services:
        blog:
          image: wordpress:4.9.8-apache
          environment:
            WORDPRESS_DB_PASSWORD:
          labels:
            - traefik.backend=blog
            - traefik.frontend.rule=Host:blog.seu_domínio
            - traefik.docker.network=web
            - traefik.port=80
          networks:
            - internal
            - web
          depends_on:
            - mysql
      

      A chave environment permite que você especifique variáveis de ambiente que serão definidas dentro do container. Ao não definir um valor para WORDPRESS_DB_PASSWORD, estamos dizendo ao Docker Compose para obter o valor de nosso shell e repassá-lo quando criamos o container. Vamos definir essa variável de ambiente em nosso shell antes de iniciar os containers. Dessa forma, não codificamos senhas no arquivo de configuração.

      A seção labels é onde você especifica os valores de configuração do Traefik. As labels do Docker não fazem nada sozinhas, mas o Traefik as lê para saber como tratar os containers. Veja o que cada uma dessas labels faz:

      • traefik.backend especifica o nome do serviço de backend no Traefik (que aponta para o container real blog).
      • traefik.frontend.rule=Host:blog.seu_domínio diz ao Traefik para examinar o host solicitado e, se ele corresponde ao padrão de blog.seu_domínio, ele deve rotear o tráfego para o container blog.
      • traefik.docker.network=web especifica qual rede procurar sob o Traefik para encontrar o IP interno para esse container. Como o nosso container Traefik tem acesso a todas as informações do Docker, ele possivelmente levaria o IP para a rede internal se não especificássemos isso.
      • traefik.port especifica a porta exposta que o Traefik deve usar para rotear o tráfego para esse container.

      Com essa configuração, todo o tráfego enviado para a porta 80 do host do Docker será roteado para o container blog.

      Atribuímos este container a duas redes diferentes para que o Traefik possa encontrá-lo através da rede web e possa se comunicar com o container do banco de dados através da rede internal.

      Por fim, a chave depends_on informa ao Docker Compose que este container precisa ser iniciado após suas dependências estarem sendo executadas. Como o WordPress precisa de um banco de dados para ser executado, devemos executar nosso container mysql antes de iniciar nosso containerblog.

      Em seguida, configure o serviço MySQL adicionando esta configuração ao seu arquivo:

      docker-compose.yml

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

      Estamos usando a imagem oficial do MySQL 5.7 para este container. Você notará que estamos mais uma vez usando um item environment sem um valor. As variáveis MYSQL_ROOT_PASSWORD eWORDPRESS_DB_PASSWORD precisarão ser configuradas com o mesmo valor para garantir que nosso container WordPress possa se comunicar com o MySQL. Nós não queremos expor o container mysql para o Traefik ou para o mundo externo, então estamos atribuindo este container apenas à rede internal. Como o Traefik tem acesso ao soquete do Docker, o processo ainda irá expor um frontend para o container mysql por padrão, então adicionaremos a label traefik.enable=false para especificar que o Traefik não deve expor este container.

      Por fim, adicione essa configuração para definir o container do Adminer:

      docker-compose.yml

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

      Este container é baseado na imagem oficial do Adminer. A configuração network e depends_on para este container corresponde exatamente ao que estamos usando para o container blog.

      No entanto, como estamos redirecionando todo o tráfego para a porta 80 em nosso host Docker diretamente para o container blog, precisamos configurar esse container de forma diferente para que o tráfego chegue ao container adminer. A linha traefik.frontend.rule=Host:db-admin.seu_domínio diz ao Traefik para examinar o host solicitado. Se ele corresponder ao padrão do db-admin.seu_domínio, o Traefik irá rotear o tráfego para o container adminer.

      Neste ponto, docker-compose.yml deve ter o seguinte conteúdo:

      docker-compose.yml

      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.seu_domínio
            - 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.seu_domínio
            - traefik.docker.network=web
            - traefik.port=8080
          networks:
            - internal
            - web
          depends_on:
            - mysql
      

      Salve o arquivo e saia do editor de texto.

      Em seguida, defina valores em seu shell para as variáveis WORDPRESS_DB_PASSWORD e MYSQL_ROOT_PASSWORD antes de iniciar seus containers:

      • export WORDPRESS_DB_PASSWORD=senha_segura_do_banco_de_dados
      • export MYSQL_ROOT_PASSWORD=senha_segura_do_banco_de_dados

      Substitua senha_segura_do_banco_de_dados pela sua senha do banco de dados desejada. Lembre-se de usar a mesma senha tanto para WORDPRESS_DB_PASSWORD quanto para MYSQL_ROOT_PASSWORD.

      Com estas variáveis definidas, execute os containers usando o docker-compose:

      Agora, dê outra olhada no painel de administrador do Traefik. Você verá que agora existe um backend e um frontend para os dois servidores expostos:

      Populated Traefik dashboard

      Navegue até blog.seu_domínio, substituindo seu_domínio pelo seu domínio. Você será redirecionado para uma conexão TLS e poderá agora concluir a configuração do WordPress:

      WordPress setup screen

      Agora acesse o Adminer visitando db-admin.seu_domínio no seu navegador, novamente substituindo seu_domínio pelo seu domínio. O container mysql não está exposto ao mundo externo, mas o container adminer tem acesso a ele através da rede internal do Docker que eles compartilham usando o nome do container mysql como um nome de host.

      Na tela de login do Adminer, use o nome de usuário root, use mysql para o server, e use o valor que você definiu para MYSQL_ROOT_PASSWORD para a senha. Uma vez logado, você verá a interface de usuário do Adminer:

      Adminer connected to the MySQL database

      Ambos os sites agora estão funcionando, e você pode usar o painel em monitor.seu_domínio para ficar de olho em suas aplicações.

      Conclusão

      Neste tutorial, você configurou o Traefik para fazer proxy das solicitações para outras aplicações em containers Docker.

      A configuração declarativa do Traefik no nível do container da aplicação facilita a configuração de mais serviços, e não há necessidade de reiniciar o container traefik quando você adiciona novas aplicações para fazer proxy, uma vez que o Traefik percebe as alterações imediatamente através do arquivo de soquete do Docker que ele está monitorando.

      Para saber mais sobre o que você pode fazer com o Traefik, consulte a documentação oficial do Traefik. Se você quiser explorar mais os containers Docker, confira Como Configurar um Registro Privado do Docker no Ubuntu 18.04 ou How To Secure a Containerized Node.js Application with Nginx, Let's Encrypt, and Docker Compose. Embora esses tutoriais sejam escritos para o Ubuntu 18.04, muitos dos comandos específicos do Docker podem ser usados para o CentOS 7.



      Source link