Uw probleem
Docker Compose maakt een afzonderlijke docker-container voor verschillende services. Elke container is, logisch gezien, als verschillende afzonderlijke computerservers die alleen met elkaar zijn verbonden via een docker-netwerk.
Beschouw elk vakje in dit diagram als een individuele computer, dan is dit praktisch wat je hebt:
+----------------------------------------------------------+
| your machine |
+----------------------------------------------------------+
|
+------ (virtual network by docker) -------+
| | |
+-----------------+ +-------------------+ +----------------+
| "php" container | | "redis" container | | "db" container |
+-----------------+ +-------------------+ +----------------+
Uw PHP-container ziet geen redis in "localhost" omdat er geen redis in zit. Net zoals het geen MySQL zou zien in "localhost". Uw redis wordt uitgevoerd in de "redis"-container. Uw MySQL wordt uitgevoerd in uw "db"-container.
De dingen die u in verwarring brengen, zijn de bindende richtlijnen voor poorten (d.w.z. ports
in deze definitie):
redis:
build:
context: .
dockerfile: Dockerfile_redis
ports:
- "6379:6379"
De poort 6379
van de "redis"-container is gebonden aan uw computer, maar ALLEEN aan uw computer . Andere containers hebben niet dezelfde toegang tot de poortbindingen. Dus zelfs je computer kan hem verbinden met '127.0.0.1:6379', de php
container kan niet hetzelfde.
Oplossing
Zoals beschreven in Netwerken in Docker Compose, heeft elke docker compose-container toegang tot een andere container door de servicenaam als hostnaam te gebruiken. Uw programmering wordt bijvoorbeeld uitgevoerd door service php
heeft toegang tot uw MySQL-service met de hostnaam db
.
Dus je moet redis verbinden met zijn hostnaam redis
$redis = new \Redis();
try {
$redis->connect('redis', 6379);
} catch (\Exception $e) {
var_dump($e->getMessage()) ;
die;
}