sql >> Base de Datos >  >> NoSQL >> Redis

Conexión Docker Redis rechazada

Tu problema

Docker Compose crea un contenedor docker separado para diferentes servicios. Cada contenedor es, lógicamente hablando, como diferentes servidores informáticos separados que solo se conectan entre sí a través de la red docker.

Considere cada cuadro en este diagrama como una computadora individual, entonces esto es prácticamente lo que tiene:

+----------------------------------------------------------+
|                       your machine                       |
+----------------------------------------------------------+
                               |                    
        +------ (virtual network by docker) -------+
        |                      |                   |
+-----------------+ +-------------------+ +----------------+
| "php" container | | "redis" container | | "db" container |
+-----------------+ +-------------------+ +----------------+

Su contenedor PHP no ve ningún redis en "localhost" porque no hay redis en él. Al igual que no vería ningún MySQL en "localhost". Su redis se está ejecutando en el contenedor "redis". Su MySQL se está ejecutando en su contenedor "db".

Lo que te confunde son las directivas de enlace de puertos (es decir, ports en esta definición):

redis:
  build:
    context: .
    dockerfile: Dockerfile_redis
  ports:
    - "6379:6379"

El puerto 6379 del contenedor "redis" está vinculado a su computadora, pero SOLO a su computadora . Otro contenedor no tiene el mismo acceso a los enlaces de puerto. Entonces, incluso su computadora puede conectarlo con '127.0.0.1:6379', el php contenedor no puede hacer lo mismo.

Solución

Como se describe en Redes en Docker Compose, cada contenedor de docker compose puede acceder a otro contenedor usando el nombre del servicio como nombre de host. Por ejemplo, su programación ejecutada por el servicio php puede acceder a su servicio MySQL con el nombre de host db .

Por lo tanto, debe conectar redis con su nombre de host redis

$redis = new \Redis();
try {
    $redis->connect('redis', 6379);
} catch (\Exception $e) {
    var_dump($e->getMessage())  ;
    die;
}