Zum Inhalt

Docker Compose

Ziel

In diesem Projekt geht es um Docker Compose. Sie werden:

  • ein Docker Compose Deployment schreiben
  • sich mit den grundlegenden Befehlen der Compose CLI docker compose vertraut machen

Hilfsmittel

  • Versuchen Sie, die unten stehenden Aufgaben mit Hilfe der Folien und des Cheatsheets eigenständig zu lösen.
  • Sollten Sie dabei Probleme haben, finden Sie bei jeder Aufgabe einen ausklappbaren Block, in dem der Lösungsweg beschrieben wird.

Aufgabe 1 - Erstellen und Verwenden einer docker-compose.yml

In diesem Abschnitt machen Sie sich mit dem Compose Dateiformat vertraut und starten die Docker Demo App mithilfe des Compose CLI docker compose.

  1. Erstellen Sie einen neuen Unterordner deployment des Workspace-Ordners /home/coder/workspace.
  2. Erstellen Sie im Ordner deployment eine neue Datei compose.yml.
  3. Öffnen Sie die Datei compose.yml.
  4. Kopieren Sie folgenden Inhalt in die Datei:

    ---
    services:
      webapp:
        image: corewire/docker-demoapp:1.0.0
        ports:
          -  8080:5000
    

    • Im Block services definiert man alle Container eines Compose Deployments.
    • webapp definiert einen Service. In diesem Service definieren Sie,
      1. ) dass das Image corewire/docker-demoapp:1.0.0 genutzt wird und
      2. ) ein Portmapping des Container-Ports 5000 auf den Host-Port 8080, sodass die Anwendung unter http://code-X.labs.corewire.de:8080 erreichbar ist.
  5. Wechseln Sie im Terminal in den Ordner deployment.

    Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
    • Wenn Sie bereits im Ordner Workspace sind können Sie mit cd direkt in den neuen Ordner wechseln:
      cd deployment
      
    • Wenn Sie noch in einem Unterordner des Workspace befinden, navigieren Sie zunächst in den Workspace-Ordner:
      cd ..
      
      Anschließend wechseln Sie in den richtigen Unterordner:
      cd deployment
      
  6. Starten Sie Ihren Service im Hintergrund.

    Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
    • Mit -d wird der Container im Hintergrund gestartet.
      docker compose up -d
      
    • Sie können sich alle laufenden Container eines Compose Deployments mit dem Befehl docker compose ps anzeigen lassen.

    docker compose up -d

    • Falls Sie mehr als einen Service definiert haben, startet docker compose up -d alle Services.
    • Falls Sie nur einzelne Services starten wollen, nutzen Sie docker compose up -d <service_name>
  7. Lassen Sie sich die Logs des Services webapp anzeigen.

    Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
    • Sie können sich die Logs mit oder ohne die Option -f anzeigen lassen. Mit -f werden neu erscheinende Logs angezeigt.
      docker compose logs -f webapp
      
  8. Öffnen Sie im Browser die URL http://code-X.labs.corewire.de:8080, wobei X Ihre Nummer ist. Sie sollten nun die Demo App sehen.

  9. Stoppen und entfernen sie den Service wieder:

    docker compose stop webapp
    docker compose rm webapp
    
    oder
    docker compose down
    

    Warnung zu docker compose down

    • docker compose down ist ein sehr destruktiver Befehl.
    • Falls Sie mehr als einen Service definiert haben, wird docker compose down alle Services stoppen, alle Container entfernen und alle lokalen Netzwerke entfernen.
    • Falls Sie also nur einzelne Services stoppen wollen, nutzen Sie docker compose stop und docker compose rm.

Aufgabe 2 - Volumes in Docker Compose

