Twój problem
Docker Compose tworzy oddzielny kontener dockera dla różnych usług. Każdy kontener jest, logicznie rzecz biorąc, jak różne oddzielne serwery komputerowe, które łączą się ze sobą tylko przez sieć dokerów.
Rozważ każde pole na tym schemacie jako indywidualny komputer, wtedy praktycznie to masz:
+----------------------------------------------------------+
| your machine |
+----------------------------------------------------------+
|
+------ (virtual network by docker) -------+
| | |
+-----------------+ +-------------------+ +----------------+
| "php" container | | "redis" container | | "db" container |
+-----------------+ +-------------------+ +----------------+
Twój kontener PHP nie widzi żadnego redis w "localhost", ponieważ nie ma w nim redis. Tak jak nie widziałby żadnego MySQL w "localhost". Twoje redis działa w kontenerze „redis”. Twój MySQL działa w Twoim kontenerze "db".
Rzeczy, które Cię dezorientują, to dyrektywy wiążące porty (np. ports
w tej definicji):
redis:
build:
context: .
dockerfile: Dockerfile_redis
ports:
- "6379:6379"
Port 6379
kontenera „redis” jest powiązany z Twoim komputerem, ale TYLKO z Twoim komputerem . Inny kontener nie ma takiego samego dostępu do powiązań portów. Więc nawet twój komputer może połączyć się z „127.0.0.1:6379”, php
kontener nie może zrobić tego samego.
Rozwiązanie
Jak opisano w sieci w Docker Compose, każdy kontener Docker Compose może uzyskać dostęp do innego kontenera przy użyciu nazwy usługi jako nazwy hosta. Na przykład, twoje programowanie uruchomione przez usługę php
może uzyskać dostęp do Twojej usługi MySQL pod nazwą hosta db
.
Powinieneś więc połączyć redis z nazwą hosta redis
$redis = new \Redis();
try {
$redis->connect('redis', 6379);
} catch (\Exception $e) {
var_dump($e->getMessage()) ;
die;
}