TL;DR
コンテナ間の通信がうまくいかなくてかなりハマったdocker学習中なので備忘録
コンテナ間でアクセスする時のホストは127.0.0.1
でなくredis
というコンテナ名で大丈夫
docker-compose.yml
version: "3.4"
services:
web:
image: nginx:1.15
links:
- app
volumes:
- ./default.conf:/etc/nginx/conf.d/default.conf
- ../:/usr/local/dir
ports:
- "8888:80"
env_file: .env
app:
build: .
tty: true
working_dir: /usr/local/dir
links:
- redis
volumes:
- ../:/usr/local/dir
env_file: .env
redis:
image: redis:latest
ports:
- 6379:6379
command: redis-server
- 構成は
php7.3-alpine
+nginx
+redis
でPHPでPredis使用 - PHP内で以下のようにPredisをnew
public function __construcr($port, $host)
{
$client = new Predis\Client([
'scheme' => 'tcp',
'host' => $host,
'port' => $port,
]);
}
- この
$host
の実態は、$_SERVER
から取得した127.0.0.1
- ログを見るとnewはできているものの、Predis呼び出しの時に
Connection Refused 127.0.0.1:6379
的なメッセージが
解決策
public function __construcr($port, $host)
{
//このホストを127.0.0.1=>"redis"に
$client = new Predis\Client([
'scheme' => 'tcp',
'host' => $host,
'port' => $port,
]);
}
- この
127.0.0.1
というのはappコンテナ内だと、そのコンテナ(appコンテナ)のIPアドレス - redisコンテナは別なので、ホスト名を明示的にしてあげないとアクセスできない
- ただ同じネットワーク内なので
redis
と明示してあげればOK