Caddy es un popular servidor web moderno diseñado para un alto rendimiento y seguridad de la memoria. Está escrito en Go, se ejecuta sin dependencias, cuenta con soporte integrado para la representación de sitios estáticos con Markdown y ofrece HTTPS automático.
Caddy se enfoca en proporcionar una experiencia de administración de servidor simple que le brinda una funcionalidad útil de forma predeterminada. Puede ser más fácil de configurar y mantener que los sistemas rivales como Apache y NGINX. En este artículo, le mostraremos cómo hacer que su propio servidor funcione con una configuración mínima usando Docker con la imagen oficial de Caddy.
Selección de una etiqueta de imagen
La imagen de Caddy viene en algunos sabores diferentes. Todos comparten la última versión de Caddy, que es v2.4 en el momento de escribir este artículo. Puedes usar 2.4.x
(reemplazando x
con una versión de parche específica), 2.4
o 2
para anclar al componente principal, secundario o parche.
Caddy funciona con hosts Docker de Linux y Windows. Alpine Linux, Windows Server Core 1809 y Windows Server Core 2016 LTSC son las opciones actuales del sistema operativo. Hacer referencia a una etiqueta de Caddy simple como caddy:2
seleccionará la imagen apropiada para su plataforma; puedes usar variaciones como 2.4-alpine
o 2.4.6-windowsservercore-1809
en lugar de ser más explícito.
Inicio de un servidor básico
Caddy se envía en una configuración lista para funcionar. La imagen de Docker servirá su contenido web desde el /usr/share/caddy
directorio. Puede agregar sus archivos al contenedor montando un directorio de host en esta ruta.
Caddy también tiene directorios de configuración y datos separados en los que debe montar los volúmenes de Docker. los /config
el directorio es opcional pero recomendado; almacena sus archivos de configuración, pero como estos se convierten en solicitudes de API, no es estrictamente necesario que se conserven. los /data
la ubicación es vital, ya que contiene certificados TLS generados por Caddy, claves privadas y la configuración final del servidor que ha sido procesada por la API.
docker run -d -p 80:80 -v ./my-website:/usr/share/caddy/ -v caddy-config:/config -v caddy_data:/data caddy:2
Como servidor HTTP, Caddy escucha en el puerto 80 de forma predeterminada. Esto está vinculado al puerto 80 en su host a través del -p
marca en el ejemplo anterior.
Ahora puedes visitar http://localhost
en su navegador para acceder a su sitio. Deberías ver el index.html
desde su directorio de contenido montado. Obtendrá la página de destino predeterminada de Caddy si no vinculó nada a /usr/share/caddy
.
Configuración de HTTPS
Una de las características principales de Caddy es su compatibilidad automática con TLS, por lo que sería negligente no utilizarla. Debe vincular el puerto 443 además del puerto 80 para que Caddy pueda recibir tráfico HTTPS. El único otro cambio es proporcionar el nombre de dominio en el que se publicará su sitio. Todo lo demás está a cargo de Caddy.
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
El comando después del nombre de la imagen se pasa por docker run
al punto de entrada de la imagen de Docker. En este caso, significa caddy file-server ...
se ejecuta como el proceso de primer plano del contenedor. los --domain
se utiliza para establecer el dominio para el que Caddy adquirirá un certificado HTTPS. Debe verificar que tiene un registro DNS de tipo A que hace referencia a la IP de su host Docker antes de iniciar el contenedor.
Agregar su propio archivo Caddy
Caddy normalmente usa un archivo de configuración llamado Caddyfile
para definir rutas y cambiar la configuración del servidor. La imagen Docker carga el Caddyfile en /etc/caddy/Caddyfile
. Monte su propio archivo en esta ruta para anular la configuración predeterminada que sirve /usr/share/caddy
:
docker run -d -p 80:80 -p 443:443 -v ./Caddyfile:/etc/caddy/Caddyfile -v caddy_data:/data caddy:2
Aquí hay un Caddyfile simple para un sitio llamado example.com
con HTTPS habilitado:
{ email [email protected] } example.com { respond "It works!" }
Esta configuración mínima establece la dirección de correo electrónico global en [email protected]
. Este correo electrónico se utilizará al realizar solicitudes de certificados de Let's Encrypt. los example.com
block proporciona reglas de enrutamiento para el manejo de solicitudes de Caddy a su dominio. En este caso, el servidor siempre responderá con un mensaje estático.
Más información sobre Caddyfile está disponible en la documentación de Caddy. Docker no cambia nada aquí: siempre que su archivo esté disponible en /etc/caddy/Caddyfile
Caddy lo cargará y lo usará.
Creación de imágenes de Docker para sus sitios
Hasta ahora, hemos analizado el uso ad-hoc de Caddy iniciando contenedores directamente desde la imagen base de Caddy. En la práctica, es más probable que desee crear imágenes dedicadas para sus sitios para que no tenga que montar su contenido cada vez que inicie un contenedor.
La imagen base de Caddy está lista para extenderse con sus propias instrucciones para agregar contenido y configuración. Aquí hay un Dockerfile de ejemplo que incluye un archivo Caddy y copia el contenido de su sitio en un directorio personalizado:
FROM caddy:2.4 WORKDIR /my-site COPY Caddyfile /etc/caddy/Caddyfile COPY *.html ./ COPY *.css css/ COPY *.js js/
Ahora puede crear y ejecutar su imagen para iniciar un servidor Caddy que está preconfigurado para su sitio:
docker build -t my-site:latest . docker run -p 80:80 -p 443:443 -v caddy_data:/data my-site:latest
Con muchos sitios querrás incluir módulos adicionales de Caddy para funcionalidad adicional. La mejor manera de manejarlos en su Dockerfile es a través del dedicado de Caddy. builder
imagen. Esto incluye las herramientas necesarias para armar una instancia personalizada de Caddy con módulos específicos instalados.
Las compilaciones de varias etapas de Docker son ideales para este flujo de trabajo. Aquí hay un ejemplo que agrega Caddy's replace-response
módulo para que pueda reescribir porciones de datos de respuesta usando reglas en un 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/
La primera etapa de construcción produce un binario Caddy con el replace-response
módulo horneado. los xcaddy
El comando disponible en la imagen del constructor coloca su salida en /usr/bin/caddy
. La segunda etapa utiliza la imagen base estándar de Caddy, pero sobrescribe el binario incluido con el creado a medida. Luego, su contenido se superpone como de costumbre; el resultado es un servidor Caddy que incorpora módulos adicionales al tiempo que conserva la compatibilidad total con el resto de las funciones de la imagen base de Docker.
Resumen
Caddy es un servidor web moderno que es una excelente opción para servir archivos estáticos de manera eficiente. Ofrece un conjunto de características atractivas con soporte de primera clase para HTTPS, renderizado de plantillas incorporado e integración de Markdown.
El uso de Docker para alojar su servidor Caddy le brinda una forma rápida de implementar una instancia sin descargar archivos binarios o instalar archivos de servicio manualmente. Es una buena manera de probar Caddy o ejecutarlo junto con cargas de trabajo existentes en una configuración de clúster.
Como Caddy puede actuar como proxy inverso y equilibrador de carga, puede usarlo como punto de entrada para enrutar el tráfico a sus otros contenedores de Docker. El popular módulo Caddy Docker Proxy amplía las capacidades integradas del servidor con soporte similar a Traefik para el descubrimiento automático de rutas a través de etiquetas de contenedores Docker.
Caddy adopta un enfoque de configuración que prioriza la API, lo que simplifica la gestión de instancias que se ejecutan dentro de un contenedor. No necesita preocuparse demasiado por inyectar archivos de configuración o administrar volúmenes. Siempre y cuando el /data
se conserva el directorio, puede realizar solicitudes de API para modificar la operación de Caddy sin tener que usar la CLI de Docker. Esto puede convertirlo en una mejor opción para la creación de contenedores en comparación con opciones más tradicionales como Apache y NGINX.