Ditt problem
Docker Compose skapar en separat dockningsbehållare för olika tjänster. Varje container är, logiskt sett, som olika separerade datorservrar som endast är anslutna till varandra via dockningsnätverk.
Betrakta varje ruta i det här diagrammet som en individuell dator, då är detta praktiskt taget vad du har:
+----------------------------------------------------------+
| your machine |
+----------------------------------------------------------+
|
+------ (virtual network by docker) -------+
| | |
+-----------------+ +-------------------+ +----------------+
| "php" container | | "redis" container | | "db" container |
+-----------------+ +-------------------+ +----------------+
Din PHP-behållare ser inte någon redis i "localhost" eftersom det inte finns någon redis i den. Precis som att den inte skulle se någon MySQL i "localhost". Din redis körs i "redis"-behållaren. Din MySQL körs i din "db"-behållare.
Det som förvirrar dig är de portbindande direktiven (dvs. ports
i denna definition):
redis:
build:
context: .
dockerfile: Dockerfile_redis
ports:
- "6379:6379"
Porten 6379
av "redis"-behållaren är bunden till din dator, men ENDAST till din dator . Andra behållare har inte samma tillgång till hamnbindningarna. Så även din dator kan ansluta den med '127.0.0.1:6379', php
container kan inte göra detsamma.
Lösning
Som beskrivs i Nätverk i Docker Compose kan varje docker compose-behållare komma åt andra behållare genom att använda tjänstens namn som värdnamn. Till exempel, din programmering som körs av tjänsten php
kan komma åt din MySQL-tjänst med värdnamnet db
.
Så du bör ansluta redis med dess värdnamn redis
$redis = new \Redis();
try {
$redis->connect('redis', 6379);
} catch (\Exception $e) {
var_dump($e->getMessage()) ;
die;
}