Zum Inhalt springen

Docker/Multi-Container

Aus Foxwiki

Docker/Multi-Container - Multi-Container Docker/Multi-Container - Beschreibung

Beschreibung

Mehrcontainer-Anwendungen

Die Mehrcontainer-Architektur trennt Zuständigkeiten, vereinfacht den Betrieb und ermöglicht gezieltes Skalieren. Datenbankkomponenten (z. B. MySQL) werden als separater Container ausgeführt.

Entwurfsprinzip

Ein Container = eine klar abgegrenzte Aufgabe

Anwendungsteile bleiben lose gekoppelt, Images bleiben kompakt und wartbar.

Vorteile
  • API/Frontend und Datenbank haben unterschiedliche Lastprofile und werden unabhängig skaliert.
  • Anwendungs- und DB-Images werden getrennt gebaut, getestet und aktualisiert.
  • Lokal kann die Datenbank in einem Container laufen; in der Produktion kann dasselbe System einen verwalteten Datenbankdienst nutzen – ohne Änderungen am Anwendungs-Image.
  • Pro Container ein Hauptprozess. Mehrere Prozesse erfordern einen Prozessmanager und erhöhen die Komplexität von Start/Shutdown.
Empfehlung
  • MySQL separat betreiben und die Anwendung als Verbund miteinander gekoppelter Container ausführen.
  • So bleibt die Architektur verständlich, betrieblich robust und leicht anpassbar (Skalierung, Updates, Umgebungswechsel).

Jetzt haben Sie eine Anwendung, die ihre Daten in einer externen Datenbank speichert, die in einem separaten Container läuft. Sie haben ein wenig über Container-Netzwerke und die Erkennung von Diensten mithilfe von DNS gelernt

Container-Vernetzung

Docker: gemeinsames Containernetzwerk
  • Standardmäßig sind Container isoliert und sehen weder Prozesse noch andere Container auf demselben Host.
  • Damit Container Daten austauschen können, benötigen sie ein gemeinsames Netzwerk.
  • Dazu müssen die Container in dasselbe Netzwerk eingebunden werden.

MySQL starten

Es gibt zwei Möglichkeiten, einen Container in ein Netzwerk einzubinden

  • Netzwerk beim Start des Containers zuweisen
  • Bereits laufenden Container mit einem Netzwerk verbinden

In diesem Abschnitt wird zuerst ein Netzwerk erstellt und der MySQL-Container beim Start daran angeschlossen.

  • Erstellen Sie das Netzwerk
docker network create todo-app
  • MySQL-Container starten und mit dem Netzwerk verbinden. Dabei werden Umgebungsvariablen gesetzt, die MySQL für die Initialisierung verwendet.
docker run -d \
    --network todo-app --network-alias mysql \
    -v todo-mysql-data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=secret \
    -e MYSQL_DATABASE=todos \
    mysql:8.0

Im vorherigen Befehl sehen Sie die --network-alias-Flagge. In einem späteren Abschnitt werden Sie mehr über dieses Flag erfahren.(!)

Hinweis
Der obige Befehl gibt das Volume todo-mysql-data an, das in /var/lib/mysql gemountet ist. Docker erstellt das Volume automatisch, falls es zuvor nicht mit docker volume create erstellt wurde.
Überprüfung der Verbindung zur Datenbank
docker exec -it <mysql-container-id> mysql -u root -p
Wenn die Passwortabfrage erscheint, geben Sie secret ein.
  • Führen Sie in der MySQL-Shell eine Liste der Datenbanken auf und überprüfen Sie, ob die Datenbank todos angezeigt wird
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| todos              |
+--------------------+
5 rows in set (0.00 sec)
  • Beenden Sie die MySQL-Shell, um zur Shell auf Ihrem Rechner zurückzukehren
mysql> exit

Sie haben jetzt eine todos-Datenbank und können sie benutzen

Verbindung zu MySQL herstellen

Nach dem Start des MySQL-Containers kann innerhalb desselben Docker-Netzwerks über DNS auf den Dienst zugegriffen werden (Hostname: mysql). Zur Überprüfung der Namensauflösung wird der Diagnose-Container nicolaka/netshoot verwendet.

  • Netshoot-Container im selben Netzwerk starten
docker run -it --network todo-app nicolaka/netshoot
  • Im Container DNS-Auflösung für den Hostnamen mysql testen
dig mysql

Das Ergebnis sollte in etwa wie folgt aussehen:

; <<>> DiG 9.18.8 <<>> mysql
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32162
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;mysql.				IN	A

;; ANSWER SECTION:
mysql.			600	IN	A	172.23.0.2

;; Query time: 0 msec
;; SERVER: 127.0.0.11#53(127.0.0.11)
;; WHEN: Tue Oct 01 23:47:24 UTC 2019
;; MSG SIZE  rcvd: 44
  • Im ANSWER SECTION erscheint ein A-Record für mysql, der auf 172.23.0.2 zeigt (die tatsächliche IP kann abweichen).
  • Die Auflösung erfolgt über den Docker-internen DNS-Resolver, weil dem MySQL-Container zuvor der Netzwerkalias --network-alias mysql zugewiesen wurde.
  • Docker-DNS läuft typischerweise unter 127.0.0.11 und löst Service-/Aliasnamen netzwerkintern.
  • mysql ist außerhalb des Docker-Netzwerks kein gültiger FQDN, innerhalb des Netzwerks jedoch als Alias nutzbar.

Anwendungen im selben Docker-Netzwerk verbinden sich daher einfach mit dem Hostnamen mysql.


Aufruf

Optionen

Unix GNU Parameter Beschreibung

Parameter

Umgebungsvariablen

Exit-Status

Wert Beschreibung
0 Erfolg
>0 Fehler

Anwendung

Problembehebung

Konfiguration

Dateien

Datei Beschreibung


Anhang

Siehe auch



Dokumentation

Links

Projekt

Weblinks

  1. MySQL Docker Hub Listing
  2. Docker CLI-Referenz
  3. Überblick über das Networking


TMP

Nächste Schritte

Im nächsten Abschnitt wird eine etwas bequemere Methode zur Interaktion von Containern mit Docker Compose vorgestellt.