Blog

Proxying av Docker-containrar med Traefik

DEC 19, 2016

En inblick i den nya världen av tjänsteidentifiering

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 är en reverse proxy och särskilt användbar när du kör containrar. I det här blogginlägget tittar vi på hur du kan proxy:a en Jenkins-container som körs på en Docker-värd via Traefik, och sedan även driftsätta en Artifactory-container på samma port men på en annan subdomän.

Det här kommer du att använda

Exemplet vi ska visa använder din lokala laptop och exempelcontainrar för Jenkins och Artifactory, två tjänster som våra kunder ofta använder. Vi använder lokala värdar och värdnamn, så vi behöver inte hantera riktig DNS.

Jenkins körs på portarna 8080 och 50000. Vi vill exponera det som körs på port 8080 på proxyns port 80. Vi vill tillhandahålla tjänsten under domänen praqma.io som en subdomän: http://jenkins.praqma.io.

På vår laptop pekar inte jenkins.praqma.io mot vår dator, så vi lägger till den i hosts-filen.

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

Ersätt IP-adressen med din laptops IP-adress.

Starta Jenkins-containern

Nu startar vi Jenkins Docker-container. Vi behöver ge den en etikett eftersom Traefik väljer den första exponerade porten, och för Jenkins väljer den automatiskt fel exponerad port. Därför är det en bra idé att ge Traefik etiketter för att säkerställa att rätt port väljs. Vi lägger alltså till etiketten traefik.port=8080 för att tala om för Traefik att använda den här porten i stället. Vi ger containern ett namn (Jenkins). Det blir subdomänen.

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

Förbered en Traefik-konfiguration

Vi har redan en Jenkins-container som körs, men Traefik kan även användas för containrar som redan körs. Låt oss därför konfigurera och starta Traefik.

Skapa och redigera en traefik.toml som instruerar den att lyssna på Docker-socketen efter ändringar. Traefik konfigureras då om när ändringar sker, till exempel om en container startar eller stoppas.

Delen [web] lägger till en Traefik-webbpanel där vi kan se våra frontends, backends och status. Den tillhandahåller den här panelen på port 8088.

I avsnittet [docker] anger vi sökvägen till docker.sock, domänen vi vill använda och om Traefik ska fortsätta lyssna efter ändringar eller inte.

Vi vill exponera alla containrar som standard, vilket anges med exposedbydefault = true. Den här värden körs inte i Swarm-läge, så vi ställer in swarmmode på 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

Starta Traefik-proxyn

Nu är vi redo att starta Traefik-proxyservern och ange konfigurationsfilen som ett alternativ.

Först laddar vi ner den senaste binärfilen för Traefik här: ladda ner Traefik

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

Klart. Traefik lyssnar på docker.sock efter containrar och ändringar på värden, och gör containrarna tillgängliga för omvärlden.

Lägg till huvuddomänen i din hosts-fil

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

Testa proxyn

Gå nu till Traefiks dashboard på praqma.io:8088 för information om Traefik.

Traefik consol

Du ser att vi har en frontend och en backend. Regeln för frontend är: Host:jenkins.praqma.io. Backend använder vår Docker-container för att ta emot trafiken.

Prova nu att besöka Jenkins

öppna http://jenkins.praqma.io

Du bör nu se Jenkins startsida:

Jenkins start page

Starta Artifactory

Nu startar vi Artifactory och vill att det ska vara tillgängligt via DNS-adressen artifactory.praqma.io.

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

Lägg till Artifactory i din hosts-fil

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

Nu ska Traefik upptäcka vår Artifactory-container och automatiskt göra den tillgänglig på http://artifactory.praqma.io.

Du kommer att se att Artifactory har lagts till i dashboarden.

Traefik consol

Stoppa Jenkins

Stoppa nu Jenkins-containern medan du tittar på Traefik-konsolen.

docker stop jenkins

Nästa gång

Nu kan vi starta Docker-containrar på en enskild host och få dem proxade. Men containrar på en enskild host är inte framtiden. Det är orkestrerare som Swarm och Kubernetes.

I nästa blogginlägg konfigurerar vi Traefik för att ansluta till API-servern (master) i ett Kubernetes-kluster och göra samma sak där. I Kubernetes finns dessutom ett objekt som kallas Ingress och som vi kommer att dra nytta av.

Håll utkik..!

  • Cloud

Subscribe to our newsletter