Einführung
Docker ist ein leistungsfähiges Werkzeug zum Bereitstellen von Anwendungen, kann anfangs aber komplex wirken. In dieser Challenge lernen Sie, Docker-Container zu verknüpfen und damit eine Anwendung mit mehreren Containern zu erstellen. Sie beginnen mit einfachen Beispielen und arbeiten sich schrittweise zu einer komplexeren Anwendung vor. Auch wenn Sie neu bei Docker sind, sollten Sie den Anweisungen leicht folgen können. Sie untersuchen, wie Container miteinander kommunizieren, was ein grundlegender Bestandteil robuster Anwendungen mit Docker ist.
Ein Image mit einem Dockerfile erstellen
Bevor Sie Container verknüpfen können, benötigen Sie mindestens eine containerisierte Anwendung. In diesem Schritt erstellen Sie ein Dockerfile für Ihr Image my-app. Dieses Dockerfile definiert die Umgebung und die Anwendung, die im Container ausgeführt werden.
Aufgaben
Ziel dieses Schritts ist es, ein Dockerfile für Ihr Image my-app zu erstellen.
Voraussetzungen
- Docker muss auf Ihrem Rechner installiert sein.
- Sie sollten bereits über eine Anwendung
my-appverfügen, die Sie containerisieren möchten.
Hinweise
- Definieren Sie die Eingaben für das Image, bevor Sie den Container erstellen und starten.
Beispielergebnis
Erstellen Sie die für die Challenge erforderlichen Dateien:
Erstellen Sie unter
/home/labex/project/eine neue Datei mit dem NamenDockerfileund folgendem Inhalt:- Verwenden Sie
python:3.7-slimals Basis-Image. - Legen Sie das Arbeitsverzeichnis auf
/appfest. - Kopieren Sie den Inhalt des aktuellen Verzeichnisses nach
/appim Container. - Installieren Sie die erforderlichen Pakete.
- Geben Sie Port
80für die Außenwelt frei. - Definieren Sie eine Umgebungsvariable. Sie wird in diesem Beispiel zwar nicht verwendet, die Anweisung soll jedoch erhalten bleiben.
- Führen Sie beim Start des Containers
app.pyaus.
Erstellen Sie in Ihrem Projektverzeichnis
/home/labex/project/eine Datei mit dem Namenapp.pyund folgendem Inhalt:import os os.system("wssh --address='0.0.0.0' --port=80")Erstellen Sie in Ihrem Projektverzeichnis
/home/labex/project/eine Datei mit dem Namenrequirements.txtund 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 das Imagemy-appzu erstellen.labex:project/ $ docker images | grep my-app my-app latest 266edf714faf 30 seconds ago 170MBStarten Sie mit dem Image
my-appeinen neuen Container und beachten Sie die Portzuordnung.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 rufen Sie
http://localhost:8080auf, um zu überprüfen, ob Ihre Anwendung ordnungsgemäß ausgeführt wird.
Zwei Docker-Container verknüpfen
Nachdem Sie nun eine containerisierte Anwendung haben, verknüpfen Sie im nächsten Schritt Container miteinander. Sie lernen, wie Sie zwei Docker-Container verknüpfen, damit sie miteinander kommunizieren können. Dieser Vorgang ist entscheidend für Anwendungen mit mehreren Diensten in Docker.
Aufgaben
Starten Sie Apache- und MySQL-Service-Container. Starten Sie anschließend einen Container my_app, der mit beiden Diensten verknüpft ist, damit Sie die MySQL-Verbindung aus my_app heraus testen können.
Voraussetzungen
- Sie benötigen zwei Docker-Container: einen mit Apache und einen mit MySQL.
- Starten Sie zusätzlich einen Container
my_app, der mit den Apache- und MySQL-Containern verknüpft ist. - Installieren Sie vor dem Testen der Datenbankverbindung den MySQL-Client in
my_app. - Docker muss auf Ihrem Rechner installiert sein.
Hinweise
- Öffnen Sie für diesen Schritt ein neues Terminal, damit es nicht zu Konflikten mit Ihrem vorherigen Container kommt.
Beispielergebnis
Greifen Sie aus dem Container my_app auf MySQL zu, nachdem Sie ihn mit beiden Diensten verknüpft haben:
Starten Sie einen Apache-Container mit dem Namen
my_apacheauf Grundlage des Imageshttpd. Ordnen Sie dabei den Host-Port80dem Container-Port80zu.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 mit dem Namen
my_mysql. Setzen Sie die UmgebungsvariableMYSQL_ROOT_PASSWORDaufpasswordund verwenden Sie das Imagemysql.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 Container
my_app, der sowohl mit dem MySQL- als auch mit dem Apache-Container verknüpft ist. Hinweis: Die Verknüpfung ist in der Containerkonfiguration 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 aus dem Containermy_appauf die MySQL-Befehlszeile zuzugreifen. Wenn Sie die Container anders verknüpft haben, müssen Sie den Befehl entsprechend anpassen.Installieren Sie den MySQL-Client in
my_appund verbinden Sie sich anschließend mit dem verknüpften MySQL-Dienst: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 kommen zwei neue Aspekte hinzu: Ein Anwendungscontainer wird mit beiden Diensten verknüpft, und der Container erhält die Verbindungseinstellungen über Umgebungsvariablen. In Schritt 2 haben Sie nur nachgewiesen, dass verknüpfte Container einander erreichen können. In diesem Schritt müssen Sie my_app2 mit beiden Optionen --link und den Umgebungsvariablen starten, die die Hosts von MySQL und Apache beschreiben.
Aufgaben
Starten Sie drei Container: einen mit Apache, einen mit MySQL und einen mit einer benutzerdefinierten Anwendung. Die benutzerdefinierte Anwendung muss auf MySQL und Apache zugreifen können.
Voraussetzungen
- Sie benötigen drei Docker-Container: Apache, MySQL und eine benutzerdefinierte Anwendung.
- Starten Sie
my_app2mit beiden Verknüpfungen und den folgenden Umgebungsvariablen:DB_HOST=mysql,DB_USER=root,DB_PASSWORD=passwordundAPACHE_HOST=apache. - Installieren Sie
curlinmy_app2, bevor Sie die Apache-Verbindung testen, da das Imagemy-appdieses Programm standardmäßig nicht enthält. - Docker muss auf Ihrem Rechner installiert sein.
Hinweise
- Verwenden Sie die Service-Container aus Schritt 2 erneut. Falls Sie die Verknüpfungen oder die Umgebung überprüfen müssen, untersuchen Sie den neuen Anwendungscontainer.
Beispielergebnis
Starten Sie wie in Schritt 2 beschrieben einen Apache- und einen MySQL-Container.
Starten Sie einen benutzerdefinierten Anwendungscontainer mit dem Namen
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, Docker-Container miteinander zu verknüpfen und dadurch Anwendungen mit mehreren Containern zu erstellen. Sie sind von einem einzelnen Container über verknüpfte Containerpaare zu einer Konfiguration mit drei Containern fortgeschritten. Sie wissen nun, wie Sie Container-Verknüpfungen und den Befehl docker exec nutzen, damit verschiedene Dienste miteinander kommunizieren können. So können Sie komplexere Anwendungen erstellen. Experimentieren Sie weiter und viel Spaß dabei!



