Eftersom du saknar länkning du db-behållare med php. När du länkar db med PHP kommer den att vara tillgänglig från PHPs lokala värd.
Här är jag modifierade din docker-compose-fil eftersom jag gillar alpin överallt;). Och jag använder adminer och länkar med db för att verifiera anslutningen istället för att kontrollera kodnivån. Eftersom jag inte har din php docker-fil så skapar jag php:alpine som innehåller 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
Sedan installerade jag mysqli i php-behållare
docker exec -it php ash
och kör under kommandot
docker-php-ext-install mysqli;
Skapa sedan test.php
här är servernamnet db . Observera att ditt servernamn kommer att vara det som är db containernamn som är länk till php.om du ping db
i php-behållaren kommer den att pinga db-behållare.
<?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";
?>
Kör nu den här filen i php-behållaren. Du kan montera och köra din php-kod men det här är vad jag gjorde för att testa. Och jag försökte som root-användare.
php -f test.php
Och här är adminer som också länkar till db