it-swarm.com.de

Mehrere vhosts auf demselben Docker-Container

Ich versuche, zwei verschiedene Domänen auf demselben Docker-Container und Port auszuführen.

Der Docker-Container führt CentOS aus. docker-compose.yml sieht so aus:

web:
  image: fab/centos
  ports:
    - "80:80"
  volumes:
    - ./src/httpd.conf:/etc/httpd/conf/httpd.conf
    - ./src:/var/www/html
    - ./src/hosts:/etc/hosts
  environment:
   - VIRTUAL_Host=dummy.dev,tests.dev

Ich habe auch beide .dev-Domänennamen in /etc/hosts auf dem Host-Computer (OS X) deklariert.

Es ist schon eine Weile her, seit ich virtuelle Hosts konfiguriert habe. Mein Verständnis war, dass ich sie nur deklarieren musste und dass Apache abhängig vom angeforderten HTTP-Host automatisch die richtigen Dateien bereitstellt.

Folgendes habe ich am Ende von httpd.conf hinzugefügt:

<VirtualHost *:80> # first Host = default Host
    DocumentRoot /var/www/html/default
</VirtualHost>
<VirtualHost *:80>
    DocumentRoot /var/www/html/dummy
    ServerName dummy.dev
    ServerAdmin [email protected]
    ErrorLog logs/dummy.dev-error_log
    CustomLog logs/dummy.dev-access_log common
</VirtualHost>
<VirtualHost *:80>
    DocumentRoot /var/www/html/tests
    ServerName tests.dev
    ServerAdmin [email protected]
    ErrorLog logs/tests.dev-error_log
    CustomLog logs/tests.dev-access_log common
</VirtualHost>

In der Praxis dient der Besuch von dummy.dev oder tests.dev jedoch /var/www/html/default. Dies ist, als ob Apache nicht wusste, welcher Host aufgerufen wird (obwohl ein Speicherauszug von $_SERVER in PHP den erwarteten HTTP_Host-Wert anzeigt, dh: entweder 127.0.0.1, dummy.dev oder tests.dev, je nachdem, welcher URL, die ich besuche.)

Was habe ich verpasst?

Es ist mir unklar, ob es sich um ein Apache-Problem oder um ein Docker-Problem handelt.

(Bitte beachten Sie, dass dies eine andere Frage ist als das Hosten mehrerer Apps in derselben Domäne mit unterschiedlichen Ports. In meinem Fall möchte ich, dass die virtuellen Hosts alle innerhalb/in derselben App/demselben Port/Container sind.)

7

Es stellte sich heraus, dass dies ein Apache-Konfigurationsproblem war.

Ich musste explizit Domain-Name-virtuelle Hosts aktivieren, wie:

NameVirtualHost *:80

Diese Antwort hat geholfen.

Docker hatte nichts mit der Sache zu tun.

2

Der fab/centos ist im öffentlichen Docker-Hub nicht vorhanden. Stellen Sie also nicht sicher, warum das Problem auftritt.

Meine Empfehlung wäre, einen Schritt zurückzutreten und zu versuchen, es mit einem einfachen Beispiel zum Laufen zu bringen.

docker search Apache ergibt eboraas/Apache als das am stärksten mit Sternchen versehene Bild, daher werde ich dieses für das Beispiel verwenden.

Verwenden Sie in einem Testverzeichnis Ihr Beispiel:

Datei: httpd.conf

<VirtualHost *:80> # first Host = default Host
    DocumentRoot /var/www/html/default
</VirtualHost>
<VirtualHost *:80>
    DocumentRoot /var/www/html/dummy
    ServerName dummy.dev
    ServerAdmin [email protected]
    ErrorLog logs/dummy.dev-error_log
    CustomLog logs/dummy.dev-access_log common
</VirtualHost>
<VirtualHost *:80>
    DocumentRoot /var/www/html/tests
    ServerName tests.dev
    ServerAdmin [email protected]
    ErrorLog logs/tests.dev-error_log
    CustomLog logs/tests.dev-access_log common
</VirtualHost>

Erstellen Sie anschließend die vhost-Websites und das Protokollverzeichnis.

mkdir -p logs; for i in default tests dummy; do mkdir -p $i; echo "hello $i" > $i/index.html; done

Führen Sie schließlich Docker aus.

docker run -it -v $(pwd):/var/www/html -v $(pwd)/httpd.conf:/etc/Apache2/sites-available/000-default.conf -v $(pwd)/logs:/etc/Apache2/logs -p 9090:80 --rm --name Apache_c eboraas/Apache

Beachten Sie, dass ich grundsätzlich dieselben Datenträger wie in Ihrer Docker-compose.yml verwende, mit der Ausnahme, dass ich site-available verwende, anstatt die httpd.conf zu ändern.

Stellen Sie zum Testen sicher, dass Sie in Ihrem/etc/hosts tests.dev und dummy.dev auf die richtige Docker-IP verweisen, und testen Sie:

$> curl dummy.dev:9090
hello dummy
$> curl tests.dev:9090
hello tests

Bauen Sie ab diesem Zeitpunkt zuerst das von Ihnen verwendete Docker-Apache-Image auf, probieren Sie es dann mit Ihrer benutzerdefinierten Datei/etc/hosts und fügen Sie es anschließend wieder in eine Docker-Compose-Datei ein

1
creack

Aktivieren Sie NameVirtualHost in Ihrer httpd-Konfiguration:

Datei: /etc/httpd/conf/httpd.conf

NameVirtualHost *:80 
NameVirtualHost *:443
0