Váš problém
Docker Compose vytváří oddělený kontejner dockeru pro různé služby. Každý kontejner je, logicky řečeno, jako různé oddělené počítačové servery, které se vzájemně propojují pouze prostřednictvím dockerové sítě.
Považujte každé pole v tomto diagramu za samostatný počítač, pak máte prakticky toto:
+----------------------------------------------------------+
| your machine |
+----------------------------------------------------------+
|
+------ (virtual network by docker) -------+
| | |
+-----------------+ +-------------------+ +----------------+
| "php" container | | "redis" container | | "db" container |
+-----------------+ +-------------------+ +----------------+
Váš kontejner PHP nevidí žádné redis v "localhost", protože v něm není žádný redis. Stejně jako by to nevidělo žádné MySQL v "localhost". Váš redis běží v kontejneru „redis“. Vaše MySQL běží ve vašem "db" kontejneru.
Věci, které vás mate, jsou direktivy port binding (tj. ports
v této definici):
redis:
build:
context: .
dockerfile: Dockerfile_redis
ports:
- "6379:6379"
Port 6379
kontejneru „redis“ je vázán na váš počítač, ale POUZE k vašemu počítači . Jiný kontejner nemá stejný přístup k vazbám portu. Takže i váš počítač jej může propojit s '127.0.0.1:6379', php
kontejner nemůže udělat totéž.
Řešení
Jak je popsáno v Networking in Docker Compose, každý kontejner docker Compose může přistupovat k jinému kontejneru pomocí názvu služby jako názvu hostitele. Například vaše programování běžící službou php
může přistupovat k vaší službě MySQL s názvem hostitele db
.
Měli byste tedy propojit redis s jeho názvem hostitele redis
$redis = new \Redis();
try {
$redis->connect('redis', 6379);
} catch (\Exception $e) {
var_dump($e->getMessage()) ;
die;
}