Container mit Links verbinden

DockerBeginner
Jetzt üben

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-app verfügen, die Sie containerisieren möchten.

Hinweise

  • Definieren Sie die Eingaben für das Image, bevor Sie den Container erstellen und starten.

Beispielergebnis

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

    Erstellen Sie unter /home/labex/project/ eine neue Datei mit dem Namen Dockerfile und folgendem Inhalt:

    • Verwenden Sie python:3.7-slim als Basis-Image.
    • Legen Sie das Arbeitsverzeichnis auf /app fest.
    • Kopieren Sie den Inhalt des aktuellen Verzeichnisses nach /app im Container.
    • Installieren Sie die erforderlichen Pakete.
    • Geben Sie Port 80 fü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.py aus.

    Erstellen Sie in Ihrem Projektverzeichnis /home/labex/project/ eine Datei mit dem Namen app.py und 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 Namen requirements.txt und 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 Image my-app zu erstellen.

    labex:project/ $ docker images | grep my-app
    my-app latest 266edf714faf 30 seconds ago 170MB
    
  3. Starten Sie mit dem Image my-app einen 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
    
  4. Öffnen Sie einen Webbrowser und rufen Sie http://localhost:8080 auf, um zu überprüfen, ob Ihre Anwendung ordnungsgemäß ausgeführt wird.

    Webanwendung im Browser ausgeführt

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:

  1. Starten Sie einen Apache-Container mit dem Namen my_apache auf Grundlage des Images httpd. Ordnen Sie dabei den Host-Port 80 dem Container-Port 80 zu.

    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 mit dem Namen my_mysql. Setzen Sie die Umgebungsvariable MYSQL_ROOT_PASSWORD auf password und verwenden Sie das Image mysql.

    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 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 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 aus dem Container my_app auf 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_app und 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_app2 mit beiden Verknüpfungen und den folgenden Umgebungsvariablen: DB_HOST=mysql, DB_USER=root, DB_PASSWORD=password und APACHE_HOST=apache.
  • Installieren Sie curl in my_app2, bevor Sie die Apache-Verbindung testen, da das Image my-app dieses 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

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

  2. 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_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, 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!

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