Ihr Problem
Docker Compose erstellt separate Docker-Container für verschiedene Dienste. Jeder Container ist logischerweise wie verschiedene getrennte Computerserver, die nur über das Docker-Netzwerk miteinander verbunden sind.
Betrachten Sie jede Box in diesem Diagramm als einen einzelnen Computer, dann haben Sie praktisch Folgendes:
+----------------------------------------------------------+
| your machine |
+----------------------------------------------------------+
|
+------ (virtual network by docker) -------+
| | |
+-----------------+ +-------------------+ +----------------+
| "php" container | | "redis" container | | "db" container |
+-----------------+ +-------------------+ +----------------+
Ihr PHP-Container sieht keine Redis in „localhost“, da keine Redis darin sind. Genauso wie es kein MySQL in "localhost" sehen würde. Ihr redis läuft im "redis"-Container. Ihr MySQL läuft in Ihrem „db“-Container.
Was Sie verwirrt, sind die Portbindungsanweisungen (d. h. ports
in dieser Definition):
redis:
build:
context: .
dockerfile: Dockerfile_redis
ports:
- "6379:6379"
Der Port 6379
des "redis"-Containers ist an Ihren Computer gebunden, aber NUR an Ihren Computer . Andere Container haben nicht den gleichen Zugriff auf die Portbindungen. Sogar Ihr Computer kann es mit '127.0.0.1:6379', dem php
, verbinden Container kann das nicht.
Lösung
Wie in Netzwerken in Docker Compose beschrieben, kann jeder Docker-Compose-Container auf andere Container zugreifen, indem er den Dienstnamen als Hostnamen verwendet. Zum Beispiel Ihre Programmierung, die vom Dienst php
ausgeführt wird kann mit dem Hostnamen db
auf Ihren MySQL-Dienst zugreifen .
Daher sollten Sie redis mit seinem Hostnamen redis
verbinden
$redis = new \Redis();
try {
$redis->connect('redis', 6379);
} catch (\Exception $e) {
var_dump($e->getMessage()) ;
die;
}