J'essaie d'exécuter deux domaines différents sur un même conteneur et port Docker.
Le conteneur Docker exécute CentOS. docker-compose.yml
ressemble à ceci:
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
J'ai également déclaré les deux noms de domaine .dev à l'intérieur de /etc/hosts
sur l'ordinateur hôte (OS X.)
Cela fait longtemps que je n'ai pas configuré les hôtes virtuels. Je croyais comprendre que je devais simplement les déclarer et qu'Apache servirait automatiquement les fichiers appropriés en fonction de l'hôte HTTP demandé.
Voici ce que j'ai ajouté à la fin de 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>
Cependant, dans la pratique, visiter dummy.dev ou tests.dev sert réellement /var/www/html/default
. C’est comme si Apache n’avait pas compris quel hôte était appelé (bien que le dump de $_SERVER
dans PHP indique la valeur HTTP_Host
attendue, c’est-à-dire: 127.0.0.1, dummy.dev ou tests.dev, selon URL que je visite.)
Qu'est-ce que j'ai raté?
Je ne sais pas s'il s'agit d'un problème lié à Apache ou à celui de Docker.
(Veuillez noter qu'il s'agit d'une question différente de la façon d'héberger plusieurs applications sur le même domaine avec un port différent. Dans mon cas, je souhaite que les hôtes virtuels se trouvent tous à l'intérieur/sur la même application/port/conteneur.)
Il s'avère que c'était un problème de configuration Apache.
Je devais activer explicitement les hôtes virtuels nommés par domaine, comme ceci:
NameVirtualHost *:80
Docker n'avait rien à voir avec le problème.
Le fab/centos
n'existe pas dans le docker public, vous ne savez donc pas pourquoi vous rencontrez ce problème.
Ma recommandation serait de prendre du recul et d'essayer de le faire fonctionner avec un exemple simple.
docker search Apache
donne eboraas/Apache
comme image la plus sélectionnée, je vais donc utiliser celle-ci pour l'exemple.
Dans un répertoire de test, utilisez votre exemple:
Fichier: 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>
Créez ensuite les sites Web vhost et le répertoire des journaux.
mkdir -p logs; for i in default tests dummy; do mkdir -p $i; echo "hello $i" > $i/index.html; done
Enfin, lancez docker.
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
Notez que j'utilise essentiellement les mêmes volumes que dans votre fichier docker-compose.yml, sauf que j'utilise site-available
au lieu de changer le fichier httpd.conf.
Pour tester, assurez-vous que tests.dev et dummy.dev sont dans votre/etc/hosts pointant vers la bonne adresse IP de Docker et testez:
$> curl dummy.dev:9090
hello dummy
$> curl tests.dev:9090
hello tests
A partir de là, commencez par essayer l’image Apache du menu fixe que vous utilisez, puis essayez-la avec votre fichier/etc/hosts personnalisé, puis replacez-la dans un fichier de composition