あなたの問題
Docker Composeは、さまざまなサービス用に個別のDockerコンテナーを作成します。各コンテナは、論理的に言えば、Dockerネットワークを介してのみ相互に接続されている別々のコンピュータサーバーのようなものです。
この図の各ボックスを個別のコンピューターと見なすと、これが実際に使用できるものになります。
+----------------------------------------------------------+
| your machine |
+----------------------------------------------------------+
|
+------ (virtual network by docker) -------+
| | |
+-----------------+ +-------------------+ +----------------+
| "php" container | | "redis" container | | "db" container |
+-----------------+ +-------------------+ +----------------+
PHPコンテナには、redisがないため、「localhost」にredisは表示されません。 「localhost」にMySQLが表示されないのと同じように。 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
で実行されているプログラミング ホスト名db
でMySQLサービスにアクセスできます 。
したがって、redisをそのホスト名redis
に接続する必要があります
$redis = new \Redis();
try {
$redis->connect('redis', 6379);
} catch (\Exception $e) {
var_dump($e->getMessage()) ;
die;
}