Blog

Docker-Container mit Traefik proxyen

DEC 19, 2016

Ein Blick in die neue Welt der Service Discovery

Henrik Hoegh

Henrik is a DevOps Consultant based in Aarhus. He specializes in Docker, Kubernetes and everything Atlassian. Away from the office Henrik designs loudspeakers and takes a keen interest in quantum physics and astrophotography.

Traefik ist ein Reverse Proxy und besonders nützlich beim Betrieb von Containern. In diesem Blogbeitrag zeigen wir, wie wir einen auf einem Docker-Host laufenden Jenkins-Container über Traefik proxien und anschließend auch einen Artifactory-Container über denselben Port, aber unter einer anderen Subdomain, bereitstellen können.

Was ihr benötigt

Für das folgende Beispiel verwenden wir euren lokalen Laptop sowie Beispiel-Container für Jenkins und Artifactory – zwei Services, die unsere Kunden häufig einsetzen. Wir nutzen lokale Hosts und Hostnamen, sodass wir kein echtes DNS konfigurieren müssen.

Jenkins läuft auf den Ports 8080 und 50000. Wir möchten den auf Port 8080 bereitgestellten Dienst über Port 80 des Proxys verfügbar machen. Er soll unter der Domain praqma.io als Subdomain erreichbar sein: http://jenkins.praqma.io.

Auf unserem Laptop verweist jenkins.praqma.io nicht auf unseren Rechner, daher fügen wir ihn zu unserer Hosts-Datei hinzu.

echo "192.168.1.165 jenkins.praqma.io" >> /etc/hosts

Ersetzt die IP-Adresse durch die IP-Adresse eures Laptops.

Jenkins-Container starten

Jetzt starten wir den Jenkins-Docker-Container. Wir müssen ihm ein Label geben, da Traefik den ersten freigegebenen Port auswählt und bei Jenkins automatisch den falschen Port erkennt. Es empfiehlt sich daher, Traefik-Labels zu verwenden, um sicherzustellen, dass der richtige Port ausgewählt wird. Deshalb fügen wir das Label traefik.port=8080 hinzu, um Traefik mitzuteilen, dass stattdessen dieser Port bereitgestellt werden soll. Wir geben dem Container einen Namen (Jenkins). Dieser wird zur Subdomain.

docker run --name jenkins --label="traefik.port=8080" -d jenkins

Eine Traefik-Konfiguration vorbereiten

Wir haben bereits einen laufenden Jenkins-Container, aber Traefik kann auch für bereits laufende Container verwendet werden. Konfigurieren wir also Traefik und starten es.

Erstellt und bearbeitet eine traefik.toml, um Traefik anzuweisen, den Docker-Socket auf Änderungen zu überwachen. Traefik konfiguriert sich dann bei Änderungen neu, beispielsweise wenn ein Container gestartet oder gestoppt wird.

Der Abschnitt [web] fügt ein Traefik-Web-Dashboard hinzu, in dem wir unsere Frontends, Backends und den Status sehen können. Dieses Dashboard wird über Port 8088 bereitgestellt.

Im Abschnitt [docker] geben wir den Pfad zu docker.sock, die gewünschte Domain und an, ob Traefik weiterhin auf Änderungen warten soll.

Wir möchten standardmäßig alle Container bereitstellen, daher setzen wir exposedbydefault = true. Dieser Host läuft nicht im Swarm-Modus, deshalb setzen wir swarmmode auf false.

[web]  address = ":8088"  [web.statistics]################################################################# Docker configuration backend################################################################[docker]endpoint = "unix:///var/run/docker.sock"domain = "praqma.io"watch = true# Expose containers by default in traefikexposedbydefault = true# Use the IP address from the bound port instead of the inner network one. For specific use-case :)usebindportip = true# Use Swarm Mode services as data providerswarmmode = false

Traefik-Proxy starten

Jetzt können wir den Traefik-Proxy-Server starten und ihm die Konfigurationsdatei als Option übergeben.

Zuerst laden wir hier die neueste Traefik-Binärdatei herunter: Traefik-Download

wget https://github.com/containous/traefik/releases/download/v1.1.1/traefik_linux-amd64 chmod u+x traefik_linux-amd64 sudo ./traefik_linux-amd64 -c traefik.toml

Und schon ist es geschafft. Traefik überwacht docker.sock auf Container und Änderungen auf dem Host und stellt die Container für die Außenwelt bereit.

Die Hauptdomain zu eurer Hosts-Datei hinzufügen

echo "192.168.1.165 praqma.io" >> /etc/hosts

Den Proxy testen

Ruft jetzt das Traefik-Dashboard unter praqma.io:8088 auf, um Details zu Traefik zu sehen.

Traefik consol

Ihr seht, dass wir ein Frontend und ein Backend haben. Die Regel für das Frontend lautet: Host:jenkins.praqma.io. Das Backend verwendet unseren Docker-Container, um den Traffic weiterzuleiten.

Versucht nun, Jenkins aufzurufen.

Öffnet http://jenkins.praqma.io

Anschließend sollte die Jenkins-Startseite angezeigt werden:

Jenkins start page

Artifactory starten

Jetzt starten wir Artifactory und möchten, dass es über den DNS-Namen artifactory.praqma.io bereitgestellt wird.

docker run --name artifactory --label="traefik.port=8080" -d mattgruter/artifactory

Artifactory zu eurer Hosts-Datei hinzufügen

echo "192.168.1.165 artifactory.praqma.io" >> /etc/hosts

Jetzt sollte Traefik unseren Artifactory-Container erkennen und ihn automatisch unter http://artifactory.praqma.io bereitstellen.

Ihr werdet sehen, dass Artifactory zum Dashboard hinzugefügt wurde.

Traefik consol

Jenkins stoppen

Stoppt jetzt den Jenkins-Container, während ihr die Traefik-Konsole beobachtet.

docker stop jenkins

Nächstes Mal

Jetzt können wir Docker-Container auf einem einzelnen Host starten und sie über einen Proxy bereitstellen. Aber Container auf einem einzelnen Host sind nicht die Zukunft. Orchestratoren wie Swarm und Kubernetes sind es.

Im nächsten Blogbeitrag richten wir Traefik so ein, dass es sich mit dem API-Server (Master) eines Kubernetes-Clusters verbindet und dort denselben Trick anwendet. Nur in Kubernetes gibt es ein Objekt namens Ingress, das wir nutzen werden.

Bleibt dran ...!

  • Cloud

Subscribe to our newsletter