Docker - Container Linking

Einführung in das Container-Linking

Hallo, angehende Docker-Enthusiasten! Heute tauchen wir ein in die aufregende Welt des Container-Linkings. Als dein freundlicher Nachbarschafts-Computerlehrer bin ich hier, um dich auf dieser Reise zu führen, selbst wenn du noch nie eine Zeile Code geschrieben hast. Also, schnall dich an und lassen wir auf dem Meer der Container segeln!

Docker - Container Linking

Container-Linking ist wie das Vorstellen von zwei Freunden auf einer Party. Es ermöglicht Containern, miteinander zu kommunizieren und Informationen und Ressourcen zu teilen. Stell dir vor, du bist bei einem Buffet (das ist unser Docker-Host), und jedes Gericht (Container) muss wissen, welche anderen Gerichte verfügbar sind. Das ist im Grunde, was wir mit dem Container-Linking machen!

Warum Container-Linking wichtig ist

Du fragst dich vielleicht, "Warum sollte ich mir das Container-Linking ans Herz nehmen?" Nun, lass mich dir eine kleine Geschichte erzählen. Es war einmal, in einem Datenzentrum weit, weit entfernt, lebten Anwendungen in Isolation. Sie konnten nicht miteinander sprechen, Daten teilen oder zusammenarbeiten. Es war ein einsames Dasein. Doch dann kam das Container-Linking und änderte alles!

Container-Linking ermöglicht es uns:

  1. Komplexe, mehrsätzige Anwendungen zu erstellen
  2. Daten zwischen Containern zu teilen
  3. Die Sicherheit zu verbessern, indem Dienstleistungen isoliert werden
  4. Unsere Anwendungen einfacher zu skalieren

Grundlegendes Container-Linking

Lassen wir mit einem einfachen Beispiel beginnen. Wir erstellen zwei Container: einen Webserver und eine Datenbank, und verknüpfen sie miteinander.

Schritt 1: Erstellen des Datenbank-Containers

Zuerst erstellen wir unseren Datenbank-Container. Wir verwenden MySQL als Beispiel.

docker run -d --name mydb -e MYSQL_ROOT_PASSWORD=secret mysql:latest

Lassen wir das auseinanderbrechen:

  • -d: Führt den Container im Vordergrund aus
  • --name mydb: Gibt unserem Container einen Namen
  • -e MYSQL_ROOT_PASSWORD=secret: Setzt eine Umgebungsvariablen für das Root-Passwort
  • mysql:latest: Verwendet das neueste MySQL-Image

Schritt 2: Erstellen des Webserver-Containers

Nun erstellen wir unseren Webserver-Container und verknüpfen ihn mit der Datenbank.

docker run -d --name myweb --link mydb:db -p 80:80 nginx:latest

Hier ist, was passiert:

  • --link mydb:db: Das ist die Magie! Wir verknüpfen unseren mydb-Container und nennen ihn db innerhalb unseres Web-Containers
  • -p 80:80: Mapt Port 80 auf dem Host auf Port 80 im Container

Das Verständnis der Verknüpfung

Wenn wir die --link-Option verwenden, erledigt Docker mehrere Dinge für uns:

  1. Es fügt einen Eintrag in die /etc/hosts-Datei des Web-Containers hinzu
  2. Es setzt Umgebungsvariablen im Web-Container
  3. Es ermöglicht dem Web-Container, sich mit dem Datenbank-Container zu verbinden

Lassen wir einen Blick in unseren Web-Container werfen, um zu sehen, was passiert:

docker exec -it myweb bash

Sobald drinnen, können wir die /etc/hosts-Datei überprüfen:

cat /etc/hosts

Du solltest einen Eintrag für den db-Container mit seiner IP-Adresse sehen.

Umgebungsvariablen

Docker richtet auch Umgebungsvariablen für uns ein. Lassen wir sie auflisten:

env | grep DB_

Du wirst Variablen wie DB_PORT, DB_NAME, etc. sehen. Diese machen es einfach für unsere Anwendung, sich mit der Datenbank zu verbinden.

Legacy-Linking vs. Benutzerdefinierte Netzwerke

Nun habe ich ein Geständnis zu machen. Das --link-Flag, das wir gerade verwendet haben, wird in Docker actually als veraltet angesehen. Es ist wie das Benutzen eines Handys in der Ära der Smartphones – es funktioniert, aber es gibt bessere Optionen.

Der moderne Weg, Container zu verknüpfen, ist die Verwendung von benutzerdefinierten Netzwerken. Sehen wir uns das an:

Schritt 1: Erstellen eines Netzwerks

docker network create mynetwork

Schritt 2: Container im Netzwerk ausführen

docker run -d --name mydb --network mynetwork -e MYSQL_ROOT_PASSWORD=secret mysql:latest
docker run -d --name myweb --network mynetwork -p 80:80 nginx:latest

Jetzt können unsere Container miteinander kommunizieren, indem sie ihre Namen als Hostnamen verwenden, ohne explizites Linking!

Vorteile benutzerdefinierter Netzwerke

Benutzerdefinierte Netzwerke bieten mehrere Vorteile:

  1. Bessere Isolierung
  2. Automatische DNS-Auflösung
  3. Die Fähigkeit, Container jederzeit aus Netzwerken zu verbinden und zu trennen

Praktisches Beispiel: WordPress und MySQL

Lassen wir unser Wissen mit einem realen Beispiel anwenden: das Einrichten von WordPress mit MySQL.

Schritt 1: Erstellen eines Netzwerks

docker network create wordpress-network

Schritt 2: MySQL-Container ausführen

docker run -d --name wordpress-db --network wordpress-network -e MYSQL_ROOT_PASSWORD=rootpassword -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=wordpresspassword mysql:5.7

Schritt 3: WordPress-Container ausführen

docker run -d --name wordpress-site --network wordpress-network -e WORDPRESS_DB_HOST=wordpress-db -e WORDPRESS_DB_USER=wordpress -e WORDPRESS_DB_PASSWORD=wordpresspassword -e WORDPRESS_DB_NAME=wordpress -p 8080:80 wordpress:latest

Wenn du nun http://localhost:8080 in deinem Browser aufrufst, solltest du die WordPress-Einrichtungseite sehen!

Schlussfolgerung

Glückwunsch! Du hast gerade deine ersten Schritte in die Welt des Container-Linkings unternommen. Wir haben viel Boden coberter, von grundlegendem Linking bis hin zu benutzerdefinierten Netzwerken und haben sogar eine echte WordPress-Seite mit Containern eingerichtet.

Denke daran, dass Container-Linking darum geht, unsere Anwendungen in Harmonie zusammenarbeiten zu lassen. Es ist wie das Dirigieren eines Orchesters – jeder Container ist ein Instrument, und wenn sie richtig verknüpft sind, schaffen sie wundervolle Musik.

Wenn du deine Docker-Reise fortsetzt, experimentiere weiter mit verschiedenen Containern und Netzwerkoptionen. Je mehr du übst, desto wohler wirst du mit diesen Konzepten werden.

Viel Spaß beim Containerisieren, und möge deine Docker-Images stets erfolgreich gebaut werden!

Credits: Image by storyset