Container mit Link verbinden

DockerBeginner
Jetzt üben

Einführung

Docker ist ein mächtiges Werkzeug für die Anwendungsbereitstellung, wirkt jedoch anfangs oft komplex. Diese Challenge führt Sie durch die Verknüpfung von Docker-Containern, um eine Multi-Container-Anwendung zu erstellen. Wir starten mit einfachen Beispielen und steigern uns schrittweise bis hin zu einer komplexeren Anwendung. Selbst als Docker-Neuling werden Sie diesen Schritten leicht folgen können. Wir 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 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 Sie, wie Sie zwei Docker-Container miteinander verbinden, damit sie miteinander kommunizieren können. Dieser Prozess ist entscheidend für die Erstellung von Multi-Service-Anwendungen innerhalb von Docker.

Aufgabe

Verknüpfen Sie einen Apache-Webserver-Container mit einem MySQL-Datenbank-Container.

Anforderungen

  • Sie benötigen zwei Docker-Container: einen mit Apache und einen mit MySQL.
  • Docker muss auf Ihrem System installiert sein.

Hinweis

  • Denken Sie daran, ein neues Terminal zu öffnen, um diesen Schritt zu starten, damit es nicht zu Konflikten mit Ihrem vorherigen Container kommt.

Beispielergebnis

Zugriff auf MySQL vom Apache-Container aus:

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

    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. Verknüpfen Sie den Apache-Container mit dem MySQL-Container. Hinweis: Für diesen Schritt wird keine direkte Befehlsausgabe erwartet, aber die Verknüpfung ist in den Umgebungsvariablen des Containers sichtbar. Sie können den Container mit dem Befehl docker inspect my_apache untersuchen.

    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-Befehlszeilenschnittstelle zuzugreifen (Sie müssen den Befehl anpassen, falls Sie die Verknüpfung anders vorgenommen haben).

    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 Diensten verknüpft, und der Container erhält Verbindungseinstellungen über Umgebungsvariablen. In Schritt 2 haben Sie lediglich nachgewiesen, 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 sowohl auf MySQL als auch auf Apache zugreifen können.

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 sowohl auf MySQL als auch auf 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 gesteigert. Sie verstehen nun, wie Sie Container-Links und den Befehl docker exec nutzen können, 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