2 votes

Comment fournir une résolution de nom personnalisée dans les conteneurs Docker

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X