Ich versuche 2 separate Container zu verknüpfen:
Das Problem ist, dass PHP-Skripte nicht funktionieren. Möglicherweise ist die PHP-Fpm-Konfiguration falsch. Hier ist der Quellcode, der sich in meinem Repository befindet . Hier ist die Datei docker-compose.yml
:
nginx:
build: .
ports:
- "80:80"
- "443:443"
volumes:
- ./:/var/www/test/
links:
- fpm
fpm:
image: php:fpm
ports:
- "9000:9000"
und mit Dockerfile
dem ich ein benutzerdefiniertes Image basierend auf dem Nginx erstellt habe:
FROM nginx
# Change Nginx config here...
RUN rm /etc/nginx/conf.d/default.conf
ADD ./default.conf /etc/nginx/conf.d/
Zuletzt ist hier meine benutzerdefinierte Konfiguration des virtuellen Nginx-Hosts:
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;
}
}
Könnte mir jemand helfen, diese Container richtig zu konfigurieren, um PHP-Skripte auszuführen?
PS Ich führe Container über Docker-Composer wie folgt aus:
docker-compose up
aus dem Projektstammverzeichnis.
php
nginx
docker
dockerfile
docker-compose
Victor Bocharsky
quelle
quelle
docker exec
in den laufenden Container gehen und fpm pingen?Nginx
undPHP-FPM
zusammen mit Vagrant und ansible. Überprüfen Sie mein Repo github.com/bocharsky-bw/vagrant-ansible-docker, wenn Sie möchten.Antworten:
Codieren Sie die IP-Adresse von Containern in der Nginx-Konfiguration nicht fest. Der Docker-Link fügt den Hostnamen des verknüpften Computers zur Hosts-Datei des Containers hinzu, und Sie sollten in der Lage sein, nach Hostnamen zu pingen.
BEARBEITEN: Für Docker 1.9 Networking müssen Sie keine Container mehr verknüpfen. Wenn mehrere Container mit demselben Netzwerk verbunden sind, wird ihre Hosts-Datei aktualisiert, damit sie sich über den Hostnamen erreichen können.
Jedes Mal, wenn sich ein Docker-Container aus einem Image heraus dreht (sogar einen vorhandenen Container stoppen / starten), erhalten die Container vom Docker-Host neue IPs. Diese IPs befinden sich nicht im selben Subnetz wie Ihre tatsächlichen Computer.
Siehe Docker-Verknüpfungsdokumente (dies wird von Compose im Hintergrund verwendet).
aber klarer erklärt in den
docker-compose
Dokumenten auf Links & ExposeWenn Sie Ihr Projekt so einrichten, dass die Ports und andere Anmeldeinformationen über Umgebungsvariablen abgerufen werden, legen Links automatisch eine Reihe von Systemvariablen fest :
quelle
--links
sind laut der Docker-Dokumentation, auf die Sie verweisen, jetzt veraltet. Sie werden derzeit noch unterstützt, aber der offensichtliche Plan sieht vor, dass sie überholt werden.Ich weiß, dass es ein alter Beitrag ist, aber ich hatte das gleiche Problem und konnte nicht verstehen, warum Ihr Code nicht funktioniert hat. Nach vielen Tests habe ich herausgefunden warum.
Es scheint, als ob fpm den vollständigen Pfad von nginx empfängt und versucht, die Dateien im fpm-Container zu finden. Daher muss es genau das gleiche sein wie
server.root
in der nginx-Konfiguration, auch wenn es im nginx-Container nicht vorhanden ist.Demonstrieren:
docker-compose.yml
/etc/nginx/conf.d/default.conf
Dockerfile
quelle
/var/www/html
mit Fehler gesetzt.:9000
der Port ist, der im Container verwendet wird, und nicht der, der Ihrem Host ausgesetzt ist. Ich habe 2 Stunden gebraucht, um das herauszufinden. Hoffentlich musst du nicht.services.fpm.ports is invalid: Invalid port ":9000", should be [[remote_ip:]remote_port[-remote_port]:]port[/protocol]
ports
Abschnitt einfügen. Möglicherweise müssen Sie es nur verwenden,expose
wenn es nicht bereits im Bild enthalten ist (was es wahrscheinlich ist). Wenn Sie zwischen Containern kommunizieren, sollten Sie den PHP-FPM-Port nicht offenlegen.AH01071: Got error 'Primary script unknown\n'
und dass der PHP-Fpm-Container das gleiche Verzeichnis mit den Webknoten teilen muss, war die Lösung!Wie bereits erwähnt, bestand das Problem darin, dass die Dateien im fpm-Container nicht sichtbar waren. Für die gemeinsame Nutzung von Daten zwischen Containern werden jedoch nur Datencontainer empfohlen (wie in diesem Artikel erläutert ).
Lange Rede, kurzer Sinn: Erstellen Sie einen Container, der nur Ihre Daten enthält, teilen Sie sie mit einem Volume und verknüpfen Sie dieses Volume in Ihren Apps mit
volumes_from
.Bei Verwendung von compose (1.6.2 in meinem Computer)
docker-compose.yml
würde die Datei lauten:Beachten Sie, dass
data
ein Volume veröffentlicht wird, das mit den Dienstennginx
und verknüpft istfpm
. Dann dasDockerfile
für den Datendienst , der Ihren Quellcode enthält:Und das
Dockerfile
für nginx, das nur die Standardkonfiguration ersetzt:Zur Vervollständigung ist hier die Konfigurationsdatei aufgeführt, die erforderlich ist, damit das Beispiel funktioniert:
Dies weist nginx lediglich an, das freigegebene Volume als Dokumentstamm zu verwenden, und legt die richtige Konfiguration für nginx fest, um mit dem fpm-Container kommunizieren zu können (dh das richtige
HOST:PORT
, wasfpm:9000
den durch compose definierten Hostnamen und dem zu verdanken istSCRIPT_FILENAME
).quelle
Dockerfile
kopiert der Datencontainer Ihre Quellen während der Erstellungszeit in den Container. Aus diesem Grund werden sie nicht aktualisiert, wenn Sie die Dateien auf dem Host ändern. Wenn Sie die Quellen zwischen dem Host und dem Container freigeben möchten, müssen Sie das Verzeichnis bereitstellen. Ändern Sie dendata
Dienst in der zu ladenden Erstellungsdateiimage: busybox
und geben Sie imvolumes
Abschnitt eingeben ein./sources:/var/www/html
, wo./sources
sich der Pfad zu Ihren Quellen auf dem Host befindet.Neue Antwort
Docker Compose wurde aktualisiert. Sie haben jetzt ein Dateiformat der Version 2 .
Sie unterstützen jetzt die Netzwerkfunktion von Docker, die beim Ausführen ein Standardnetzwerk namens myapp_default einrichtet
Aus ihrer Dokumentation würde Ihre Datei ungefähr so aussehen:
Da diese Container automatisch zum Standardnetzwerk myapp_default hinzugefügt werden, können sie miteinander kommunizieren . Sie hätten dann in der Nginx-Konfiguration:
fastcgi_pass fpm:9000;
Wie auch von @treeface in den Kommentaren erwähnt, denken Sie daran, sicherzustellen, dass PHP-FPM Port 9000 überwacht. Dies kann durch Bearbeiten erfolgen,
/etc/php5/fpm/pool.d/www.conf
wo Sie es benötigenlisten = 9000
.Alte Antwort
Ich habe das Folgende hier für diejenigen aufbewahrt, die eine ältere Version von Docker / Docker Compose verwenden, und möchte die Informationen.
Ich bin bei Google immer wieder auf diese Frage gestoßen, als ich versucht habe, eine Antwort auf diese Frage zu finden, aber es war nicht ganz das, wonach ich gesucht habe, da der Schwerpunkt Q / A auf Docker-Compose liegt (für den zum Zeitpunkt des Schreibens nur experimentelle Unterstützung besteht Docker-Netzwerkfunktionen). Hier ist meine Sicht auf das, was ich gelernt habe.
Docker hat kürzlich seine Link- Funktion zugunsten seiner Netzwerk-Funktion abgelehnt
Daher können Sie mithilfe der Docker-Netzwerkfunktion Container verknüpfen, indem Sie die folgenden Schritte ausführen. Ausführliche Erläuterungen zu den Optionen finden Sie in den zuvor verlinkten Dokumenten.
Erstellen Sie zuerst Ihr Netzwerk
Führen Sie als Nächstes Ihren PHP-FPM-Container aus, und stellen Sie sicher, dass Sie Port 9000 öffnen und Ihrem neuen Netzwerk zuweisen (
mynetwork
).Das wichtige Bit hier ist das
--name php-fpm
am Ende des Befehls, das der Name ist, wir werden dies später brauchen.Führen Sie als Nächstes Ihren Nginx-Container erneut aus, und weisen Sie ihn dem von Ihnen erstellten Netzwerk zu.
Für die PHP- und Nginx-Container können Sie bei Bedarf auch
--volumes-from
Befehle usw. hinzufügen .Jetzt kommt die Nginx-Konfiguration. Welches sollte ungefähr so aussehen:
Beachten Sie die
fastcgi_pass php-fpm:9000;
im Standortblock. Das heißt Kontaktcontainerphp-fpm
am Hafen9000
. Wenn Sie einem Docker-Bridge-Netzwerk Container hinzufügen, erhalten alle automatisch eine Host-Dateiaktualisierung, bei der der Containername mit der IP-Adresse verglichen wird. Wenn Nginx also feststellt, dass es denphp-fpm
zuvor genannten und Ihremmynetwork
Docker-Netzwerk zugewiesenen PHP-FPM-Container kontaktieren muss .Sie können diese Nginx-Konfiguration entweder während des Erstellungsprozesses Ihres Docker-Containers oder danach nach Ihren Wünschen hinzufügen.
quelle
php-fpm
Port 9000 abzuhören. Dies wärelisten = 9000
in/etc/php5/fpm/pool.d/www.conf
.Wie frühere Antworten gelöst haben, sollte aber sehr explizit angegeben werden: Der PHP-Code muss im PHP-Fpm-Container leben, während die statischen Dateien im Nginx-Container leben müssen. Der Einfachheit halber haben die meisten Leute gerade den gesamten Code an beide angehängt, wie ich es auch unten getan habe. In Zukunft werde ich diese verschiedenen Teile des Codes wahrscheinlich in meinen eigenen Projekten trennen, um zu minimieren, welche Container Zugriff auf welche Teile haben.
Meine Beispieldateien unten wurden mit dieser neuesten Offenbarung aktualisiert (danke @alkaline)
Dies scheint das Mindest-Setup für Docker 2.0 Forward zu sein (da es in Docker 2.0 viel einfacher wurde).
docker-compose.yml:
( AKTUALISIERT die Datei docker-compose.yml oben : Für Sites mit CSS, Javascript, statischen Dateien usw. benötigen Sie diese Dateien, auf die der Nginx-Container zugreifen kann Mein Basiscode ist eine chaotische Mischung aus CSS, JS und PHP. In diesem Beispiel wird nur der gesamte Code an beide Container angehängt.
Im selben Ordner:
site.conf:
Im Ordnercode:
./code/index.php:
und vergessen Sie nicht, Ihre Hosts-Datei zu aktualisieren:
und führen Sie Ihr Docker-Compose aus
und probieren Sie die URL Ihres Lieblingsbrowsers aus
quelle
Ich denke, wir müssen dem fpm-Container auch das Volumen geben, nicht wahr? Also =>
Wenn ich dies nicht tue, stoße ich beim Auslösen einer Anfrage auf diese Ausnahme, da fpm die angeforderte Datei nicht finden kann:
quelle
Nginx
undPHP-FPM
auf GitHubFür alle anderen
bei Verwendung funktioniert
index.php
whileindex.html
einwandfrei undindex.php
im Index im Serverblock ihrer Site-Konfiguration enthaltensites-enabled
Stellen Sie sicher, dass Ihre Datei nginx.conf
/etc/nginx/nginx.conf
tatsächlich Ihre Site-Konfiguration in denhttp
Block lädt ...quelle