Einführung
Docker ist ein mächtiges Werkzeug für die Bereitstellung von Anwendungen, kann jedoch anfangs komplex erscheinen. Diese Challenge führt Sie durch das Verknüpfen von Docker-Containern, um eine Multi-Container-Anwendung zu erstellen. Wir beginnen mit einfachen Beispielen und steigern uns schrittweise zu einer komplexeren Anwendung. Selbst wenn Sie noch keine Erfahrung mit Docker haben, werden Sie diesen Schritten leicht folgen können. Wir werden untersuchen, wie Container miteinander kommunizieren können – ein grundlegender Aspekt beim Aufbau robuster Anwendungen mit Docker.
Ein Image mit einem Dockerfile erstellen
Bevor wir Container verknüpfen können, benötigen wir mindestens eine containerisierte Anwendung. In diesem Schritt erstellen Sie ein Dockerfile für Ihr my-app-Image. Dieses Dockerfile definiert die Umgebung und die Anwendung, die innerhalb des Containers ausgeführt werden soll.
Aufgabe
Das Ziel dieses Schrittes ist die Erstellung eines Dockerfiles für Ihr my-app-Image.
Anforderungen
- Docker muss auf Ihrem System installiert sein.
- Sie sollten eine bestehende
my-app-Anwendung haben, die Sie containerisieren möchten.
Beispielergebnis
Erstellen Sie die für die Challenge notwendigen Dateien:
Erstellen Sie eine neue Datei namens
Dockerfileim Pfad/home/labex/project/mit folgendem Inhalt:- Verwenden Sie
python:3.7-slimals Basis-Image. - Setzen Sie das Arbeitsverzeichnis auf
/app. - Kopieren Sie den Inhalt des aktuellen Verzeichnisses in den Container nach
/app. - Installieren Sie die erforderlichen Pakete.
- Geben Sie Port
80für die Außenwelt frei. - Definieren Sie eine Umgebungsvariable (auch wenn wir sie in diesem Beispiel nicht verwenden, behalten Sie die Anweisung bei).
- Führen Sie
app.pybeim Start des Containers aus.
Erstellen Sie eine Datei namens
app.pyin Ihrem Projektverzeichnis/home/labex/project/mit folgendem Inhalt:import os os.system("wssh --address='0.0.0.0' --port=80")Erstellen Sie eine Datei namens
requirements.txtin Ihrem Projektverzeichnis/home/labex/project/mit folgendem Inhalt:webssh==1.6.2labex:project/ $ pwd /home/labex/project labex:project/ $ ll total 12K -rw-r--r-- 1 labex labex 59 Jan 24 15:21 app.py -rw-r--r-- 1 labex labex 163 Jan 24 15:19 Dockerfile -rw-r--r-- 1 labex labex 14 Jan 24 15:21 requirements.txt- Verwenden Sie
Verwenden Sie den Befehl
docker build, um dasmy-app-Image zu erstellen.labex:project/ $ docker images | grep my-app my-app latest 266edf714faf 30 seconds ago 170MBStarten Sie einen neuen Container mit dem
my-app-Image und notieren Sie sich das Port-Mapping.labex:project/ $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 11f06f08d2d3 my-app "python app.py" 4 seconds ago Up 4 seconds 0.0.0.0:8080- hopeful_elgamal > 80/tcpÖffnen Sie einen Webbrowser und navigieren Sie zu
http://localhost:8080, um zu überprüfen, ob Ihre Anwendung korrekt läuft.
Zwei Docker-Container verknüpfen
Nachdem wir nun eine containerisierte Anwendung haben, gehen wir zum Verknüpfen von Containern über. In diesem Schritt lernen wir, wie man zwei Docker-Container miteinander verbindet, damit sie miteinander kommunizieren können. Dieser Prozess ist entscheidend für die Erstellung von Multi-Service-Anwendungen innerhalb von Docker.
Aufgabe
Starten Sie Apache- und MySQL-Service-Container und anschließend einen my_app-Container, der mit beiden Services verknüpft ist, damit Sie die MySQL-Verbindung von innerhalb von my_app testen können.
Anforderungen
- Sie benötigen zwei Docker-Container: einen mit Apache und einen mit MySQL.
- Starten Sie einen zusätzlichen
my_app-Container, der mit den Apache- und MySQL-Containern verknüpft ist. - Installieren Sie den MySQL-Client innerhalb von
my_app, bevor Sie die Datenbankverbindung testen. - Docker muss auf Ihrem System installiert sein.
Hinweis
- Denken Sie daran, ein neues Terminal zu öffnen, um diesen Schritt zu starten, damit er nicht mit Ihrem vorherigen Container in Konflikt gerät.
Beispielergebnis
Greifen Sie von dem my_app-Container auf MySQL zu, nachdem Sie ihn mit beiden Services verknüpft haben:
Starten Sie einen Apache-Container namens
my_apachebasierend auf demhttpd-Image und leiten Sie den Host-Port80auf den Container-Port80weiter.labex:project/ $ docker ps | grep my_apache a91a93216e84 httpd "httpd-foreground" 52 seconds ago Up 47 seconds 0.0.0.0:80- my_apache > 80/tcpStarten Sie einen MySQL-Container namens
my_mysql, setzen Sie die UmgebungsvariableMYSQL_ROOT_PASSWORDaufpasswordund verwenden Sie dasmysql-Image.labex:project/ $ docker ps | grep mysql 0cb864cf97c6 mysql "docker-entrypoint.s…" 42 seconds ago Up 35 seconds 3306/tcp, 33060/tcp my_mysqlStarten Sie einen
my_app-Container, der mit den MySQL- und Apache-Containern verknüpft ist. Hinweis: Die Verknüpfung ist in der Container-Konfiguration sichtbar. Sie können sie mitdocker inspect my_appüberprüfen.labex:project/ $ docker ps | grep my_app 859c201b7267 my-app "python app.py" 53 seconds ago Up 52 seconds 80/tcp my_appVerwenden Sie den Befehl
docker exec, um vommy_app-Container aus auf die MySQL-Kommandozeile zuzugreifen (Sie müssen den Befehl anpassen, falls Sie die Verknüpfung anders benannt haben).Installieren Sie den MySQL-Client innerhalb von
my_appund verbinden Sie sich dann mit dem verknüpften MySQL-Service:labex:project/ $ docker exec -it my_app bash root@859c201b7267:/app## apt-get update && apt install -y default-mysql-client root@859c201b7267:/app## mysql -h mysql -uroot -ppassword Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.3.0 MySQL Community Server - GPL Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]>
Mehrere Docker-Container verknüpfen und Umgebungsvariablen verwenden
Aufbauend auf dem vorherigen Schritt fügt dieser Teil zwei neue Konzepte hinzu: Ein Anwendungscontainer wird mit beiden Services verknüpft, und der Container erhält Verbindungseinstellungen über Umgebungsvariablen. In Schritt 2 haben Sie lediglich bewiesen, dass verknüpfte Container einander erreichen können. In diesem Schritt müssen Sie my_app2 mit beiden --link-Optionen sowie den Umgebungsvariablen starten, die die MySQL- und Apache-Hosts beschreiben.
Aufgabe
Starten Sie drei Container: einen mit Apache, einen mit MySQL und einen mit einer benutzerdefinierten Anwendung. Die benutzerdefinierte Anwendung sollte in der Lage sein, sowohl auf MySQL als auch auf Apache zuzugreifen.
Anforderungen
- Sie benötigen drei Docker-Container: Apache, MySQL und eine benutzerdefinierte Anwendung.
- Starten Sie
my_app2mit beiden Verknüpfungen und diesen Umgebungsvariablen:DB_HOST=mysql,DB_USER=root,DB_PASSWORD=passwordundAPACHE_HOST=apache. - Installieren Sie
curlinnerhalb vonmy_app2, bevor Sie die Apache-Verbindung testen, da dasmy-app-Image dies standardmäßig nicht enthält. - Docker muss auf Ihrem System installiert sein.
Beispielergebnis
Starten Sie einen Apache- und einen MySQL-Container wie in Schritt 2 beschrieben.
Starten Sie einen benutzerdefinierten Anwendungscontainer namens
my_app2, der auf MySQL und Apache zugreifen kann.labex:project/ $ docker ps | grep app2 8945b42659a6 my-app "python app.py" 15 seconds ago Up 15 seconds 80/tcp my_app2Betreten Sie
my_app2, installieren Siecurlund führen Siecurl http://apache/aus, um zu bestätigen, dass der verknüpfte Apache-Container erreichbar ist.<html> <body> <h1>It works!</h1> </body> </html>
Zusammenfassung
In dieser Challenge haben Sie gelernt, wie man Docker-Container miteinander verknüpft, um Multi-Container-Anwendungen zu erstellen. Wir haben uns von einem einzelnen Container über verknüpfte Paare bis hin zu einem Drei-Container-Setup vorgearbeitet. Sie verstehen nun, wie man Container-Links und den docker exec-Befehl nutzt, um die Kommunikation zwischen verschiedenen Diensten zu ermöglichen, was Ihnen den Aufbau komplexerer Anwendungen erlaubt. Experimentieren Sie weiter und haben Sie Spaß dabei!



