Comment correctement lien php-fpm et Nginx conteneurs Docker?
Je suis tenté de faire le lien 2 contenants distincts:
Le problème est que les scripts php ne fonctionnent pas. Peut-être le php-fpm configuration est incorrecte.
Voici le code source, ce qui est en mon référentiel. Voici le fichier docker-compose.yml
:
nginx:
build: .
ports:
- "80:80"
- "443:443"
volumes:
- ./:/var/www/test/
links:
- fpm
fpm:
image: php:fpm
ports:
- "9000:9000"
et Dockerfile
que j'ai utilisé pour construire une image personnalisée basée sur la nginx un:
FROM nginx
# Change Nginx config here...
RUN rm /etc/nginx/conf.d/default.conf
ADD ./default.conf /etc/nginx/conf.d/
Enfin, voici mon custom Nginx hôte virtuel config:
server {
listen 80;
server_name localhost;
root /var/www/test;
error_log /var/log/nginx/localhost.error.log;
access_log /var/log/nginx/localhost.access.log;
location / {
# try to serve file directly, fallback to app.php
try_files $uri /index.php$is_args$args;
}
location ~ ^/.+\.php(/|$) {
fastcgi_pass 192.168.59.103:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
}
}
Quelqu'un pourrait-il m'aider à configurer ces conteneurs correctement pour exécuter des scripts php?
P. S.
- Je exécuter des conteneurs via docker-compositeur comme ceci:
docker-compose up
à partir du répertoire racine du projet.
- Comment avez-vous essayé de configurer la mesure ou ce code avez-vous utilisé. S'il vous plaît ne me faites pas suppose que je suis des déchets à deviner.
- Hein, j'ai mis mon code pour public dépôt sur GitHub et pense que ce sera suffisant, mais vous avez raison, mieux vaut montrer le code ici, dans ma question.
- lorsque les images de l'accélération, pouvez-vous
docker exec
dans l'exécution de conteneur et de ping fpm? - Mon mauvais @Victor, je ne sais pas réussi à repérer le lien. Je m'en excuse. Aussi, votre question est plus facile à lire maintenant de toute façon donc j'espère une victoire?
- oui, je l'ai gagné, merci
- P. S. j'ai aussi réalisé une œuvre de la solution pour lier
Nginx
etPHP-FPM
avec Vagrant et Ansible. Vérifier mon repo github.com/bocharsky-bw/vagrant-ansible-docker si vous le souhaitez.
Vous devez vous connecter pour publier un commentaire.
Ne pas coder en dur l'adresse ip de conteneurs dans la config nginx, docker lien ajoute le nom d'hôte de la machine liée au fichier hosts du conteneur et vous devriez être en mesure de le contacter par son nom d'hôte.
EDIT: menu fixe De 1,9 Réseau n'a plus besoin de conteneurs de liens, lorsque plusieurs conteneurs sont connectés au même réseau, leurs hôtes fichier sera mis à jour afin qu'ils puissent atteindre les uns des autres par le nom d'hôte.
Chaque fois qu'un conteneur docker tourne à partir d'une image (même arrêt/démarrage d'un conteneur existant) les conteneurs obtenir la nouvelle adresse ip est attribuée par le panneau d'accueil. Les adresses ip ne sont pas dans le même sous-réseau que votre machines réelles.
voir menu fixe reliant docs (c'est ce qui le composent utilise en arrière-plan)
mais plus clairement expliqué dans le
docker-ecrire
docs sur les liens & exposeret si vous avez configuré votre projet afin d'obtenir les ports + d'autres informations d'identification via les variables d'environnement, liens automatiquement mis un tas de variables système:
--links
sont maintenant obsolètes, selon le docker documention que vous faites référence. Ils sont encore actuellement prise en charge, mais le plan apparent est obsolète.Je sais c'est un vieux post, mais j'ai eu le même problème et je ne pouvais pas comprendre pourquoi votre code ne fonctionne pas.
Après BEAUCOUP de tests, j'ai trouvé pourquoi.
docker-composer.yml
/etc/nginx/conf.d/par défaut.conf
Dockerfile
/var/www/html
à l'échec.:9000
est le port qui est utilisé dans le conteneur et non pas celui qui est exposé à votre hôte. M'a fallu 2 heures pour comprendre cela. J'espère que vous n'avez pas à.services.fpm.ports is invalid: Invalid port ":9000", should be [[remote_ip:]remote_port[-remote_port]:]port[/protocol]
ports
l'article ici. Vous aurez juste besoin deexpose
si ce n'est pas déjà dans l'image (ça l'est probablement). Si vous êtes en train de faire de l'inter-communication de conteneur, vous ne pas exposer le PHP-FPM port.AH01071: Got error 'Primary script unknown\n'
et que le php-fpm conteneur doit partager le même répertoire avec le web nœuds est la solution!Comme l'a souligné avant, le problème est que les fichiers ne sont pas visibles par le fpm conteneur. Cependant le partage des données entre les conteneurs le modèle recommandé est à l'aide de de données uniquement des récipients (comme expliqué dans cet article).
Longue histoire courte: créer un conteneur qui tient juste vos données, de les partager avec un volume, et le lien de ce volume dans vos applications avec
volumes_from
.À l'aide de composer (1.6.2 dans ma machine), le
docker-compose.yml
fichier lire:Noter que
data
publie un volume qui est liée à langinx
etfpm
services. Puis leDockerfile
pour la données service, qui contient votre code source:Et la
Dockerfile
pour nginx, qui remplace simplement la config par défaut:Pour le bien de l'achèvement, voici le fichier de configuration requis pour l'exemple du travail:
qui dit juste nginx pour utiliser le volume partagé comme racine du document, et définit le droit de config de nginx pour être en mesure de communiquer avec le fpm conteneur (c'est à dire: le droit
HOST:PORT
, qui estfpm:9000
merci pour les noms d'hôte défini par la composition, et laSCRIPT_FILENAME
).Dockerfile
du conteneur de données est la copie de vos sources pour le conteneur sur le temps de construction. C'est pourquoi ils ne seront pas mis à jour si vous modifiez les fichiers de l'hôte. Si vous souhaitez partager les sources entre l'hôte et le conteneur, vous avez besoin de monter le répertoire. Modifier ladata
service dans la composition du fichier à chargerimage: busybox
, et dans levolumes
section entrer dans./sources:/var/www/html
, où./sources
est le chemin d'accès à vos sources dans l'hôte.Nouvelle Réponse
Docker compose a été mis à jour. Ils ont maintenant une la version 2 de format de fichier.
Ils prennent désormais en charge la fonction de réseau de Docker qui lorsqu'il est exécuté met en place un réseau par défaut appelé myapp_default
De leur documentation votre fichier devrait ressembler à quelque chose comme ci-dessous:
Que ces conteneurs sont automatiquement ajoutés à la valeur par défaut myapp_default réseau ils seraient en mesure de parler les uns aux autres. Vous auriez alors dans la config Nginx:
fastcgi_pass fpm:9000;
Aussi, comme mentionné par @treeface dans les commentaires rappelez-PHP-FPM est à l'écoute sur le port 9000, ce qui peut être fait en modifiant
/etc/php5/fpm/pool.d/www.conf
où vous aurez besoin delisten = 9000
.Vieille Réponse
J'ai gardé le ci-dessous pour ceux qui utilisent une version antérieure de Docker/Docker composer et voudrais l'information.
J'ai gardé de tomber sur cette question sur google en essayant de trouver une réponse à cette question, mais elle n'était pas tout à fait ce que je cherchais grâce à la Q/A l'accent sur docker-composer (qui à l'époque de l'écriture seule est prise en charge expérimentale de docker fonctionnalités de mise en réseau). Voici donc mon point de vue sur ce que j'ai appris.
Docker a récemment obsolète son lien fonctionnalité en faveur de son les réseaux de fonctionnalité
Par conséquent, en utilisant le menu fixe les Réseaux fonctionnalité, vous pouvez lier des conteneurs en suivant ces étapes. Pour des explications sur les options de lire sur les docs liés précédemment.
D'abord créer votre réseau
Prochaine course votre PHP-FPM récipient en veillant à vous ouvrir sur le port 9000, et de confier à votre nouveau réseau (
mynetwork
).L'important ici est la
--name php-fpm
à la fin de la commande, qui est le nom que l'on aura besoin plus tard.De la prochaine exécution de votre Nginx conteneur de nouveau attribuer au réseau que vous avez créé.
Pour le PHP et Nginx conteneurs vous pouvez également ajouter des
--volumes-from
commandes etc, comme requis.Maintenant vient la Nginx configuration. Ce qui devrait ressembler à quelque chose de similaire à ceci:
Avis de la
fastcgi_pass php-fpm:9000;
dans l'emplacement du bloc. C'est dire le contact conteneurphp-fpm
sur le port9000
. Lorsque vous ajoutez des conteneurs Docker pont réseau, ils ont tous obtenir automatiquement un fichier hosts de mise à jour qui met en leur nom du conteneur à l'encontre de leur adresse IP. Alors, quand Nginx voit qu'il saura communiquer avec le PHP-FPM conteneur nomméphp-fpm
plus tôt et assigné à votremynetwork
Docker réseau.Vous pouvez ajouter que Nginx config soit pendant le processus de construction de votre conteneur Docker ou après son jusqu'à vous.
php-fpm
est à l'écoute sur le port 9000. Ce seraitlisten = 9000
dans/etc/php5/fpm/pool.d/www.conf
.Comme les réponses précédentes ont résolu, mais doivent être indiqués de manière très explicite: le code php a besoin de vivre dans le php-fpm conteneur, tandis que les fichiers statiques besoin pour vivre dans la nginx conteneur. Pour des raisons de simplicité, la plupart des gens ont juste attachés tout le code à la fois, comme j'ai fait ci-dessous. Si à l'avenir, je vais probablement distinguer ces différentes parties du code dans mes propres projets afin de minimiser les conteneurs ont accès à certaines parties.
Mis à jour mes fichiers de l'exemple ci-dessous, avec cette dernière révélation (merci @alcaline )
Cela semble être le minimum d'installation de docker 2.0 avant-propos
(parce que les choses sont devenues beaucoup plus facile dans le panneau 2.0)
docker-composer.yml:
(Mis à JOUR le docker-composer.yml ci-dessus: Pour les sites qui ont les css, le javascript, les fichiers statiques, etc, vous aurez besoin de ces fichiers accessibles au nginx conteneur. Tout en ayant tout le code php accessible à l'fpm conteneur. Encore une fois, parce que mon code de base est un mélange désordonné de css, js et php, cet exemple juste s'attache tout le code à la fois des conteneurs)
Dans le même dossier:
site.conf:
Dans le dossier code:
./code/index.php:
et n'oubliez pas de mettre à jour votre fichier hosts:
et exécuter votre menu fixe-composer jusqu'
et essayez l'URL de votre navigateur préféré
Je pense que nous avons aussi besoin de donner le fpm contenant le volume, ne pas nous? Donc =>
Si je ne fais pas cela, je tombe sur cette exception lors de la cuisson d'une demande, comme fpm ne peut pas trouver de fichier demandé:
Nginx
etPHP-FPM
sur GitHubPour quelqu'un d'autre se
lors de l'utilisation de
index.php
toutindex.html
fonctionne parfaitement et avoir inclusindex.php
de l'indice, dans le bloc de serveur de leur site de config danssites-enabled
Assurez-vous que votre nginx.conf fichier à
/etc/nginx/nginx.conf
effectivement des charges de votre site config dans lahttp
bloc...