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