1.3. 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.
1.3.1. 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.
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.
1.3.2. 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.
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'
1.3.3. 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.
volumes:
config:
networks:
default:
traefik_proxy:
name: traefik_proxy
external: true
1.3.4. Start und Stop Skript¶
1.3.4.1. 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.
#!/bin/bash
# Check if Docker is installed and the daemon is running
if ! command -v docker &>/dev/null; then
echo "Docker is not installed. Please install Docker first."
exit 1
fi
if ! docker info >/dev/null 2>&1; then
echo "Docker daemon is not running."
exit 1
fi
# Create attachable Docker network traefik_proxy if it doesn't exist
NETWORK_NAME="traefik_proxy"
if ! docker network ls | grep -q $NETWORK_NAME; then
if docker network create $NETWORK_NAME --attachable; then
echo "Network $NETWORK_NAME successfully created."
else
echo "Error creating network $NETWORK_NAME."
exit 1
fi
fi
# Start docker-compose services
if docker compose up -d; then
echo "docker compose services started successfully."
else
echo "Error starting docker compose services."
exit 1
fi
1.3.4.2. down.sh¶
Dieses Skript stoppt die Container und entfernt im Anschluss das von uns erstellt Netzwerk traefik_proxy
.
#!/bin/bash
# Stoppen und Entfernen aller gestarteten Container
docker compose down
# Entfernen des Netzwerks
docker network rm traefik_proxy