Zum Inhalt springen

Docker/Multi-Container

Aus Foxwiki
Version vom 9. August 2025, 11:42 Uhr von Dirkwagner (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „== Multi-Container == ; Multi-Container-Anwendungen Bis zu diesem Punkt haben Sie mit Einzelcontaineranwendungen gearbeitet. Aber jetzt werden Sie dem Anwendungsstapel MySQL hinzufügen. Dabei stellt sich oft die Frage: "Wo wird MySQL ausgeführt? Soll es im gleichen Container installiert oder separat ausgeführt werden?" Im Allgemeinen sollte jeder Container eine Aufgabe erfüllen, und zwar eine gute. Im Folgenden werden einige Gründe genannt, die dafü…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Multi-Container

Multi-Container-Anwendungen

Bis zu diesem Punkt haben Sie mit Einzelcontaineranwendungen gearbeitet. Aber jetzt werden Sie dem Anwendungsstapel MySQL hinzufügen. Dabei stellt sich oft die Frage: "Wo wird MySQL ausgeführt? Soll es im gleichen Container installiert oder separat ausgeführt werden?" Im Allgemeinen sollte jeder Container eine Aufgabe erfüllen, und zwar eine gute. Im Folgenden werden einige Gründe genannt, die dafür sprechen, den Container separat zu betreiben

  • Es ist gut möglich, dass Sie APIs und Front-Ends anders skalieren müssen als Datenbanken
  • Separate Container ermöglichen eine isolierte Versionierung und Aktualisierung der Versionen
  • Während Sie lokal einen Container für die Datenbank verwenden können, möchten Sie in der Produktion vielleicht einen verwalteten Dienst für die Datenbank nutzen. Sie möchten Ihre Datenbank-Engine dann nicht mit Ihrer Anwendung ausliefern
  • Die Ausführung mehrerer Prozesse erfordert einen Prozessmanager (der Container startet nur einen Prozess), was die Komplexität beim Starten und Herunterfahren des Containers erhöht

Und es gibt noch mehr Gründe. Wie das folgende Diagramm zeigt, ist es also am besten, Ihre Anwendung in mehreren Containern laufen zu lassen

Container-Vernetzung

Bedenken Sie, dass Container standardmäßig isoliert laufen und nichts über andere Prozesse oder Container auf demselben Rechner wissen. Wie kann man also einem Container erlauben, mit einem anderen zu kommunizieren? Die Antwort ist Networking. Wenn Sie die beiden Container in dasselbe Netzwerk einbinden, können sie miteinander kommunizieren

MySQL starten

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

  • Weisen Sie das Netzwerk beim Starten des Containers zu
  • Verbinden Sie einen bereits laufenden Container mit einem Netzwerk

In den folgenden Schritten werden Sie zuerst das Netzwerk erstellen und dann den MySQL-Container beim Start verbinden.# Erstellen Sie das Netzwerk

  • docker network create todo-app
  • Starten Sie einen MySQL-Container und verbinden Sie ihn mit dem Netzwerk. Sie werden auch ein paar Umgebungsvariablen definieren, die die Datenbank zur Initialisierung der Datenbank verwenden wird. Um mehr über die MySQL-Umgebungsvariablen zu erfahren, lesen Sie den Abschnitt "Environment Variables" im MySQL Docker Hub Listing

docker run -d \

--network todo-app --network-alias mysql \

-v todo-mysql-data:/var/lib/mysql \

-e MYSQL_ROOT_PASSWORD=secret \

-e MYSQL_DATENBANK=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.* Tipp

Im obigen Befehl sehen Sie ein Volume namens todo-mysql-data, das unter /var/lib/mysql gemountet ist, wo MySQL seine Daten speichert. Sie haben jedoch nie den Befehl docker volume create ausgeführt. Docker erkennt, dass Sie ein benanntes Volume verwenden möchten und erstellt dieses automatisch für Sie.* Um zu bestätigen, dass die Datenbank funktioniert, stellen Sie eine Verbindung zur Datenbank her und überprüfen Sie, ob sie sich verbindet

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> DATENBANKEN ANZEIGEN;

Sie sollten eine Ausgabe sehen, die wie folgt aussieht

  • +--------------------+

| Datenbank |

+--------------------+

| information_schema |

| mysql |

| performance_schema |

| sys |

| todos |

+--------------------+

5 Zeilen im Satz (0.00 sec)* Beenden Sie die MySQL-Shell, um zur Shell auf Ihrem Rechner zurückzukehren

  1. mysql> exit

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

Verbindung zu MySQL herstellen

Jetzt, wo Sie wissen, dass MySQL läuft, können Sie es benutzen. Aber wie benutzen Sie es? Wenn Sie einen anderen Container im selben Netzwerk betreiben, wie finden Sie den Container? Denken Sie daran, dass jeder Container seine eigene IP-Adresse hat

Um die obigen Fragen zu beantworten und die Container-Netzwerke besser zu verstehen, werden Sie den nicolaka/netshoot-Container verwenden, der eine Reihe von Werkzeugen enthält, die für die Fehlersuche und das Debuggen von Netzwerkproblemen nützlich sind.# Starten Sie einen neuen Container mit dem nicolaka/netshoot-Image. Stellen Sie sicher, dass er mit demselben Netzwerk verbunden ist

  • docker run -it --network todo-app nicolaka/netshoot
  • Innerhalb des Containers verwenden Sie den Befehl dig, ein nützliches DNS-Tool. Sie werden die IP-Adresse für den Hostnamen mysql nachschlagen

dig mysql

Sie sollten eine Ausgabe wie die folgende erhalten.# ; <<>> DiG 9.18.8 <<>> mysql

;; globale Optionen: +cmd

;; Antwort erhalten:

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32162

;; Flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTORITAET: 0, ZUSAETZLICH: 0

;; FRAGEABSCHNITT:

;mysql. IN A

;; ANTWORT-ABSCHNITT:

mysql. 600 IN A 172.23.0.2

;; Abfragezeit: 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 "ANTWORTABSCHNITT" sehen Sie einen A-Eintrag für mysql, der zu 172.23.0.2 aufgelöst wird (Ihre IP-Adresse wird höchstwahrscheinlich einen anderen Wert haben). Obwohl mysql normalerweise kein gültiger Hostname ist, war Docker in der Lage, ihn in die IP-Adresse des Containers aufzulösen, der diesen Netzwerkalias hatte. Erinnern Sie sich daran, dass Sie zuvor den --network-alias verwendet haben

Das bedeutet, dass Ihre Anwendung lediglich eine Verbindung zu einem Host namens mysql herstellen muss, damit sie mit der Datenbank kommunizieren kann

Starten Sie Ihre Anwendung mit MySQL

Die todo-App unterstützt das Setzen einiger Umgebungsvariablen, um die MySQL-Verbindungseinstellungen festzulegen. Diese sind

  • MYSQL_HOST - der Hostname für den laufenden MySQL-Server
  • MYSQL_USER - der Benutzername, der für die Verbindung verwendet werden soll
  • MYSQL_PASSWORD - das Passwort, das für die Verbindung verwendet werden soll
  • MYSQL_DB - die zu verwendende Datenbank nach der Verbindung

Hinweis

Während die Verwendung von env vars zur Festlegung von Verbindungseinstellungen für die Entwicklung allgemein akzeptiert wird, wird davon dringend abgeraten, wenn Anwendungen in Produktion laufen. Diogo Monica, ein ehemaliger Leiter der Sicherheitsabteilung bei Docker, hat einen fantastischen Blogbeitrag geschrieben, der erklärt, warum

Ein sicherer Mechanismus besteht darin, die von Ihrem Container-Orchestrierungs-Framework bereitgestellte Unterstützung für Geheimnisse zu verwenden. In den meisten Fällen werden diese Geheimnisse als Dateien in den laufenden Container eingebunden. Sie werden sehen, dass viele Anwendungen (einschließlich des MySQL-Images und der todo-App) auch env vars mit einem _FILE-Suffix unterstützen, um auf eine Datei zu verweisen, die die Variable enthält

Wenn Sie zum Beispiel die Variable MYSQL_PASSWORD_FILE setzen, wird die Anwendung den Inhalt der referenzierten Datei als Verbindungspasswort verwenden. Docker tut nichts, um diese Umgebungsvariablen zu unterstützen. Ihre Anwendung muss wissen, dass sie nach der Variable suchen und den Inhalt der Datei abrufen muss

Sie können nun Ihren entwicklungsfähigen Container starten.# Geben Sie jede der vorherigen Umgebungsvariablen an und verbinden Sie den Container mit Ihrem App-Netzwerk. Stellen Sie sicher, dass Sie sich im Verzeichnis getting-started-app befinden, wenn Sie diesen Befehl ausführen

  • docker run -dp 127.0.0.1:3000:3000 \

-w /app -v "$(pwd):/app" \

--network todo-app \

-e MYSQL_HOST=mysql \

-e MYSQL_USER=root \

-e MYSQL_PASSWORD=secret \

-e MYSQL_DB=todos \

node:18-alpine \

sh -c "yarn install && yarn run dev"* Wenn Sie sich die Logs für den Container ansehen (docker logs -f <container-id>), sollten Sie eine Meldung ähnlich der folgenden sehen, die anzeigt, dass die mysql-Datenbank verwendet wird

  • nodemon src/index.js

[nodemon] 2.0.20

[nodemon] um jederzeit neu zu starten, geben Sie `rs` ein

[nodemon] überwachte(s) Verzeichnis(e): *.*

[nodemon] startet `node src/index.js`

Verbunden mit der mysql db auf dem Host mysql

Überwacht auf Port 3000* Öffnen Sie die Anwendung in Ihrem Browser und fügen Sie Ihrer ToDo-Liste ein paar Einträge hinzu

  • Verbinden Sie sich mit der mysql-Datenbank und prüfen Sie, ob die Einträge in die Datenbank geschrieben werden. Denken Sie daran, dass das Passwort geheim ist

docker exec -it <mysql-container-id> mysql -p todos

Und in der mysql-Shell führen Sie Folgendes aus:# mysql> select * from todo_items;

+--------------------------------------+--------------------+-----------+

| id | name | completed |

+--------------------------------------+--------------------+-----------+

| c906ff08-60e6-44e6-8f49-ed56a0853e85 | Tue erstaunliche Dinge! | 0 |

| 2912a79e-8486-4bc3-a4c5-460793a575ab | Sei fantastisch! | 0 |

+--------------------------------------+--------------------+-----------+

Deine Tabelle sieht anders aus, weil sie deine Artikel enthält. Aber Sie sollten sie dort gespeichert sehen

Zusammenfassung

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

Verwandte Informationen

Nächste Schritte

Es ist gut möglich, dass Sie sich langsam ein wenig überfordert fühlen mit dem, was Sie tun müssen, um diese Anwendung zu starten. Sie müssen ein Netzwerk erstellen, Container starten, alle Umgebungsvariablen angeben, Ports freischalten und vieles mehr. Das ist eine Menge, die man sich merken muss, und es macht es sicherlich schwieriger, die Dinge an jemand anderen weiterzugeben

Im nächsten Abschnitt werden Sie etwas über Docker Compose erfahren. Mit Docker Compose können Sie Ihre Anwendungsstapel auf viel einfachere Weise weitergeben und andere mit einem einzigen, einfachen Befehl in Betrieb nehmen lassen

Docker Compose verwenden