Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Conexão Docker Redis recusada

Seu problema


O Docker Compose cria um contêiner docker separado para diferentes serviços. Cada contêiner é, logicamente falando, como diferentes servidores de computador separados que só se conectam entre si através da rede docker.

Considere cada caixa neste diagrama como um computador individual, então isso é praticamente o que você tem:
+----------------------------------------------------------+
|                       your machine                       |
+----------------------------------------------------------+
                               |                    
        +------ (virtual network by docker) -------+
        |                      |                   |
+-----------------+ +-------------------+ +----------------+
| "php" container | | "redis" container | | "db" container |
+-----------------+ +-------------------+ +----------------+

Seu contêiner PHP não vê nenhum redis em "localhost" porque não há redis nele. Assim como não veria nenhum MySQL em "localhost". Seu redis está sendo executado no contêiner "redis". Seu MySQL está sendo executado em seu contêiner "db".

As coisas que o confundem são as diretivas de ligação de porta (ou seja, ports nesta definição):
redis:
  build:
    context: .
    dockerfile: Dockerfile_redis
  ports:
    - "6379:6379"

A porta 6379 do contêiner "redis" está vinculado ao seu computador, mas SOMENTE ao seu computador . Outro contêiner não tem o mesmo acesso às ligações de porta. Assim, mesmo seu computador pode conectá-lo com '127.0.0.1:6379', o php container não pode fazer o mesmo.

Solução


Conforme descrito em Rede no Docker Compose, cada contêiner de composição do docker pode acessar outro contêiner usando o nome do serviço como nome do host. Por exemplo, sua programação rodando pelo serviço php pode acessar seu serviço MySQL com o nome do host db .

Portanto, você deve conectar o redis com seu nome de host redis
$redis = new \Redis();
try {
    $redis->connect('redis', 6379);
} catch (\Exception $e) {
    var_dump($e->getMessage())  ;
    die;
}