Ponieważ brakuje Ci powiązania masz kontener db z php. Kiedy połączysz db z PHP, będzie on dostępny z lokalnego hosta PHP.
Oto zmodyfikowałem twój plik docker-compose, ponieważ wszędzie lubię alpejskie;). Używam administratora i linku z db do weryfikacji połączenia zamiast sprawdzania poziomu kodu. Ponieważ nie mam pliku docker php, więc tworzę php:alpine, który zawiera php7.
Wersjaversion: "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
Następnie zainstalowałem mysqli w kontenerze php
docker exec -it php ash
i uruchom poniżej polecenie
docker-php-ext-install mysqli;
Następnie utwórz test.php
tutaj nazwa serwera to db . Zauważ, że nazwa twojego serwera będzie taka, jak nazwa kontenera bazy danych, która jest linkiem do php.jeśli ping db
w kontenerze php będzie pingować kontener db.
<?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";
?>
Teraz uruchom ten plik w kontenerze php. Możesz zamontować i uruchomić swój kod php, ale to właśnie zrobiłem do testowania. I próbowałem jako użytkownik root.
php -f test.php
A oto administrator, który również łączy się z db