J'essaye de lier 2 conteneurs séparés:
Le problème est que les scripts php ne fonctionnent pas. Peut-être que la configuration de php-fpm est incorrecte. Voici le code source, qui se trouve dans 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 créer une image personnalisée basée sur celle de nginx:
FROM nginx
# Change Nginx config here...
RUN rm /etc/nginx/conf.d/default.conf
ADD ./default.conf /etc/nginx/conf.d/
Enfin, voici ma configuration d'hôte virtuel Nginx personnalisée:
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 correctement ces conteneurs pour exécuter des scripts php?
PS Je lance des conteneurs via docker-composer comme ceci:
docker-compose up
à partir du répertoire racine du projet.
php
nginx
docker
dockerfile
docker-compose
Victor Bocharsky
la source
la source
docker exec
entrer dans le conteneur en cours d'exécution et envoyer un ping à fpm?Nginx
etPHP-FPM
avec Vagrant et Ansible. Vérifiez mon dépôt github.com/bocharsky-bw/vagrant-ansible-docker si vous le souhaitez.Réponses:
Ne codez pas en dur l'IP des conteneurs dans la configuration nginx, le lien docker ajoute le nom d'hôte de la machine liée au fichier d'hôtes du conteneur et vous devriez pouvoir envoyer une requête ping par nom d'hôte.
EDIT: Docker 1.9 Networking ne vous oblige plus à lier des conteneurs, lorsque plusieurs conteneurs sont connectés au même réseau, leur fichier d'hôtes sera mis à jour afin qu'ils puissent se joindre par nom d'hôte.
Chaque fois qu'un conteneur docker tourne à partir d'une image (même arrêter / démarrer un conteneur existant), les conteneurs reçoivent de nouvelles adresses IP attribuées par l'hôte docker. Ces adresses IP ne sont pas dans le même sous-réseau que vos machines réelles.
voir docker liant des documents (c'est ce que compose utilise en arrière-plan)
mais plus clairement expliqué dans la
docker-compose
documentation sur les liens et exposeret si vous configurez votre projet pour obtenir les ports + d'autres informations d'identification via des variables d'environnement, les liens définissent automatiquement un ensemble de variables système :
la source
--links
sont désormais obsolètes, selon la documentation du docker que vous référencez. Ils sont toujours actuellement pris en charge, mais le plan apparent est qu'ils soient obsolètes.Je sais que c'est un peu un vieux message, mais j'ai eu le même problème et je ne pouvais pas comprendre pourquoi votre code ne fonctionnait pas. Après BEAUCOUP de tests, j'ai découvert pourquoi.
Il semble que fpm reçoive le chemin complet de nginx et essaie de trouver les fichiers dans le conteneur fpm, il doit donc être exactement le même que
server.root
dans la configuration nginx, même s'il n'existe pas dans le conteneur nginx.Démontrer:
docker-compose.yml
/etc/nginx/conf.d/default.conf
Dockerfile
la source
/var/www/html
d'échec.:9000
est le port qui est utilisé dans le conteneur et non celui qui est exposé à votre hôte. Il m'a fallu 2 heures pour comprendre cela. J'espère que vous n'êtes pas obligé.services.fpm.ports is invalid: Invalid port ":9000", should be [[remote_ip:]remote_port[-remote_port]:]port[/protocol]
ports
section ici. Vous pouvez simplement en avoir besoinexpose
s'il n'est pas déjà dans l'image (ce qui est probablement le cas). Si vous faites une communication inter-conteneurs, vous ne devriez pas exposer le port PHP-FPM.AH01071: Got error 'Primary script unknown\n'
et que le conteneur php-fpm doit partager le même répertoire avec les nœuds Web était la solution!Comme indiqué précédemment, le problème était que les fichiers n'étaient pas visibles par le conteneur fpm. Toutefois, pour partager des données entre des conteneurs, le modèle recommandé utilise des conteneurs de données uniquement (comme expliqué dans cet article ).
En bref: créez un conteneur qui ne contient que vos données, partagez-le avec un volume et liez ce volume dans vos applications avec
volumes_from
.En utilisant compose (1.6.2 sur ma machine), le
docker-compose.yml
fichier se lirait:Notez que
data
publie un volume lié aux servicesnginx
etfpm
. Ensuite, leDockerfile
pour le service de données , qui contient votre code source:Et le
Dockerfile
pour nginx, qui remplace simplement la configuration par défaut:Par souci de finalisation, voici le fichier de configuration requis pour que l'exemple fonctionne:
qui dit simplement à nginx d'utiliser le volume partagé comme racine du document, et définit la bonne configuration pour que nginx puisse communiquer avec le conteneur fpm (c'est-à-dire: le droit
HOST:PORT
, qui estfpm:9000
grâce aux noms d'hôte définis par compose, et leSCRIPT_FILENAME
).la source
Dockerfile
conteneur de données copie vos sources dans le conteneur au moment de la génération. C'est pourquoi ils ne seront pas mis à jour si vous modifiez les fichiers dans l'hôte. Si vous souhaitez partager les sources entre l'hôte et le conteneur, vous devez monter le répertoire. Changez ledata
service dans le fichier de composition à chargerimage: busybox
, et dans lavolumes
section entrez./sources:/var/www/html
, où./sources
est le chemin de vos sources dans l'hôte.Nouvelle réponse
Docker Compose a été mis à jour. Ils ont maintenant un format de fichier version 2 .
Ils prennent désormais en charge la fonctionnalité de mise en réseau de Docker qui, lorsqu'elle est exécutée, configure un réseau par défaut appelé myapp_default
D'après leur documentation, votre fichier ressemblerait à ceci:
Comme ces conteneurs sont automatiquement ajoutés au réseau myapp_default par défaut , ils pourraient se parler. Vous auriez alors dans la configuration Nginx:
fastcgi_pass fpm:9000;
Aussi, comme mentionné par @treeface dans les commentaires, n'oubliez pas de vous assurer que PHP-FPM écoute sur le port 9000, cela peut être fait en éditant
/etc/php5/fpm/pool.d/www.conf
là où vous en aurez besoinlisten = 9000
.Ancienne réponse
J'ai gardé ce qui suit ici pour ceux qui utilisent une ancienne version de Docker / Docker compose et aimeraient les informations.
Je n'arrêtais pas de tomber sur cette question sur Google en essayant de trouver une réponse à cette question, mais ce n'était pas tout à fait ce que je cherchais en raison de l'accent mis sur les questions / réponses sur docker-compose (qui au moment de la rédaction n'a qu'un support expérimental pour fonctionnalités de mise en réseau docker). Voici donc ma vision de ce que j'ai appris.
Docker a récemment abandonné sa fonction de lien au profit de sa fonction de réseaux
Par conséquent, en utilisant la fonctionnalité Docker Networks, vous pouvez lier des conteneurs en suivant ces étapes. Pour des explications complètes sur les options, lisez les documents liés précédemment.
Créez d'abord votre réseau
Exécutez ensuite votre conteneur PHP-FPM en vous assurant d'ouvrir le port 9000 et de l'assigner à votre nouveau réseau (
mynetwork
).Le bit important ici est le
--name php-fpm
à la fin de la commande qui est le nom, nous en aurons besoin plus tard.Ensuite, exécutez à nouveau votre conteneur Nginx pour l'attribuer au réseau que vous avez créé.
Pour les conteneurs PHP et Nginx, vous pouvez également ajouter des
--volumes-from
commandes, etc. au besoin.Vient maintenant la configuration Nginx. Ce qui devrait ressembler à ceci:
Notez le
fastcgi_pass php-fpm:9000;
dans le bloc d'emplacement. C'est dire conteneur de contactphp-fpm
sur le port9000
. Lorsque vous ajoutez des conteneurs à un réseau de pont Docker, ils reçoivent tous automatiquement une mise à jour du fichier d'hôtes qui place leur nom de conteneur par rapport à leur adresse IP. Ainsi, lorsque Nginx verra qu'il saura contacter le conteneur PHP-FPM que vous avez nomméphp-fpm
précédemment et attribué à votremynetwork
réseau Docker.Vous pouvez ajouter cette configuration Nginx soit pendant le processus de construction de votre conteneur Docker, soit après cela dépend de vous.
la source
php-fpm
écoutez sur le port 9000. Ce seraitlisten = 9000
en/etc/php5/fpm/pool.d/www.conf
.Comme les réponses précédentes l'ont résolu, mais cela devrait être déclaré très explicitement: le code php doit vivre dans le conteneur php-fpm, tandis que les fichiers statiques doivent vivre dans le conteneur nginx. Pour plus de simplicité, la plupart des gens viennent de joindre tout le code aux deux, comme je l'ai également fait ci-dessous. Dans le futur, je séparerai probablement ces différentes parties du code dans mes propres projets afin de minimiser quels conteneurs ont accès à quelles parties.
J'ai mis à jour mes fichiers d'exemple ci-dessous avec cette dernière révélation (merci @alkaline)
Cela semble être la configuration minimale pour docker 2.0 avant (car les choses sont devenues beaucoup plus faciles dans docker 2.0)
docker-compose.yml:
( MISE À JOUR du docker-compose.yml ci-dessus : pour les sites qui ont des fichiers css, javascript, statiques, etc., vous aurez besoin de ces fichiers accessibles au conteneur nginx. Tout en ayant toujours tout le code php accessible au conteneur fpm. Encore une fois, car mon code de base est un mélange désordonné de css, js et php, cet exemple attache simplement tout le code aux deux conteneurs)
Dans le même dossier:
site.conf:
Dans le code du dossier:
./code/index.php:
et n'oubliez pas de mettre à jour votre fichier hosts:
et lancez votre docker-compose up
et essayez l'URL de votre navigateur préféré
la source
Je pense que nous devons également donner le volume au conteneur fpm, n'est-ce pas? Donc =>
Si je ne fais pas cela, je rencontre cette exception lors du lancement d'une demande, car fpm ne peut pas trouver le fichier demandé:
la source
Nginx
etPHP-FPM
sur GitHubPour quiconque obtient
lors de l'utilisation de
index.php
whileindex.html
fonctionne parfaitement et après avoir inclusindex.php
dans l'index dans le bloc serveur de leur configuration de site danssites-enabled
Assurez-vous que votre fichier nginx.conf
/etc/nginx/nginx.conf
charge réellement la configuration de votre site dans lehttp
bloc ...la source