Вашият проблем
Docker Compose създава отделен контейнер за докер за различни услуги. Всеки контейнер е, логично казано, като различни отделни компютърни сървъри, които се свързват един с друг само чрез докер мрежа.
Разгледайте всяко поле в тази диаграма като отделен компютър, тогава на практика имате това:
+----------------------------------------------------------+
| your machine |
+----------------------------------------------------------+
|
+------ (virtual network by docker) -------+
| | |
+-----------------+ +-------------------+ +----------------+
| "php" container | | "redis" container | | "db" container |
+-----------------+ +-------------------+ +----------------+
Вашият PHP контейнер не вижда redis в "localhost", защото в него няма redis. Точно както няма да види MySQL в "localhost". Вашият redis работи в контейнера "redis". Вашият MySQL работи във вашия "db" контейнер.
Нещата, които ви объркват, са директивите за свързване на портове (т.е. ports
в това определение):
redis:
build:
context: .
dockerfile: Dockerfile_redis
ports:
- "6379:6379"
Портът 6379
на контейнера "redis" е свързан към вашия компютър, но САМО към вашия компютър . Друг контейнер няма същия достъп до връзките на портовете. Така че дори вашият компютър може да го свърже с '127.0.0.1:6379', php
контейнерът не може да направи същото.
Решение
Както е описано в Работа в мрежа в Docker Compose, всеки контейнер за docker compose може да има достъп до друг контейнер, като използва името на услугата като име на хост. Например, вашето програмиране се изпълнява от услуга php
има достъп до вашата MySQL услуга с името на хоста db
.
Така че трябва да свържете redis с неговото име на хост redis
$redis = new \Redis();
try {
$redis->connect('redis', 6379);
} catch (\Exception $e) {
var_dump($e->getMessage()) ;
die;
}