Vì bạn thiếu liên kết bạn db container với php. Khi bạn liên kết db với PHP, nó sẽ có thể truy cập được từ localhost của PHP.
Đây là tôi đã sửa đổi tập tin soạn thảo docker của bạn vì tôi thích núi cao ở khắp mọi nơi;). Và tôi sử dụng adminer và liên kết với db để kết nối verfiy thay vì kiểm tra mức mã. Vì tôi không có tệp docker php nên tôi đang tạo php:alpine chứa php7.
version: "3"
services:
nginx:
image: nginx:1.13-alpine
container_name: nginx
ports:
- "8081:80"
command: nginx -g "daemon off;"
db:
image: mysql:5.5
environment:
MYSQL_ROOT_PASSWORD: example
php:
image: php:alpine
container_name: php
tty: true
links:
- db
adminer:
image: adminer
container_name: adminer
ports:
- 8080:8080
links:
- db
Sau đó, tôi đã cài đặt mysqli trong vùng chứa php
docker exec -it php ash
và chạy lệnh dưới đây
docker-php-ext-install mysqli;
Sau đó, tạo test.php
ở đây tên máy chủ là db . Lưu ý rằng tên máy chủ của bạn sẽ là tên vùng chứa db được liên kết đến php. if bạn ping db
trong php container, nó sẽ ping db container.
<?php
$servername = "db";
$username = "root";
$password = "example";
// Create connection
$conn = new mysqli($servername, $username, $password);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";
?>
Bây giờ chạy tệp này trong vùng chứa php. Bạn có thể gắn kết và chạy mã php của mình nhưng đây là những gì tôi đã làm để thử nghiệm. Và tôi đã thử với tư cách là người dùng root.
php -f test.php
Và đây là adminer cũng liên kết với db