Развертывание любого защищенного SSL веб-сайта с помощью Docker и Traefik

Пол Кнульст в Docker — 8 мин. чтения


Что такое Docker?

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

Чтобы установить Docker на свою машину, скачайте установочный пакет с официальной страницы docker здесь: https://docs.docker.com/get-docker/.

Для работы с Docker необходимо ознакомиться со следующими ключевыми словами/понятиями: Контейнер, Dockerfiles, Docker-Images, Docker-Compose

Контейнер

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

Образы Docker

Образ Docker — это шаблон, доступный только для чтения, который используется для создания контейнера для запуска приложения в рамках платформы Docker. Он упаковывает приложения и предварительно настроенное серверное окружение для создания контейнера, который будет развернут. На официальном сайте DockerHub доступно несколько уже настроенных образов. Вы можете использовать функцию поиска, чтобы найти любой образ и развернуть его на своей системе:

    $ docker run -it "NAME_OF_IMAGE_FROM_DOCKERHUB"
Войти в полноэкранный режим Выйти из полноэкранного режима

Dockerfiles

Dockerfile — это обычный текстовый документ, содержащий все команды для настройки образа. Он содержит базовый образ для использования (операционная система) и дополнительное программное обеспечение, которое должно быть установлено на полученный образ.

Каждый раз, когда для контейнера Docker используется пользовательское содержимое, необходимо создать Dockerfile и заполнить его недостающей информацией.

В качестве примера, следующие два фрагмента демонстрируют использование Dockerfile. Первый из них расширяет изображение NGINX для обслуживания простого HTML-файла, который показан во втором фрагменте.

    FROM nginx
    COPY index.html /usr/share/nginx/html
Вход в полноэкранный режим Выход из полноэкранного режима
    <html>
    <h1>How To Deploy Docker</h1>
      <p>Learning IT. Level Up.</p>
      <p>This is a simple static website, built and deliver from a docker container</p>
      <p><a href="https://www.knulst.de/">Check out my blog here</a></p>
    </html>
Войти в полноэкранный режим Выход из полноэкранного режима

Если вы поместите оба файла в одну папку, вы можете запустить его с:

    $ docker build -t nginx-sample .
    $ docker run --name test-nginx -d -p 8080:80 nginx-sample
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь откройте ваш любимый веб-браузер и нажмите http://localhost:8080 (или http://your-ip:8080, если вы работаете на сервере).

Docker Compose

Docker Compose — это инструмент, который был разработан для создания многоконтейнерных приложений простым способом с помощью YAML-файла, который может содержать несколько контейнеров Docker.

Большое преимущество перед простыми Docker-файлами заключается в том, что он позволяет использовать простой «стековый» файл для всего стека приложений. Вы можете хранить один файл Compose в своем репозитории и развертывать все с помощью одной простой команды: docker-compose up -d.

Чтобы установить Docker Compose, следуйте официальному руководству: https://docs.docker.com/compose/install/.

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

Что такое Traefik?

Traefik делает сетевые технологии скучными

Облачный нативный сетевой стек, который просто работает.

Traefik используется для перенаправления входящих запросов к службе, развернутой в среде Docker. Кроме того, он способен автоматически создавать SSL-сертификаты Let’s Encrypt для каждого домена, которым управляет traefik.

Чтобы установить локальную службу Traefik в среде Docker, вы можете загрузить этот файл Docker Compose и выполнить следующие команды:

1. Создайте внешнюю сеть, которая будет использоваться для Traefik

    $ docker create network traefik-public
Войти в полноэкранный режим Выйти из полноэкранного режима

2. Экспортируйте необходимые переменные

    $ export PRIMARY_DOMAIN=yourdomain.de
    $ export TRAEFIK_SSLEMAIL=youremai@yourdomain.de
Войти в полноэкранный режим Выйти из полноэкранного режима

3. Развернуть

    $ docker-compose up -d
Войти в полноэкранный режим Выйти из полноэкранного режима

