Поиск по сайту:

Как развернуть веб-сервер Caddy с помощью Docker


Caddy — популярный современный веб-сервер, разработанный для обеспечения высокой производительности и безопасности памяти. Он написан на Go, работает без зависимостей, имеет встроенную поддержку рендеринга статического сайта с помощью Markdown и предлагает автоматический HTTPS.

Caddy сосредоточен на предоставлении простого опыта управления сервером, который по умолчанию предоставляет вам полезные функции. Его проще настраивать и обслуживать, чем конкурирующие системы, такие как Apache и NGINX. В этой статье мы покажем, как запустить собственный сервер с минимальной настройкой, используя Docker с официальным образом Caddy.

Выбор тега изображения

Изображение Caddy представлено в нескольких вариантах. Последняя версия Caddy используется всеми, это версия 2.4 на момент написания. Вы можете использовать 2.4.x (заменив x конкретной версией исправления), 2.4 или 2 для закрепления к основному, второстепенному или патчному компоненту.

Caddy работает с хостами Linux и Windows Docker. Alpine Linux, Windows Server Core 1809 и выпуск Windows Server Core 2016 LTSC являются текущими вариантами операционной системы. Ссылка на голый тег Caddy, такой как caddy:2, выберет подходящее изображение для вашей платформы; вместо этого вы можете использовать такие варианты, как 2.4-alpine или 2.4.6-windowsservercore-1809, чтобы быть более явным.

Запуск базового сервера

Caddy поставляется в готовой к работе конфигурации. Образ Docker будет обслуживать ваш веб-контент из каталога /usr/share/caddy. Вы можете добавить свои файлы в контейнер, смонтировав каталог хоста по этому пути.

Caddy также имеет отдельные каталоги конфигурации и данных, в которые вы должны монтировать тома Docker. Каталог /config является необязательным, но рекомендуемым; он хранит ваши файлы конфигурации, но, поскольку они преобразуются в запросы API, их не обязательно сохранять. Расположение /data имеет жизненно важное значение, поскольку оно содержит сертификаты TLS, созданные Caddy, закрытые ключи и окончательную конфигурацию сервера, обработанную API.

docker run -d -p 80:80 
    -v ./my-website:/usr/share/caddy/ 
    -v caddy-config:/config
    -v caddy_data:/data
    caddy:2

Как HTTP-сервер, Caddy по умолчанию прослушивает порт 80. Это связано с портом 80 на вашем хосте с помощью флага -p в приведенном выше примере.

Теперь вы можете посетить http://localhost в своем браузере, чтобы получить доступ к своему сайту. Вы должны увидеть index.html из каталога вашего смонтированного контента. Вы получите целевую страницу Caddy по умолчанию, если ничего не привязывали к /usr/share/caddy.

Настройка HTTPS

Одной из главных особенностей Caddy является автоматическая поддержка TLS, поэтому было бы упущением не использовать ее. Вам необходимо привязать порт 443 в дополнение к порту 80, чтобы Caddy мог получать трафик HTTPS. Единственное другое изменение — указать доменное имя, на котором будет обслуживаться ваш сайт. Всем остальным занимается Кэдди.

docker run -d -p 80:80 -p 443:443 
    -v ./my-website:/usr/share/caddy/ 
    -v caddy-config:/config
    -v caddy_data:/data
    caddy:2 caddy file-server --domain example.com

Команда после имени образа передается docker run в точку входа образа Docker. В данном случае это означает, что caddy file-server ... выполняется как процесс переднего плана контейнера. Флаг ---domain используется для установки домена, для которого Caddy получит сертификат HTTPS. Вы должны убедиться, что у вас есть DNS-запись типа A, ссылающаяся на IP-адрес вашего хоста Docker, прежде чем запускать контейнер.

Добавление собственного Caddyfile

Caddy обычно использует файл конфигурации с именем Caddyfile для определения маршрутов и изменения настроек сервера. Образ Docker загружает Caddyfile в /etc/caddy/Caddyfile. Смонтируйте свой собственный файл по этому пути, чтобы переопределить настройки по умолчанию, которые обслуживают /usr/share/caddy:

