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