Docker proxy met Caddy

Een specifiek op Docker en Docker Compose toegesneden proxyservice als Traefik Proxy is erg handig. Uiteraard zijn er alternatieven met vergelijkbare voordelen qua gemak en veiligheid. De webserver Caddy ligt als alternatief misschien niet direct voor de hand, maar is mogelijk toch het overwegen waard.

Waarom een proxyservice voor Docker gebruiken?

Lokale poorten: foutgevoelig en minder veilig

Standaard is een Docker container alleen bereikbaar via een Docker netwerk. Om een container ook breder beschikbaar te maken kan gebruik gemaakt worden van de techniek "port mapping". Een poort van de host waarop de container draait kan worden gekoppeld aan een poort van de container. Zo kan bijvoorbeeld een webservice die in de container beschikbaar is op poort 80 op de host beschikbaar worden gemaakt op een beschikbare poort naar keuze, bijvoorbeeld 80 of 8080.
Een proxyservice op de host kan dan vervolgens een verzoek voor een specifiek domein op poort 80 doorsturen naar de lokale aan de container gekoppelde poort.

docker run -d -p 8080:80 --name httpd-container httpd

In bovenstaande opdracht wordt poort 8080 van de host gekoppeld aan poort 80 van de container.

De proxyservice moet handmatig worden ingesteld met een koppeling tussen domein en de lokale poort. Er is een goede administratie nodig om bij te houden welke container welke lokale poort in gebruik heeft.

Dit is een foutgevoelige manier van werken. Een dubbele toewijzing van een lokale poort of een koppeling van een URL aan een onjuiste poort is zo gemaakt.

Het is ook een manier van werken die het voordeel van isolatie deels ongedaan maakt. Het op de host beschikbaar maken van services op lokale poorten is minder veilig dan de geïsoleerde beschikbaarheid op een Docker netwerk.

Docker proxy: eenvoudig en veilig

Een specifieke Docker proxyservice deelt een Docker netwerk met de containers. Hierdoor is "port mapping" met de host overbodig is. Hierdoor verdwijnt het risico op dubbele poorttoewijzingen door "port mapping". Het is dus ook veiliger, gezien de containers niet beschikbaar zijn via lokale poorten van de host.

Naast de verhoogde veiligheid en verminderde foutgevoeligheid, brengen Traefik Proxy en Caddy ook eenvoud met zich mee voor de configuratie van de proxyservice. Die configuratie kan namelijk in het compose-bestand van de applicatiecontainer.

Integratie van de app in de proxy gaat vervolgens automatisch, net zoals het uitfaseren. Het opnemen van een nieuwe containerservice in een proxyservice komt neer op het opstarten van de container. Het uitfaseren komt neer op het stoppen van de container. De proxyconfiguratie staat samen de applicatieconfiguratie beschreven in het compose-bestand.

Wat is er bijzonder aan Caddy?

Caddy 2 - The Ultimate Server with Automatic HTTPS
Caddy is a powerful, enterprise-ready, open source web server with automatic HTTPS written in Go

Heeft Caddy voordelen boven Traefik Proxy? Waar de interface en documentatie van Traefik Proxy wat overweldigend kan overkomen, is Caddy een verademing qua eenvoud en duidelijkheid.

Geen dashboard

Caddy ontbeert een dashboard als Traefik Proxy, maar eerlijk is dat dashboard voor mij van weinig tot geen toegevoegde waarde.

Goede documentatie en eenvoudige configuratie

De documentatie van Caddy is helder. Hier kan Traefik Proxy niet aan tippen. De configuratie van Caddy is extreem eenvoudig en goed leesbaar. Ook hier scoort Traefik wat mij betreft minder goed.

Automatisch HTTPS

Onderscheidend voor Caddy is dat het er geen enkele configuratie nodig om HTTPS in te schakelen. Apart certificaatbeheer of extra configuratie om HTTPS in te schakelen is niet nodig. Traefik Proxy kan ook automatisch SSL-certificaten installeren en verversen, maar hiervoor is wel extra configuratie nodig. Bij Caddy gebeurt dit volautomatisch; uitzonderingen zijn configureerbaar.

Standaard instellingen

Caddy is beschikbaar als een enkel bestand en praktisch gebruiksklaar door goede standaardinstellingen en ingebouwde functionaliteiten, zoals de bovengenoemde automatisch HTTPS. Deze instellingen en opties zijn eenvoudig te configureren via een configuratiebestand of een API.

Hoe gebruik ik Caddy als proxy voor Docker?

De proxyservice is een standaard functionaliteit van de Caddy webserver. Voor het uitlezen van configuratie uit de docker-compose-bestanden is een plugin nodig: caddy-docker-proxy.

Deze plugin kan toegevoegd worden aan een bestaande Caddy service, maar het is eenvoudiger om gebruik te maken van de beschikbare container images.

De container van caddy-docker-proxy en de andere containers dienen deel uit te maken van eenzelfde Docker netwerkt. Applicatiespecifieke configuratie kan via labels in de composebestanden worden beschreven.

docker network create caddy

Opdrachtregel voor het aanmaken van een Docker netwerk.

services:
  caddy:
    image: lucaslorentz/caddy-docker-proxy:ci-alpine
    ports:
      - 80:80
      - 443:443
    environment:
      - CADDY_INGRESS_NETWORKS=caddy
    networks:
      - caddy
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - caddy_data:/data
    restart: unless-stopped

networks:
  caddy:
    external: true

volumes:
  caddy_data: {}

caddy/docker-compose.yml met configuratie voor het gedeeld Docker netwerk 'caddy' als omgevingsvariabele, als netwerk in de service 'caddy' en onder 'networks' beschreven als extern netwerk.

💡
Vragen of opmerkingen? Registreer en laat uw opmerkingen als commentaar achter. Hulp nodig, neem gerust contact op om af te stemmen hoe ik u kan helpen.