Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Docker Redis-Verbindung abgelehnt

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;
}