Чтобы получить доступ к приборной панели traefik, вы можете нажать [https://dashboard.yourdomain.de](https://dashboard.yourdomain.de/) и войти под своим логином:

    username: devadmin 
    password: devto
Войти в полноэкранный режим Выйти из полноэкранного режима

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

Настройка и развертывание вашего сайта

Создайте простой сайт

После изучения основ и настройки экземпляра Traefik вы можете приступить к созданию Dockerfile и Compose-файла для создания Docker-контейнера (сервиса) для вашего сайта.

Чтобы упростить эту процедуру, я разверну простой проект приборной панели, который я форкнул из потрясающего списка на GitHub. Чтобы получить копию этой приборной панели, скачайте последний zip-файл здесь или клонируйте репозиторий:

    $ git clone git@github.com:paulknulst/personal-dashboard.git
Войдите в полноэкранный режим Выйти из полноэкранного режима

В отличие от оригинального репозитория, я подправил index.html и CSS-файл, чтобы они были немного SEO-оптимизированы и имели 5 элементов в строке вместо 6.


Создайте новую папку (personal-dashboard) и извлеките (или переместите) файлы проекта в подпапку с именем html. Теперь откройте его в вашей любимой IDE, скопируйте config.sample.json в config.json и откройте его.

Измените его в соответствии с вашими потребностями и предоставьте свои личные ссылки. Я буду использовать следующие настройки:

    {
        "title" : "Pauls Simple Dashboard",
        "items" : [
            {
                "alt" : "Github",
                "icon" : "fab fa-github",
                "link" : "https://github.com/paulknulst"
            },
            {
                "alt" : "Twitter",
                "icon" : "fab fa-twitter",
                "link" : "https://twitter.com/paulknulst"
            },
            {
                "alt" : "Portfolio",
                "icon" : "fab fa-at",
                "link" : "https://www.paulknulst.de"
            },
            {
                "alt" : "Medium",
                "icon" : "fab fa-medium",
                "link" : "https://blog.paulknulst.de"
            }
        ]
    }
Войти в полноэкранный режим Выйти из полноэкранного режима

Создание Dockerfile

Dockerfile будет создан в папке simple-dashboard и будет содержать только базовое изображение и одну команду copy для добавления папки HTML в контейнер.

    FROM nginx
    COPY html /usr/share/nginx/html
Вход в полноэкранный режим Выход из полноэкранного режима

Создание файла композиции

Файл Compose также будет создан в папке simple-dashboard. Он содержит все параметры для настройки вашей персональной приборной панели в среде Docker. Кроме того, он будет использовать Traefik для включения генерации сертификатов Let’s Encrypt.

Полный файл Docker Compose, о котором будет рассказано далее:

    version: '3.4'

    services:
      web:
        image: personal-dashboard
        build:
          context: ./
          dockerfile: Dockerfile
        networks:
          - traefik-public
        healthcheck:
          test: curl --fail http://localhost || exit 1
          interval: 60s
          retries: 5
          start_period: 20s
          timeout: 10s
        labels:
          - traefik.enable=true
          - traefik.docker.network=traefik-public
          - traefik.constraint-label=traefik-public
          - traefik.http.routers.personal-dashboard-http.rule=Host(`personal-dashboard.${PRIMARY_DOMAIN}`) 
          - traefik.http.routers.personal-dashboard-http.entrypoints=http
          - traefik.http.routers.personal-dashboard-http.middlewares=https-redirect
          - traefik.http.routers.personal-dashboard-https.rule=Host(`personal-dashboard.${PRIMARY_DOMAIN}`) 
          - traefik.http.routers.personal-dashboard-https.entrypoints=https
          - traefik.http.routers.personal-dashboard-https.tls=true
          - traefik.http.routers.personal-dashboard-https.tls.certresolver=le
          - traefik.http.services.personal-dashboard.loadbalancer.server.port=80
          # - traefik.http.routers.personal-dashboard-https.middlewares=security-headers
        restart: unless-stopped


    networks:
      traefik-public:
        external: true
Вход в полноэкранный режим Выход из полноэкранного режима

В этом файле Compose вы можете увидеть, что мы определяем образ в строке 5 (personal-dashboard:v1). Кроме того, мы добавляем раздел сборки, поскольку образ официально не существует. В разделе build мы определяем, что для создания образа должен использоваться Dockerfile, расположенный в том же каталоге.

Часть networks (строки 9-10) содержит внешнюю сеть, которая была создана во время установки Traefik. Кроме того, в строках 33-35 мы специально определяем сеть как внешнюю для данного сервиса Compose.

Еще один очень важный раздел — healthcheck (строки 11-16). По моему мнению, эта часть должна содержаться в каждом файле Docker Compose, поскольку она помогает узнать, правильно ли работает Docker-контейнер без каких-либо ошибок во время выполнения. Для дальнейшего чтения посмотрите эту статью, в которой объясняется, как реализовать различные типы проверок работоспособности. в которой объясняется, как реализовать различные типы проверок работоспособности.

Наиболее важной частью этого файла Compose является раздел labels. Этот раздел содержит несколько меток, которые важны для Traefik. Во-первых, мы включаем Traefik (строка 18) для этой службы, потому что в нашей службе Traefik была опция не работать для каждой службы Docker. В строке 19 мы определяем, какая внешняя сеть используется для traefik.

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

В строках 21-25 мы определяем URL службы для HTTP и HTTPS. Для HTTP-части мы также активируем промежуточное ПО из конфигурации Traefik, которое всегда будет перенаправлять HTTP-запросы на HTTPS (строка 23).

Метки в строках 26 и 27 необходимы для создания автоматических SSL-сертификатов для этого сервиса Docker.

Строка 28 необходима для «раскрытия» внутреннего порта сервиса Docker для экземпляра Traefik. Все входящие запросы к URL, определенному в строке 21/24, будут перенаправляться к службе Docker на порт, указанный в этой метке.

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


Имейте в виду, что этот файл работает правильно, только если вы выполнили описанные выше шаги по настройке Traefik. В противном случае вам придется настроить PRIMARY_DOMAIN, внешнюю сеть Docker и точки входа, используемые для Traefik (http, https).

Развертывание веб-сайта

Теперь, когда вы закончили создание необходимых файлов, вы можете открыть CLI, перейти в папку проекта и запустить процесс развертывания, выполнив следующие действия:

    $ docker-compose up -d --build
Войти в полноэкранный режим Выйти из полноэкранного режима

После завершения процесса развертывания вы можете открыть панель управления в браузере, и если вы следовали этому руководству, она должна выглядеть следующим образом:

Заключительные заметки

Надеюсь, вам понравилось читать мое руководство, и теперь вы можете развернуть свой собственный сайт в контейнере Docker и улучшить его с помощью Traefik и SSL сертификатов.

Имейте в виду, что вы можете заменить папку HTML на любой другой статический сайт. Также вы можете расширить файл Compose другими сервисами, например, базой данных для вашего сайта. Кроме того, вы можете заменить образ на другой публичный образ из Docker Hub.

Чтобы помочь вам, я написал еще одно руководство о том, как развернуть сайт Kimai2 Timetracking, который также включает образ Docker Hub, настройки Traefik, базу данных и NGINX.

https://medium.com/geekculture/how-to-setup-kimai2-timetracking-locally-or-on-your-server-with-docker-compose-1287d9bc3722

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

Эта статья была первоначально опубликована в моем собственном блоге: https://www.knulst.de/deploy-any-ssl-secured-website-with-docker-and-traefik/.

Не стесняйтесь общаться со мной на Medium, LinkedIn, Twitter и GitHub.


Вы нашли эту статью ценной? Хотите поддержать автора? (… и поддержать разработку нынешних и будущих руководств!). Вы можете поддержать меня на Buy Me a Coffee или Ko-Fi. Кроме того, вы можете стать бесплатным или платным участником, зарегистрировавшись на этом сайте. Все (бесплатные или платные) способы выразить свою благодарность смотрите на странице «Вклад»!


Фото: Ариан Дарвиши / Unsplash

Оцените статью
devanswers.ru
Добавить комментарий