Docker Container mit Let's Encrypt online bringen

linux Mai 23, 2020

Beim Bereitstellen von Webanwendungen auf Basis eines Docker-Containers steht man oftmals vor der Frage, wie man diese auch mit HTTPS (am einfachsten mit Let's Encrypt Zertifikat) bereitstellen kann.
Dann kommt es durchaus mal vor, dass am selben Host noch ein weiterer Container für eine andere Webanwendung dazukommt, welcher ebenfalls unter Port 80 und 443 erreichbar sein soll.

Dafür gibt es eine Lösung: Traefik! - ein Reverse Proxy und Load Balancer, welcher die sichere Veröffentlichung von Containern sehr einfach gestaltet.
Dieser kann HTTP-Anfragen abhängig von der aufgerufenen Domain bzw. Subdomain zum richtigen Container leiten oder mehrere gleiche Container Loadbalancen. Und ein sehr wichtiges Feature ist außerdem noch die Unterstützung von Let's Encrypt Zertifikaten.

Wie ihr eure Container mit einem Let's Encrypt Zertifikat abgesichert ins Internet bringt, zeigen wir euch in den nachfolgenden Schritten.

Als allererstes solltet ihr sicherstellen, dass auf eurem System neben Docker auch Docker Compose bereitsteht.

Für unser Beispiel erstellen wir eine neue Datei mit dem Namen docker-compose.yml in unserem Projektordner (das kann zum Beispiel /opt/docker/traefik/ sein).

docker-compose.yml:

services:
  traefik:
    image: "traefik:v2.2"
    restart: unless-stopped
    command:
      - "--api.insecure=false"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.http.address=:80"
      - "--entrypoints.https.address=:443"
      - "--certificatesResolvers.letsencrypt.acme.email=user@example.com"
      - "--certificatesResolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
      - "--certificatesResolvers.letsencrypt.acme.httpChallenge=true"
      - "--certificatesResolvers.letsencrypt.acme.httpChallenge.entryPoint=http"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "./letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
    networks:
      - webapp_public

  hello-world:
    image: nginxdemos/hello
    restart: unless-stopped
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.helloworld.entrypoints=http"
      - "traefik.http.routers.helloworld.rule=Host(`test.ortner-it.at`)"
      - "traefik.http.routers.helloworld.middlewares=helloworld-https-redirect"
      - "traefik.http.routers.helloworld-secure.entrypoints=https"
      - "traefik.http.routers.helloworld-secure.rule=Host(`test.ortner-it.at`)"
      - "traefik.http.routers.helloworld-secure.tls=true"
      - "traefik.http.routers.helloworld-secure.tls.certresolver=letsencrypt"
      - "traefik.http.routers.helloworld-secure.service=helloworld"
      - "traefik.http.middlewares.helloworld-https-redirect.redirectscheme.scheme=https"
      - "traefik.http.services.helloworld.loadbalancer.server.port=80"
    networks:
      - webapp_public

networks:
  webapp_public:

Im Service "traefik" muss im nachfolgenden Command noch unbedingt die Mailadresse angepasst werden:
"--certificatesResolvers.letsencrypt.acme.email=deine@mailadresse.at"

Anschließend muss im Service der Webanwendung (in unserem Beispiel hello-world) noch die Domain in den Labels angepasst werden, unter welche die Anwendung erreichbar sein soll (in unserem Fall test.ortner-it.at):
- "traefik.http.routers.hello-world.rule=Host('test.ortner-it.at')"
- "traefik.http.routers.hello-world-secure.rule=Host('test.ortner-it.at')"

Das Label für den Router hello-world ist für HTTP zuständig. Mit diesem wird dann eine Weiterleitung mittels der Middleware hello-world-https-redirect auf HTTPS (hello-world-secure) durchgeführt.

Mehr zur Funktionsweise der einzelnen Labels kann in der Dokumentation von Traefik nachgelesen werden - https://docs.traefik.io/


Sobald alles angepasst wurde, solltet ihr noch sicherstellen, dass die DNS-Einträge für eure Subdomains gesetzt sind und entsprechend auf euren Docker-Host verweisen. Das ist für die Ausstellung von Let's Encrypt Zertifikaten notwendig.

Wenn alle Vorbereitungen getroffen wurden, kann es auch schon los gehen!

Ihr solltet euch im Verzeichnis befinden, in dem auch die docker-compose.yml liegt.
Dann könnt ihr mit dem Befehl docker-compose up -d die Container starten.

Wenn ihr dann den Browser öffnet, sollte die Webanwendung nun erreichbar sein:


Falls ihr schon eigene Docker Compose-Dateien für eure Projekte habt, so könnt ihr diese auch bestehen lassen und die Labels der Webanwendung wie im obigen Beispiel hello-world anpassen und übertragen.
Traefik kann sich dann in einer eigenständigen Docker Compose-Datei befinden und aktualisiert die Konfiguration automatisch anhand der Labels - und das sogar live :)
Ihr müsst also nicht unbedingt alle Container in eine Docker-Compose-Datei verpacken.

Wichtig ist dabei nur, dass bestehenden Anwendungen den Port 80 und 443 nicht belegen (-> das Port-Mapping bestehender Webanwendungen kann auskommentiert bzw. entfernt werden).

Außerdem sollte sichergestellt werden, dass der Traefik Container und eure Webanwendung das selbe Docker-Netzwerk zugewiesen haben.



Großartig! Das Abonnement wurde erfolgreich abgeschlossen.
Großartig! Schließen Sie als Nächstes die Kaufabwicklung ab, um vollen Zugriff zu erhalten.
Willkommen zurück! Sie haben sich erfolgreich angemeldet.
Erfolg! Ihr Konto ist vollständig aktiviert, Sie haben jetzt Zugang zu allen Inhalten.