Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Artikel wird beschrieben, wie Sie Multicontainer-Apps mit MySQL- und Docker Composeerstellen. Mit einer App mit mehreren Containern können Sie Container für spezielle Aufgaben zuweisen, sodass sich jeder Container auf eine einzelne Aufgabe konzentrieren kann. Es gibt viele Vorteile bei der Verwendung von Multicontainer-Apps:
- Mit separaten Containern können Sie APIs und Front-End-Ressourcen anders verwalten als Datenbanken.
- Mit mehreren Containern können Sie Versionen isoliert versions- und aktualisieren.
- Lokale Datenbanken können in Containern und verwalteten Diensten verwaltet werden, die für Datenbanken in der Produktion verwendet werden.
- Multi-Container-Apps sind effizienter als das Ausführen mehrerer Prozesse mit einem Prozess-Manager, was dem Start/Herunterfahren von Containern Komplexität hinzufügt.
In diesem Tutorial:
- MySQL starten
- Ausführen Ihrer Multi-Container-App mit MySQL
- Erstellen einer Docker Compose-Datei für Ihre App
- Ausführen des Anwendungsstapels mit Docker Compose
Voraussetzungen
Dieser Artikel ist Teil einer Lernprogrammreihe. Die Verfahren basieren auf einem etablierten Beispiel, das Docker Desktop- für Linux-Container erfordert.
Der empfohlene Ansatz besteht darin, das erste Lernprogramm, Erstellen Sie eine Container-App, einschließlich der Erfüllung der Voraussetzungen, sowie das Lernprogramm Daten in Ihrer App speichern abzuschließen. Nachdem Sie diese Tutorials durchgearbeitet haben, fahren Sie mit den in diesem Artikel beschriebenen Prozeduren fort.
Im Beispiel in diesem Artikel wird Docker Composeverwendet.
Visual Studio Code
In dieser Lernprogrammreihe werden Prozeduren für Visual Studio Code (VS Code) beschrieben. Überprüfen Sie die folgenden Überlegungen für die Arbeit in dieser Umgebung:
Verwenden Sie das linke Menü, um zwischen dem CONTAINER-EXPLORER oder der EXPLORER-Ansicht (Datei und Ordner) zu wechseln:
Öffnen Sie ein Befehlszeilenfenster in VS Code, indem Sie Terminal>Neues Terminalauswählen. Sie können auch die Tastenkombination STRG+UMSCHALTTASTE+` (Graviszeichen) verwenden.
Wenn nicht anders angegeben, führen Sie Befehle in einem Bash-Fenster aus. Die meisten Befehle, die für
Bash
markiert sind, werden in einem Bash-Fenster oder im Befehlszeilenfenster von VS Code ausgeführt.
MySQL-Datenbankverwaltungssystem starten
Standardmäßig werden Container isoliert ausgeführt. Ein Container kennt andere Prozesse oder Container auf demselben Computer nicht.
Um die Kommunikation zwischen Containern zu ermöglichen, müssen sie an dasselbe Netzwerk angefügt werden. Mehrere Container im selben Netzwerk können Daten freigeben und Informationen miteinander verarbeiten.
Es gibt zwei Möglichkeiten, einen Container an ein Netzwerk anzufügen. Sie können einen Container während der Erstellung an ein Netzwerk anfügen oder einen vorhandenen Container zu einem späteren Zeitpunkt an ein Netzwerk anfügen.
In diesem Beispiel erstellen Sie das Netzwerk und fügen den MySQL-Container beim Start an.
Erstellen Eines Netzwerks mit dem Namen
todo-app
:docker network create todo-app
Starten Sie einen MySQL-Container mit dem Namen
todo-mysql-data
, und fügen Sie ihn an dastodo-app
Netzwerk an. Der Befehl erstellt einen Netzwerkaliasmysql
für die MySQL-Datenbanktodos
.Wenn Sie den Befehl ausführen, geben Sie Ihr MySQL-Stammkennwort für den
<your-password>
Platzhalter ein.docker run -d --network todo-app --network-alias mysql -v todo-mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=<your-password> -e MYSQL_DATABASE=todos mysql:lts
Mit diesem Befehl werden auch die
MYSQL_ROOT_PASSWORD
- undMYSQL_DATABASE
Umgebungsvariablen definiert. Weitere Informationen finden Sie unter MySQL Docker Hub listing.Warnung
In diesem Lernprogramm werden Kennwortanmeldeinformationen zum Authentifizieren mit einer MySQL-Datenbank veranschaulicht, was nicht die sicherste Methode ist. Weitere Informationen zu sichereren Authentifizierungsmethoden finden Sie in der MySQL-Dokumentation.
Holen Sie sich die Container-ID, um sie im nächsten Schritt zu verwenden.
docker ps
Vergewissern Sie sich, dass Sie eine Verbindung mit dem Container im
mysql
Netzwerk herstellen können.Wenn Sie den Befehl ausführen, geben Sie Ihre Container-ID für den
<mysql-container-id>
Platzhalter ein.docker exec -it <mysql-container-id> mysql -p
Geben Sie an der Eingabeaufforderung das Kennwort ein, das Sie beim Erstellen des
todo-mysql-data
-Containers angegeben haben.Listen Sie in der MySQL-Shell die Datenbanken auf, und überprüfen Sie, ob die
todos
Datenbank angezeigt wird.SHOW DATABASES;
Die folgende Ausgabe wird angezeigt:
+--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | todos | +--------------------+ 5 rows in set (0.00 sec)
Um die Verbindung zu beenden und zur Befehlszeilenaufforderung zurückzukehren, geben Sie exitein.
Ausführen Ihrer App mit MySQL
Die todo
-App unterstützt das Festlegen bestimmter Umgebungsvariablen, um Ihre MySQL-Verbindungseinstellungen anzugeben. In der folgenden Tabelle sind die unterstützten Variablen und die werte aufgeführt, die im in diesem Abschnitt dargestellten Beispiel verwendet werden.
Variablenname | Beispielwert | Beschreibung |
---|---|---|
MYSQL_HOST |
mysql |
Der Hostname für den MySQL-Server. |
MYSQL_USER |
root |
Der Benutzername, der für die Verbindung verwendet werden soll. |
MYSQL_PASSWORD |
<your-password> |
Das Kennwort, das für die Verbindung verwendet werden soll. Ersetzen Sie in diesem Beispiel Ihr Stammkennwort durch den Platzhalter <your-password> . |
MYSQL_DATABASE |
todos |
Der Name der Datenbank, die nach dem Herstellen der Verbindung verwendet werden soll. |
Warnung
Die Verwendung von Umgebungsvariablen zum Festlegen von Verbindungseinstellungen ist für die Entwicklung akzeptabel, diese Vorgehensweise wird jedoch nicht für die Ausführung von Anwendungen in der Produktion empfohlen. Weitere Informationen finden Sie unter Warum Sie Umgebungsvariablen nicht für geheime Datenverwenden sollten.
Ein sichererer Mechanismus besteht darin, die geheime Unterstützung ihres Container-Orchestrierungsframeworks zu verwenden. In den meisten Fällen werden diese Geheimnisse als Dateien im laufenden Container bereitgestellt.
Im folgenden Beispiel starten Sie Ihre App und verbinden Ihren App-Container mit Ihrem MySQL-Container.
Führen Sie den folgenden
docker
Befehl aus. Beachten Sie, wie der Befehl die zuvor beschriebenen Umgebungsvariablen angibt.Denken Sie beim Ausführen des Befehls daran, Ihr MySQL-Stammkennwort für den
<your-password>
Platzhalter einzugeben.docker run -dp 3000:3000 -w /app -v ${PWD}:/app --network todo-app -e MYSQL_HOST=mysql -e MYSQL_USER=root -e MYSQL_PASSWORD=<your-password> -e MYSQL_DB=todos node:lts-alpine sh -c "yarn install && yarn run dev"
Öffnen Sie im VS Code-Editor den Container-Explorer, klicken Sie mit der rechten Maustaste auf Ihren App-Container, und wählen Sie "Protokolle anzeigen" aus.
Sie können die Protokolle auch über die Befehlszeile anzeigen, indem Sie den Befehl
docker logs
verwenden.Überprüfen Sie die Protokollausgabe. Beachten Sie die Zeile, die angibt, dass die App mit der MySQL-Datenbank verbunden ist:
Connected to mysql db at host mysql
.# Previous log messages omitted $ nodemon src/index.js [nodemon] 1.19.2 [nodemon] to restart at any time, enter `rs` [nodemon] watching dir(s): *.* [nodemon] starting `node src/index.js` Connected to mysql db at host mysql Listening on port 3000
Wechseln Sie in Ihrem Internetbrowser zu Ihrer ausgeführten Anwendung:
http://localhost:3000
.Fügen Sie in Ihrer ausgeführten Anwendung Ihrer Aufgabenliste einige Elemente hinzu.
Stellen Sie eine Verbindung mit der MySQL-Containerdatenbank im
mysql
Netzwerk her, damit Sie die Datenbank überprüfen können.Wenn Sie den Befehl ausführen, geben Sie Ihre Container-ID für den
<mysql-container-id>
Platzhalter ein.docker exec -ti <mysql-container-id> mysql -p todos
Geben Sie an der Eingabeaufforderung das Kennwort ein, das Sie beim Erstellen des
todo-mysql-data
-Containers angegeben haben.Überprüfen Sie in der MySQL-Shell, ob die von Ihnen hinzugefügten
todo_items
in dietodos
-Datenbank geschrieben wurden.use todos; select * from todo_items;
Die Ausgabe sollte ähnlich wie das folgende Beispiel aussehen:
+--------------------------------------+--------------------+-----------+ | id | name | completed | +--------------------------------------+--------------------+-----------+ | c906ff08-60e6-44e6-8f49-ed56a0853e85 | Do amazing things! | 0 | | 2912a79e-8486-4bc3-a4c5-460793a575ab | Be awesome! | 0 | +--------------------------------------+--------------------+-----------+
Sie verfügen jetzt über eine Anwendung, die Daten in einer externen Datenbank speichert, die in einem separaten Container ausgeführt wird. Dieses Verfahren veranschaulicht, wie Sie die Kommunikation zwischen Containern mithilfe von Netzwerken aktivieren können.
Erstellen einer Docker Compose-Datei
Docker Compose hilft Ihnen beim Definieren und Freigeben von Anwendungen mit mehreren Containern. Eine Docker Compose-Datei kann alle erforderlichen Dienste angeben, sodass Sie alle zugehörigen Prozesse mit einem einzigen Befehl starten oder beenden können. Sie können Ihren Anwendungsstapel in einer Docker Compose-Datei im Stammverzeichnis Ihres Projekt-Repositorys definieren und Ihre Konfiguration unter Versionssteuerung verwalten. Mit diesem Ansatz können andere Personen zu Ihrem Projekt beitragen, wenn sie Ihr Repository klonen.
Im folgenden Beispiel konfigurieren Sie eine Docker Compose-Datei für Ihre Multicontaineranwendung todo
.
Erstellen Sie im Stammverzeichnis Ihres
todo
-App-Projekts eine Docker Compose-Datei mit dem Namen docker-compose.yml.Anmerkung
Standardmäßig ist die YAML-Schemaversion auf die neueste Version festgelegt. Wenn Die Schemaversion veraltet ist, wird beim Ausführen der App eine Warnmeldung angezeigt. Informationen zum Überprüfen der aktuellen Schemaversionen und der Kompatibilitätsmatrix finden Sie unter Übersicht (Compose file).
Fügen Sie in der datei docker-compose.yml die folgenden Elemente hinzu. Geben Sie Ihre App
name
an, und erstellen Sie die Liste vonservices
(oder Containern), die Sie als Teil Ihrer Anwendung ausführen möchten.name: todo services:
Die Liste der Dienste ist für Ihre App eindeutig. Beispiele sind
app
,web
,db
,proxy
usw. Sie erweitern die Definition für dasservices
-Element in einem späteren Schritt.Tipp
Einzüge sind in YML-Dateien von Bedeutung. Wenn Sie in VS Code bearbeiten, weist IntelliSense auf Fehler im Format oder in der Syntax hin.
Kehren Sie zur
services
Definition in der datei docker-compose.yml zurück. Erweitern Sie die Definition, indem Sie einen Eintrag hinzufügen, um dasapp
Dienstelement zu definieren, das das Image für den Container enthält.services: app: image: node:lts-alpine
Sie können einen beliebigen Namen für den Dienst auswählen. Der Name wird automatisch zu einem Netzwerkalias, der nützlich ist, wenn Sie den MySQL-Dienst definieren.
Erweitern Sie die Definition des
app
-Elements, um anzugeben, welchercommand
ausgeführt werden soll.app: image: node:lts-alpine command: sh -c "yarn install && yarn run dev"
Definieren Sie
ports
zur Verwendung mit demapp
-Dienst. Beachten Sie, dass diese Ports dem argument-p 3000:3000
für den Befehl entsprechen, der zum Ausführen der App mit MySQL verwendet wird.app: image: node:lts-alpine command: sh -c "yarn install && yarn run dev" ports: - 3000:3000
Identifizieren Sie das Arbeitsverzeichnis
working_dir
für den Dienstapp
und auch die zugeordnetenvolumes
.app: image: node:lts-alpine command: sh -c "yarn install && yarn run dev" ports: - 3000:3000 working_dir: /app volumes: - ./:/app
Wenn Sie Docker Compose-Volumes definieren, können Sie relative Pfade basierend auf dem aktuellen Verzeichnis verwenden.
Geben Sie
environment
Variablendefinitionen an, die beim Ausführen von Befehlen für denapp
Dienst verwendet werden sollen.app: image: node:lts-alpine command: sh -c "yarn install && yarn run dev" ports: - 3000:3000 working_dir: /app volumes: - ./:/app environment: MYSQL_HOST: mysql MYSQL_USER: root MYSQL_PASSWORD: <your-password> MYSQL_DB: todos
Denken Sie daran, Ihr MySQL-Stammkennwort für den
<your-password>
Platzhalter einzugeben.Fügen Sie die Definition für den MySQL-Dienst
mysql
nach derapp
Dienstdefinition hinzu. Geben Sie die Elementnamen und -werte wie dargestellt und mit demselben Einzug an.services: app: ... mysql: image: mysql:lts
Die
mysql
-Dienstdefinition entspricht dem Befehl, den Sie zuvor genutzt haben, um MySQL zu starten. Wenn Sie den Dienst definieren, empfängt er automatisch den Netzwerkalias.Identifizieren Sie die
volumes
, die demmysql
-Service zugeordnet sind.services: app: ... mysql: image: mysql:lts volumes: - todo-mysql-data:/var/lib/mysql
Geben Sie
environment
Variablendefinitionen an, die beim Ausführen von Befehlen für denmysql
Dienst verwendet werden sollen.services: app: ... mysql: image: mysql:lts volumes: - todo-mysql-data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: <your-password> MYSQL_DATABASE: todos
Denken Sie daran, Ihr MySQL-Stammkennwort für den
<your-password>
Platzhalter einzugeben.Definieren Sie die Volumezuordnung für die gesamte App. Fügen Sie einen
volumes:
-Abschnitt nach demservices:
-Abschnitt mit dem gleichen Einzug hinzu.services: ... volumes: todo-mysql-data:
Vergewissern Sie sich, dass die abgeschlossene docker-compose.yml Datei wie im folgenden Beispiel aussieht. Ihr MySQL-Stammkennwort sollte für den
<your-password>
Platzhalter angezeigt werden.name: todo services: app: image: node:lts-alpine command: sh -c "yarn install && yarn run dev" ports: - 3000:3000 working_dir: /app volumes: - ./:/app environment: MYSQL_HOST: mysql MYSQL_USER: root MYSQL_PASSWORD: <your-password> MYSQL_DB: todos mysql: image: mysql:lts volumes: - todo-mysql-data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: <your-password> MYSQL_DATABASE: todos volumes: todo-mysql-data:
Ausführen des Anwendungsstapels mit Docker Compose
Jetzt können Sie versuchen, ihre docker-compose.yml Datei auszuführen.
Beenden Sie alle ausgeführten Instanzen Ihrer Anwendung und Datenbank.
Führen Sie die folgenden Schritte in VS Code aus:
Öffnen Sie den CONTAINER-EXPLORER (Erweiterung "Containertools").
Für jeden laufenden Container: Klicken Sie mit der rechten Maustaste auf den Container und wählen Sie Entfernenaus.
Starten Sie Ihre Multicontainer-App und alle Dienste.
Führen Sie die folgenden Schritte in VS Code aus:
Öffnen Sie die Ansicht EXPLORER (Datei und Ordner).
Klicken Sie mit der rechten Maustaste auf die docker-compose.yml Datei und wählen Sie Compose Upaus.
Die Ausgabe sollte ähnlich wie das folgende Beispiel aussehen:
[+] Building 0.0s (0/0) [+] Running 2/2 ✔ Container app-app-1 Started 0.9s ✔ Container app-mysql-1 Running
Mit diesem Vorgang wird das zugeordnete Volume für die App und das Netzwerk erstellt. Standardmäßig erstellt Docker Compose ein Netzwerk speziell für den Anwendungsstapel.
Überprüfen Sie die Protokolle für den laufenden Container.
Führen Sie die folgenden Schritte in VS Code aus:
Öffnen Sie den CONTAINER-EXPLORER (Erweiterung "Containertools").
Klicken Sie mit der rechten Maustaste auf den App-Container, und wählen Sie Protokoll anzeigenaus.
Die Ausgabe sollte ähnlich wie das folgende Beispiel aussehen:
mysql_1 | 2019-10-03T03:07:16.083639Z 0 [Note] mysqld: ready for connections. mysql_1 | Version: '5.7.27' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL) app_1 | Connected to mysql db at host mysql app_1 | Listening on port 3000
Die Protokolle zeigen den Dienstnamen und die Instanznummer an, z. B.
app_1
am Anfang jeder Zeile. Mit diesem Format können Sie Nachrichten nach Dienst und Instanz unterscheiden. Die Protokolle der einzelnen Dienste werden in einen einzelnen Datenstrom interleaviert. Mit diesem Ansatz können Sie auf zeitbezogene Probleme achten.Sie können jetzt zu Ihrer ausgeführten Anwendung in Ihrem Internetbrowser wechseln:
http://localhost:3000
.
Beenden von Docker Compose und ausgeführten Containern
Wenn Sie mit der App und den Containern fertig sind, können Sie sie entfernen.
Führen Sie die folgenden Schritte in VS Code aus:
Öffnen Sie die Ansicht EXPLORER (Datei und Ordner).
Klicken Sie mit der rechten Maustaste auf die docker-compose.yml Datei, und wählen Sie Compose Downaus.
Dieser Vorgang beendet alle ausgeführten Container und entfernt das Netzwerk.
Standardmäßig werden benannte Volumes in Ihrer Compose-Datei nicht entfernt. Wenn Sie diese Volumes entfernen möchten, können Sie den Befehl docker-compose down --volumes
verwenden.
Bereinigen von Ressourcen
Wenn Sie die Komponenten der Voraussetzungen in dieser Tutorialreihe auf Ihrer Installation angewendet haben, können Sie die Konfiguration für die zukünftige Docker-Entwicklung wiederverwenden. Es ist nicht wichtig, komponenten zu löschen oder zu deinstallieren.