docker run -d -p 80:80 -p 443:443 
    -v ./Caddyfile:/etc/caddy/Caddyfile
    -v caddy_data:/data
    caddy:2

Вот простой Caddyfile для сайта example.com с включенным HTTPS:

{
    email example@example.com
}

example.com {
    respond "It works!"
}

Эта минимальная конфигурация задает глобальный адрес электронной почты example@example.com. Этот адрес электронной почты будет использоваться при отправке запросов на сертификат Let’s Encrypt. Блок example.com предоставляет правила маршрутизации для обработки Caddy запросов к вашему домену. В этом случае сервер всегда будет отвечать статическим сообщением.

Более подробная информация о Caddyfile доступна в документации Caddy. Docker здесь ничего не меняет: пока ваш файл доступен в /etc/caddy/Caddyfile, Caddy загрузит и использует его.

Создание образов Docker для ваших сайтов

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

Базовый образ Caddy готов к расширению вашими собственными инструкциями по добавлению контента и конфигурации. Вот пример Dockerfile, который включает Caddyfile и копирует содержимое вашего сайта в настраиваемый каталог:

FROM caddy:2.4
WORKDIR /my-site
COPY Caddyfile /etc/caddy/Caddyfile
COPY *.html ./
COPY *.css css/
COPY *.js js/

Теперь вы можете создать и запустить свой образ, чтобы запустить сервер Caddy, предварительно настроенный для вашего сайта:

docker build -t my-site:latest .
docker run -p 80:80 -p 443:443 -v caddy_data:/data my-site:latest

Добавление дополнительных модулей

На многих сайтах вы захотите включить дополнительные модули Caddy для дополнительной функциональности. Лучший способ справиться с этим в вашем Dockerfile — использовать специальный образ Caddy builder. Это включает в себя инструменты, необходимые для сборки пользовательского экземпляра Caddy с установленными указанными модулями.

Многоэтапные сборки Docker идеально подходят для этого рабочего процесса. Вот пример, который добавляет модуль Caddy replace-response, чтобы вы могли переписывать части данных ответа, используя правила в Caddyfile:

FROM caddy:2.4-builder AS caddy-build
RUN xcaddy build --with github.com/caddyserver/replace-response

FROM caddy:2.4
COPY --from=caddy-build /usr/bin/caddy /usr/bin/caddy
WORKDIR /my-site
COPY Caddyfile /etc/caddy/Caddyfile
COPY *.html ./
COPY *.css css/
COPY *.js js/

На первом этапе сборки создается двоичный файл Caddy со встроенным модулем replace-response. Команда xcaddy, доступная в образе компоновщика, помещает свой вывод в /usr/bin. /кедди. Второй этап использует стандартный базовый образ Caddy, но перезаписывает включенный двоичный файл созданным пользователем образом. Затем ваш контент накладывается как обычно; В результате сервер Caddy включает дополнительные модули, сохраняя при этом полную поддержку остальных функций базового образа Docker.

Краткое содержание

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

Использование Docker для размещения вашего сервера Caddy дает вам быстрый способ развернуть экземпляр без ручной загрузки двоичных файлов или установки служебных файлов. Это хороший способ опробовать Caddy или запустить его вместе с существующими рабочими нагрузками в кластере.

Поскольку Caddy может выступать в качестве обратного прокси-сервера и балансировщика нагрузки, вы можете использовать его в качестве точки входа для маршрутизации трафика в другие ваши контейнеры Docker. Популярный модуль Caddy Docker Proxy расширяет встроенные возможности сервера за счет поддержки Traefik для автоматического обнаружения маршрутов с помощью меток контейнеров Docker.

Caddy использует API-первый подход к настройке, который упрощает управление экземплярами, работающими внутри контейнера. Вам не нужно слишком беспокоиться о внедрении файлов конфигурации или управлении томами. Пока каталог /data сохраняется, вы можете делать запросы к API для изменения работы Caddy без использования интерфейса командной строки Docker. Это может сделать его лучшим выбором для контейнеризации по сравнению с более традиционными вариантами, такими как Apache и NGINX.