Vấn đề của bạn
Docker Compose tạo vùng chứa docker riêng biệt cho các dịch vụ khác nhau. Nói một cách logic, mỗi vùng chứa giống như các máy chủ máy tính riêng biệt khác nhau chỉ được kết nối với nhau thông qua mạng docker.
Hãy coi mỗi hộp trong sơ đồ này như một máy tính riêng lẻ, thì đây thực tế là những gì bạn có:
+----------------------------------------------------------+
| your machine |
+----------------------------------------------------------+
|
+------ (virtual network by docker) -------+
| | |
+-----------------+ +-------------------+ +----------------+
| "php" container | | "redis" container | | "db" container |
+-----------------+ +-------------------+ +----------------+
Vùng chứa PHP của bạn không thấy bất kỳ dấu đỏ nào trong "localhost" vì không có dấu đỏ nào trong đó. Giống như nó sẽ không thấy bất kỳ MySQL nào trong "localhost". Redis của bạn đang chạy trong vùng chứa "redis". MySQL của bạn đang chạy trong vùng chứa "db" của bạn.
Điều khiến bạn bối rối là các chỉ thị liên kết cổng (tức là ports
trong định nghĩa này):
redis:
build:
context: .
dockerfile: Dockerfile_redis
ports:
- "6379:6379"
Cổng 6379
của vùng chứa "redis" được liên kết với máy tính của bạn, nhưng CHỈ với máy tính của bạn . Vùng chứa khác không có cùng quyền truy cập vào các ràng buộc cổng. Vì vậy, ngay cả máy tính của bạn cũng có thể kết nối nó với '127.0.0.1:6379', php
vùng chứa không thể làm như vậy.
Giải pháp
Như được mô tả trong Mạng trong Docker Compose, mỗi vùng chứa soạn thư của docker có thể truy cập vùng chứa khác bằng cách sử dụng tên dịch vụ làm tên máy chủ. Ví dụ:chương trình của bạn chạy bằng dịch vụ php
có thể truy cập dịch vụ MySQL của bạn bằng tên máy chủ db
.
Vì vậy, bạn nên kết nối redis với tên máy chủ của nó là redis
$redis = new \Redis();
try {
$redis->connect('redis', 6379);
} catch (\Exception $e) {
var_dump($e->getMessage()) ;
die;
}