Aufgabe
Ich möchte die nativen Dienste auf meinem Server zur besseren Verwaltung und als Vorbereitung für eine kommende Migration auf Docker umstellen.
Als Vorbereitung für diese Aufgabe habe ich in Lokaler virtueller Server bereits ein grundlegendes Setup lokal evaluiert.
Heute möchte ich den Apache HTTP Server, der auch als Reverse Proxy dient, in einen Container stecken.
Vorbereitung
Docker deinstallieren
Auf dem Server ist bereits eine alte Docker Installation vorhanden. Diese habe ich als erstes rückstandslos entfernt.
Docker installieren
Hier nur kurz die Befehle, aus Lokaler virtueller Server übernommen:
sudo apt update
sudo apt upgrade -y
# Docker-Repository hinzufügen
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Docker installieren:
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl enable docker
sudo systemctl start docker
# Rechte für den aktuellen Benutzer konfigurieren
sudo usermod -aG docker $USER
newgrp docker
Ordnerstrukur
Die Dateien der Docker Dienste sollen in /data/docker/
liegen.
Ein symbolischer Link von /home/docker
soll auf das Verzeichnis zeigen.
sudo mkdir -p /data/docker
sudo ln -s /data/docker /home/docker
sudo chown :docker /data/docker
sudo chmod g+w /data/docker
Apache HTTP Container
Ordnerstruktur
mkdir /data/docker/apache
mkdir /data/docker/apache/config \
/data/docker/apache/html \
/data/docker/apache/logs
Daten kopieren
sudo cp -r /etc/apache2/* /data/docker/apache/config
sudo cp -r /var/www/html/* /data/docker/apache/html
sudo cp -r /var/log/apache2 /data/docker/apache
sudo chown -R :docker /data/docker/apache
sudo chmod -R g+w /data/docker/apache
mv /data/docker/apache/apache2/* /data/docker/apache/logs
rm -rf /data/docker/apache/apache2
Docker Compose Datei
docker-compose.yml
für Apache HTTP im Verzeichnis /data/docker/apache
:
services:
apache:
image: httpd:2.4
container_name: apache
restart: always
ports:
- 80:80
- 443:443
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./config:/usr/local/apache2/conf
- ./html:/usr/local/apache2/htdocs
- ./logs:/usr/local/apache2/logs
erster Start
Auf dem Server Apache HTTP stoppen:
# Service finden
systemctl list-unit-files --type service
# Service stoppen
sudo systemctl stop apache2
Container-Apache starten:
cd /data/docker/apache
docker compose up
Ausgabe:
[+] Building 0.0s (0/0)
Attaching to apache
apache | httpd: Could not open configuration file /usr/local/apache2/conf/httpd.conf: No such file or directory
apache exited with code 0
Das hat also schon mal so gar nicht geklappt. Woran kann es liegen? Zur Analyse interaktiv in dem Container agieren:
docker compose run -it --entrypoint /bin/bash apache
Ich kann im Container sehen, dass die Konfigurations-Dateien vorhanden sind, d.h. die Docker-Compose-Konfig ist an der Stelle korrekt.
Allerdings fehlt die geforderte httpd.conf.
Bei Ubuntu heißt die Datei apache2.conf, der Docker Container erwartet aber eine httpd.conf. Als Workaround lege ich eine httpd.conf
an, die auf die apache2.conf verweist:
Include /usr/local/apache2/conf/apache2.conf
Jetzt bekomme ich beim Starten des Containers andere Fehlermeldungen.
Aufräumen
Das entwickelt sich nicht wie gewünscht, ich breche ab und räume auf:
docker compose down -v
sudo rm -rf /data/docker/apache
Kleiner Apache
Um einen minimalen Teilerfolg feiern zu können, setzte ich einen Apache im Container auf, der die HTML-Seiten auf Port 9080 ausliefert.
mkdir /data/docker/apache
mkdir /data/docker/apache/logs
cd /data/docker/apache
vim docker-compose.yml
docker compose up -d
docker logs apache
services:
apache:
image: httpd:2.4
container_name: apache
restart: always
ports:
- 9080:80
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /var/www/html:/usr/local/apache2/htdocs
- ./logs:/usr/local/apache2/logs
Fazit
Der naive "Lift and Shift" Ansatz hat mal wieder nicht funktioniert.
Die Pfade sind bei der nativen Ubuntu Installation und dem Container Apache unterschiedlich. Der simple Workaround mit der httpd.conf-Datei war ein erster Schritt, danach hätten noch Umgebungsvariablen wie APACHE_RUN_DIR
gesetzt werden müssen.
Dann hätte ich noch einige Pfade vom Server in den Container mappen müssen.
Und dann ist da noch der Let's encrypt Certbot, der doch mehr mit der Apache Installation verdrahtet ist, als ich am Anfang dachte. Den hätte ich auch noch im Container installieren müssen.
Sicherlich alles machbar, aber für eine Interimslösung zu aufwändig. Am Ende soll ja Traefik SSL und Reverse Proxy übernehmen. Daher belasse ich es hier erstmal.