Categories
Development Linux

Apache HTTP in den Container

# 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](https://ingo.kaulbach.de/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](https://ingo.kaulbach.de/lokaler-virtueller-server/) übernommen:
```bash
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.
```bash
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
```bash
mkdir /data/docker/apache
mkdir /data/docker/apache/config \
/data/docker/apache/html \
/data/docker/apache/logs
```

## Daten kopieren
```bash
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```:

```yaml
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:
```bash
# Service finden
systemctl list-unit-files --type service
# Service stoppen
sudo systemctl stop apache2
```
Container-Apache starten:
```bash
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:
```bash
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:
```bash
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:
```bash
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.

```bash
mkdir /data/docker/apache
mkdir /data/docker/apache/logs

cd /data/docker/apache
vim docker-compose.yml

docker compose up -d
docker logs apache
```

```yaml
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.

Leave a Reply

Your email address will not be published. Required fields are marked *