Sie haben in vorherigen Kapiteln der Schulung gelernt, dass Container stateless sind. Stateless bedeutet, dass Daten, die während der Laufzeit eines Containers geschrieben werden, verschwinden, sobald der Container gelöscht wird. In diesem Abschnitt werden Sie lernen, wie man im Compose Dateiformat Volumes definiert.

  1. Die Docker Demo App legt Notizen, die im Webinterface erstellt werden, standardmäßig unter dem Pfad /app/data/notes ab.
  2. Fügen Sie zu Ihrer compose.yml Datei dem Service webapp einen Abschnitt volumes hinzu.

    Volume für Service 'webapp'
    • Typ: bind-mount
    • Lokaler Pfad: ./volumes/webapp-data
    • Mount Pfad im Container: /app/data/notes
    • Wenn Sie die genaue Syntax vergessen haben, nutzen Sie die Schulungsunterlagen oder die Dokumentation des Compose Dateiformats zu Volumes.
    Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)

    Die Syntax ist volumes: und darunter mit Einrückung und - <Hostpfad>:<Containerpfad>:

    ---
    services:
      webapp:
        image: corewire/docker-demoapp:1.0.0
        ports:
          -  8080:5000
        volumes:
          - ./volumes/webapp-data:/app/data/notes
    
    Alternativ gibt es auch eine lange Form, die allerdings voraussetzt, dass der Ordner /volumes/webapp-data bereits vorhanden ist:
    ---
    services:
      webapp:
        image: corewire/docker-demoapp:1.0.0
        ports:
          -  8080:5000
        volumes:
          - type: bind
            source: ./volumes/webapp-data
            target: /app/data/notes
    

  3. Starten Sie den Webapp Service.

    Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
    docker compose up -d webapp
    
  4. Sie sollten nun sehen, dass in Ihrem Verzeichnis ein neuer Ordner volumes auftaucht, in dem ein Ordner webapp-data liegt. Dieser Ordner sollte leer sein.

  5. Öffnen Sie nun im Browser die URL http://code-X.labs.corewire.de:8080, wobei X Ihre Nummer ist. Sie sollten nun die Demo App sehen.
  6. Erstellen eine Notiz im Webinterface der Demo App.
  7. Sie sollten nun im Ordner volumes/webapp-data sehen, dass eine neue Datei angelegt wurde, ähnlich zu note_2022-06-16T13:43:23.690467.txt.
  8. Stoppen und entfernen Sie den Service webapp.

    Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)

    Zum Stoppen und Entfernen benutzen Sie folgenden Befehl:

    docker compose stop webapp
    docker compose rm webapp
    
    oder
    docker compose down
    

  9. Starten Sie den Webapp Service.

    Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
    docker compose up -d webapp
    
    1. Öffnen Sie nun wieder das Webinterface der Demo App (http://code-X.labs.corewire.de:8080).
    2. Sie sollten nun Ihre gerade angelegte Notiz wieder sehen können.

Aufgabe 3 - Datenbank Service

In diesem Abschnitt werden Sie einen neuen Service definieren, der einen MariaDB Datenbank Server startet.

  1. Fügen Sie Ihrer compose.yml Datei einen Service database hinzu:

    Datenbank Service 'database'
    • Name: database
    • "MYSQL_USER=example-user"
    • "MYSQL_PASSWORD=password"
    • "MYSQL_ROOT_PASSWORD=root_password"
    • Typ: named volume
    • Name: database-volume
    • Mount Pfad im Container: /var/lib/mysql
    • Name: database-network
    Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
    ---
    services:
      webapp:
        image: corewire/docker-demoapp:1.0.0
        ports:
          -  8080:5000
        volumes:
          - ./volumes/webapp-data:/app/data/notes
    
      database:
        image: mariadb:latest
        environment:
          - "MYSQL_USER=example-user"
          - "MYSQL_PASSWORD=password"
          - "MYSQL_ROOT_PASSWORD=root_password"
        volumes:
          - database-volume:/var/lib/mysql
        networks:
          - database-network
    
    volumes:
      database-volume:
    
    networks:
      database-network:
    
  2. Starten Sie den Service database.

    Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)

    Zum Starten des Services benutzen Sie folgende Eingabe:

    docker compose up -d database
    

  3. Lassen Sie sich die Logs des Service database ausgeben.

    Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)

    Zum Ausgeben der Logs benutzen Sie folgende Eingabe:

    docker compose logs -f database
    

  4. Wenn der Datenbank Container erfolgreich gestartet hat, sehen Sie folgende Ausgabe am Ende des Logstreams:

    database_1  | 2022-06-16 14:42:06 0 [Note] Server socket created on IP: '0.0.0.0'.
    database_1  | 2022-06-16 14:42:06 0 [Note] Server socket created on IP: '::'.
    database_1  | 2022-06-16 14:42:06 0 [Note] mariadbd: ready for connections.
    database_1  | Version: '10.8.3-MariaDB-1:10.8.3+maria~jammy'  socket: '/run/mysqld/mysqld.sock'  port: 3306  mariadb.org binary distribution
    

Aufgabe 4 - Verbinden der Webapp mit der Datenbank

In diesem Abschnitt verbinden wir die Docker Demo App mit einer Datenbank, das bedeutet den Service webapp mit dem Service database.

  1. Auf dem Webinterface der Docker Demo App (http://code-X.labs.corewire.de:8080) sehen Sie folgende Fehlermeldung:

    Connection to MariaDB Server could not be established: Unknown MySQL server host 'database' (-5)
    
    Das liegt daran, dass die Docker Demo App mit keiner Datenbank verbunden ist und die Applikation standardmäßig erwartet, dass ein Datenbank Server unter dem DNS Namen "database" erreichbar ist.

  2. Passen Sie den Service webapp an, indem Sie Environment Variablen und ein Netzwerk hinzufügen:

    Service 'webapp'
    • "DATABASE_HOST=database"
    • "DATABASE_PORT=3306"
    • "DATABASE_USER=example-user"
    • "DATABASE_USER_PASSWORD=password"
    • Name: database-network
    Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
    ---
    services:
      webapp:
        image: corewire/docker-demoapp:1.0.0
        ports:
          -  8080:5000
        volumes:
          - ./volumes/webapp-data:/app/data/notes
        networks:
          - database-network
        environment:
          - "DATABASE_HOST=database"
          - "DATABASE_PORT=3306"
          - "DATABASE_USER=example-user"
          - "DATABASE_USER_PASSWORD=password"
    
      database:
        image: mariadb:latest
        environment:
          - "MYSQL_USER=example-user"
          - "MYSQL_PASSWORD=password"
          - "MYSQL_ROOT_PASSWORD=root_password"
        volumes:
          - database-volume:/var/lib/mysql
        networks:
          - database-network
    
    volumes:
      database-volume:
    
    networks:
      database-network:
    
  3. Starten Sie den Service webapp neu.

    Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)

    Zum Starten des Services benutzen Sie folgende Eingabe:

    docker compose up -d webapp
    

  4. Öffnen Sie http://code-X.labs.corewire.de:8080, die Fehlermeldung sollte nun verschwunden sein.