Container mit Link verbinden

DockerBeginner
Jetzt üben

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

  1. Erstellen Sie die für die Challenge notwendigen Dateien:

    Erstellen Sie eine neue Datei namens Dockerfile im Pfad /home/labex/project/ mit folgendem Inhalt:

    • Verwenden Sie python:3.7-slim als 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 80 fü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.py beim Start des Containers aus.

    Erstellen Sie eine Datei namens app.py in 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.txt in Ihrem Projektverzeichnis /home/labex/project/ mit folgendem Inhalt:

    webssh==1.6.2
    
    labex: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
    
  2. Verwenden Sie den Befehl docker build, um das my-app-Image zu erstellen.

    labex:project/ $ docker images | grep my-app
    my-app latest 266edf714faf 30 seconds ago 170MB
    
  3. Starten 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
    
  4. Öffnen Sie einen Webbrowser und navigieren Sie zu http://localhost:8080, um zu überprüfen, ob Ihre Anwendung korrekt läuft.

    Web-App im Browser

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:

  1. Starten Sie einen Apache-Container namens my_apache basierend auf dem httpd-Image und leiten Sie den Host-Port 80 auf den Container-Port 80 weiter.

    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/tcp
    
  2. Starten Sie einen MySQL-Container namens my_mysql, setzen Sie die Umgebungsvariable MYSQL_ROOT_PASSWORD auf password und verwenden Sie das mysql-Image.

    labex:project/ $ docker ps | grep mysql
    0cb864cf97c6 mysql "docker-entrypoint.s…" 42 seconds ago Up 35 seconds 3306/tcp, 33060/tcp my_mysql
    
  3. Starten 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 mit docker 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_app
    
  4. Verwenden Sie den Befehl docker exec, um vom my_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_app und 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_app2 mit beiden Verknüpfungen und diesen Umgebungsvariablen: DB_HOST=mysql, DB_USER=root, DB_PASSWORD=password und APACHE_HOST=apache.
  • Installieren Sie curl innerhalb von my_app2, bevor Sie die Apache-Verbindung testen, da das my-app-Image dies standardmäßig nicht enthält.
  • Docker muss auf Ihrem System installiert sein.

Beispielergebnis

  1. Starten Sie einen Apache- und einen MySQL-Container wie in Schritt 2 beschrieben.

  2. 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_app2
    
  3. Betreten Sie my_app2, installieren Sie curl und führen Sie curl 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!

✨ Lösung prüfen und üben✨ Lösung prüfen und üben✨ Lösung prüfen und üben