2 votes

Mise à jour de fastcgi_pass dans nginx conf avec l'IP du conteneur docker au démarrage

Nous avons la configuration suivante :

Nous hébergeons plusieurs sites web sur un serveur Ubuntu, la plupart d'entre eux utilisant PHP 5.6. L'un d'entre eux fonctionne dans un conteneur Docker avec PHP 7.1.

La conf nginx pour ce site web a la ligne suivante :

fastcgi_pass 172.17.0.4:9000;

qui pointe vers l'IP du conteneur docker, que nous obtenons à partir de

docker inspect <container>|grep IP

Le problème est qu'à chaque fois que le système redémarre, le conteneur se voit attribuer une nouvelle IP et nous devons la recopier dans la conf de nginx et redémarrer nginx. Comment pouvons-nous faire cela automatiquement ?

Merci !

BR, Peter

1voto

Luca Gibelli Points 2533

Docker crée une entrée dans /etc/hosts pour faire correspondre la nouvelle adresse IP du conteneur à son nom. Malheureusement, nginx ignore /etc/hosts et s'appuie uniquement sur son résolveur DNS pour résoudre les adresses IP, ce qui ne vous aide pas dans ce cas précis.

Il existe quelques solutions alternatives. Les deux solutions les plus faciles à mettre en œuvre sont les suivantes :

  1. Si vous exécutez nginx et php dans le même conteneur (vous ne devriez pas), utilisez simplement 127.0.0.1:9000 dans php-fpm et nginx.
  2. si vous exécutez nginx et php-fpm dans des conteneurs différents, ou si vous exécutez php-fpm dans le conteneur et nginx sur l'hôte, ajoutez -p 9000:9000 au conteneur php et ensuite configurer le conteneur nginx pour utiliser fastcgi_pass 172.17.42.1:9000 (ou toute autre IP statique utilisée par l'interface docker0 de votre hôte)
  3. si vous préférez avoir des adresses IP statiques, créez un réseau séparé et attribuez une ip statique à votre conteneur php, par exemple :

    docker network create --subnet=172.18.0.0/16 mynet123

    docker run --net mynet123 --ip 172.18.0.22 -d --rm php-image-name

Des solutions plus propres impliqueraient l'utilisation de solutions d'orchestration. Ici, je vais simplement utiliser la méthode rapide et sale.

0voto

Brett Stauner Points 1

Je ferais correspondre le port 9000 du conteneur à un port ouvert sur l'hôte, et vous pouvez configurer nginx pour qu'il se connecte directement à l'hôte et au port. De cette façon, l'adresse IP attribuée à l'instance de docker n'a pas d'importance.

docker run -p 127.0.0.1:9001:9000

Ensuite, vous pouvez changer la conf de nginx :

fastcgi_pass 127.0.0.1:9001;

0voto

chucky_z Points 51

Pouvez-vous utiliser un socket ? Vous pouvez contourner ce problème grâce à...

  • Le conteneur php-fpm écoute sur un socket
  • Vous avez les capacités sudo pour créer un répertoire

Je ne connais pas les spécificités de votre environnement, mais cela devrait vous mettre sur la bonne voie :

[host]# sudo mkdir -p /var/run/my_app/ [host]# docker run -d -v /var/run/my_app:/var/run/php-fpm my_org/my-php-fpm-container

Votre conteneur devrait placer une prise sous /var/run/php-fpm comme /var/run/php-fpm/php-fpm.sock .

Ensuite, dans la configuration correspondante de nginx, vous pouvez utiliser fastcgi_pass unix:/var/run/my_app/php-fpm.sock;

Cela vous permet de ne pas exposer le port du tout.

Cela fonctionne car si vous exposez un répertoire entier à docker, il ne crée aucun fichier, seulement le répertoire. Si vous placez un fichier dans ce répertoire à l'intérieur du conteneur, il est exposé sur l'hôte. Les sockets sont juste des fichiers spéciaux, donc ils sont exposés de la même manière que n'importe quoi d'autre :)

Vous pourriez techniquement faire l'inverse ici aussi, ce qui serait d'exécuter php-fpm sur l'hôte et d'exécuter nginx dans un conteneur (je ne le suggère pas, cependant) !

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X