Supposons que j'ai la structure de fichiers suivante
.
├── docker-compose.yml
└── webserver
├── Dockerfile
├── html
│ ├── test1
│ │ └── index.html
│ └── test2
│ └── index.html
└── vhosts.conf
4 directories, 5 files
con docker-compose.yml
:
version: "3.1"
services:
webserver:
build: webserver
container_name: web
working_dir: /application
volumes:
- ./webserver/html/:/application
ports:
- "80:80"
other:
image: php:7.2.7
container_name: other
tty: true
con Dockerfile
:
FROM php:7.2.7-apache
COPY vhosts.conf /etc/apache2/sites-enabled/000-default.conf
con vhosts.conf
:
<VirtualHost *:80>
ServerName test1.localhost
DocumentRoot /application/test1
<Directory /application/test1>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName test2.localhost
DocumentRoot /application/test2
<Directory /application/test2>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
et le index.html
avec juste un peu de contenu pour les distinguer.
De plus, j'ai ajouté les lignes suivantes à mon fichier de l'hôte docker /etc/hosts
fichier :
127.0.0.1 test1.localhost
127.0.0.1 test2.localhost
Maintenant je peux courir docker-compose build
y docker-compose up
pour configurer et exécuter les conteneurs. Lorsque vous exécutez curl test1.localhost
sur la machine hôte ou sur le web
j'obtiens le contenu attendu de l'élément index.html
. Cependant, si j'exécute la même commande à partir de l'application other
le conteneur que je reçois :
curl: (7) Failed to connect to test1.localhost port 80: Connection refused
J'ai trouvé à https://docs.docker.com/v17.09/engine/userguide/networking/configure-dns/ la citation suivante :
En l'absence des options --dns=IP_ADDRESS..., --dns-search=DOMAIN..., ou --dns-opt=OPTION..., Docker utilise le fichier /etc/resolv.conf de la machine hôte (où le démon Docker s'exécute).
Donc, si je comprends bien, la résolution de nom à l'intérieur des conteneurs utilise simplement les entrées du fichier hosts de l'hôte docker. Cependant, cela échoue sur le other
car le /etc/hosts
résout les noms en 127.0.0.1
mais le other
ne fait pas tourner un serveur web. Je veux que les noms sur other
pour être tourné vers le web
conteneur.
Il s'agit évidemment d'un exemple minimal. J'ai besoin de ce type de comportement pour une configuration dev d'une application web où je veux exécuter des cronjobs à partir d'un conteneur distinct de celui où l'hôte apache s'exécute. Les scripts exécutés par les cronjobs effectuent des requêtes http vers différents hôtes du conteneur.
Je pense que la solution consiste à utiliser la configuration des réseaux Docker...