Тъй като ви липсва връзка вие db контейнер с php. Когато свържете db с PHP, той ще бъде достъпен от localhost на PHP.
Ето аз промених вашия файл docker-compose, тъй като харесвам alpine навсякъде;). И аз използвам администратор и връзка с db за проверка на връзката вместо проверка на ниво код. Тъй като нямам php docker файл, създавам php:alpine, който съдържа 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
След това инсталирах mysqli в php контейнер
docker exec -it php ash
и изпълнете командата по-долу
docker-php-ext-install mysqli;
След това създайте test.php
тук името на сървъра е db . Имайте предвид, че името на вашия сървър ще бъде това, което е името на контейнера db, което е връзка към php.if ping db
в php контейнер той ще ping 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";
?>
Сега стартирайте този файл в php контейнер. Можете да монтирате и стартирате вашия php код, но това е, което направих за тестване. И аз се опитах като root потребител.
php -f test.php
И тук е администратор, който също се свързва с db