Como você está perdendo a vinculação você db container com php. Quando você vincula o db com o PHP, ele estará acessível a partir do localhost do PHP.
Aqui está eu modifiquei seu arquivo docker-compose, pois gosto de alpino em todos os lugares;). E eu uso adminer e link com db para verificar a conexão em vez de verificar o nível de código. Como eu não tenho o arquivo php docker, estou criando php:alpine que contém 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
Então eu instalei o mysqli no contêiner php
docker exec -it php ash
e execute abaixo do comando
docker-php-ext-install mysqli;
Em seguida, crie test.php
aqui o nome do servidor é db . Observe que o nome do seu servidor será o nome do contêiner db, que é um link para php.se você
ping db
no contêiner php, ele fará ping no contêiner 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";
?>
Agora execute este arquivo no contêiner php. Você pode montar e executar seu código php, mas isso é o que eu fiz para testar. E eu tentei como usuário root.
php -f test.php
E aqui está o administrador que também liga com o db