Il tuo problema
Docker Compose crea un contenitore Docker separato per diversi servizi. Ogni container è, logicamente parlando, come diversi server di computer separati che si connettono tra loro solo tramite una rete docker.
Considera ogni casella in questo diagramma come un singolo computer, quindi questo è praticamente quello che hai:
+----------------------------------------------------------+
| your machine |
+----------------------------------------------------------+
|
+------ (virtual network by docker) -------+
| | |
+-----------------+ +-------------------+ +----------------+
| "php" container | | "redis" container | | "db" container |
+-----------------+ +-------------------+ +----------------+
Il tuo contenitore PHP non vede alcun redis in "localhost" perché non contiene redis. Proprio come non vedrebbe alcun MySQL in "localhost". Il tuo redis è in esecuzione nel contenitore "redis". Il tuo MySQL è in esecuzione nel tuo contenitore "db".
Le cose che ti confondono sono le direttive di associazione delle porte (cioè ports
in questa definizione):
redis:
build:
context: .
dockerfile: Dockerfile_redis
ports:
- "6379:6379"
La porta 6379
del contenitore "redis" è associato al tuo computer, ma SOLO al tuo computer . L'altro contenitore non ha lo stesso accesso ai collegamenti della porta. Quindi anche il tuo computer può collegarlo con '127.0.0.1:6379', il php
container non può fare lo stesso.
Soluzione
Come descritto in Rete in Docker Compose, ogni contenitore Docker Compose può accedere ad altri contenitori usando il nome del servizio come nome host. Ad esempio, la tua programmazione eseguita dal servizio php
può accedere al tuo servizio MySQL con il nome host db
.
Quindi dovresti connettere redis con il suo nome host redis
$redis = new \Redis();
try {
$redis->connect('redis', 6379);
} catch (\Exception $e) {
var_dump($e->getMessage()) ;
die;
}