Projekt ======= Mit dem nachfolgend erklärten Versuchsaufbau wollen wir die verschiedenen Komponenten von Docker näher erläutern. Wir wollen einen minimalen Apache Webserver aufsetzen, der Zugriff auf diesen soll via traefik, der als Reverse-Proxy dient, gemanaged werden. Wir wollen die files, die unter 'abgabe1/source/code/httpd/' liegen, in dem Apache Webserver anzeigen. Die Umgebung soll einfach zu handeln sein, deshalb wollen wir jeweils ein Script zum Starten und Stoppen. Reverse-Proxy mit traefik ------------------------- Der erste Teil des Projektes bestand darin einen Container mit traefik als Reverse-Proxy aufzusetzen. Dies haben wir direkt mittels eines docker-compose files umgesetzt. .. code-block:: yaml services: traefik_proxy: container_name: 'traefik_proxy' image: 'traefik:v2.11' restart: 'unless-stopped' command: - '--api.insecure=true' - '--providers.docker.exposedbydefault=false' - '--global.sendAnonymousUsage=false' - '--providers.docker=true' - '--providers.file.filename=/config/traefik.yml' - '--entrypoints.http.address=:80' - '--entryPoints.http.forwardedHeaders.insecure' ports: - '80:80' - '8080:8080' volumes: - '/var/run/docker.sock:/var/run/docker.sock:ro' - 'config:/config' networks: - default - traefik_proxy Hiermit nutzen wir das online verfügbare image für traefik. Der Container soll an die Ports 80 und 8080 des Rechners gebunden werden. Auf ersterem wollen wir später die http Verbindung zum Webserver ermöglichen, auf dem Port 8080 findet sich das Dashboard von traefik. Die Configuration des traefik Containers realisiert man mittels der 'commands', unser Beispielcontainer hat ein öffentlich abrufbares Dashboard ('--api.insecure=true') und auf Port 80 ermöglichen wir eine http Verbindung ( '--entrypoints.http.address=:80';'--entryPoints.http.forwardedHeaders.insecure'). Unser traefik Container benötigt zwei Volumes, das erste Volume wird für die Kommunikation mit dem Docker-Service des Host-Systems benötigt. Mit dieser Schnittstelle kann traefik die internen IP-Adressen der Container auflösen und somit den Verkehr weiterleiten. In dem zweiten Volume wird die config abgespeichert, damit diese persistent erhalten bleibt. In unserem Versuchsaufbau haben wir uns entschieden zwei Netzwerke zu verwenden, das von Docker automatisch erstellte und ein eigens angelegtes "traefik_proxy" Netzwerk. Über das default Netzwerk erhalten wir den von außen eingehenden Datenverkehr und über das traefik_proxy Netzwerk leiten wir die Anfragen an die entsprechenden Container, die wir via traefik zugänglich machen wollen, weiter. Apache-Webserver ---------------- Der zweite Container den wir für dieses Beispiel erstellen enthält einen Apache-Webserver. Mithilfe des Volumes mounten wir den lokalen Ordner htdocs aus dem git repository und lassen die Inhalte von dem Apache-Webserver anzeigen. Mithilfe der labels configurieren wir den Reverse-Proxy. Die Regeln definieren unter welchem Hostname und entry point der Service erreichbar ist. In unserem Fall ist es Port 80 über http. .. code-block:: yaml httpd: image: httpd restart: 'unless-stopped' networks: - traefik_proxy volumes: - './httpd/htdocs/:/usr/local/apache2/htdocs/' labels: - 'traefik.enable=true' - 'traefik.http.routers.httpd.rule=Host(localhost)' - 'traefik.http.routers.httpd.entrypoints=http' Benötigte Zusatzkonfiguration ----------------------------- Im nachfolgenden Block definieren wir noch das Volume ``config``, das docker dann automatisch erstellt. Dieses Volume wir vom oben genannten traefik-container zur Persistierung von Daten verwendet. Im Block ``networks`` definieren wir, dass das Netzwerk ``traefik_proxy`` außerhalb der docker-compose konfiguriert werden muss. .. code-block:: yaml volumes: config: networks: default: traefik_proxy: name: traefik_proxy external: true Start und Stop Skript --------------------- run.sh ...... Die ``run.sh`` erstellt das benötigte Netzwerk ``traefik_proxy``, falls dieses noch nicht vorhanden ist. Durch den Paramter ``--attachable`` können beliebige Container dem Netzwerk hinzugefügt werden. Mit dem command ``docker compose up -d`` wird die oben erklärten docker-compose.yaml ausgeführt. .. literalinclude :: code/run.sh :language: bash down.sh ....... Dieses Skript stoppt die Container und entfernt im Anschluss das von uns erstellt Netzwerk ``traefik_proxy``. .. literalinclude :: code/down.sh :language: bash