PHP verbinden met MariaDB container

Nu we de standaard PHP container hebben draaien en de phpinfo zichtbaar hebben op de website kunnen we een 2de image gaan maken en deze met een PDO verbinding de database ophalen uit de vorige les.

Zorg er dus voor dat de MariaDB container draait met daarin een test_db, ga na of deze draait en of er een database aanwezig is.

Met docker ps draaien er nu 2 containers:

CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS          PORTS                  NAMES
d77d71d759e1   my-php       "docker-php-entrypoi…"   46 minutes ago   Up 46 minutes   0.0.0.0:80->80/tcp     my-php-app
2e11bc5dcba4   mariadb      "docker-entrypoint.s…"   5 hours ago      Up 43 minutes   3306/tcp               mariadbdemo

Het is dus zaak dat er een interne MariaDB draait, met geen poorten open op de host server.

We gaan een nieuwe image maken voor de php met pdo verbinding. Maak hiervoor in je home-directory een nieuwe directory:

mkdir php-pdo && cd php-pdo

maak hierin een directory voor de website:

mkdir web-pdo && cd web-pdo

Maak hierin een index.php:

nano index.php

Plaats daarin je php met daarin de PDO verbinding:

<?php

$user = "root";
$password = "password";
$database = "db_noorderpoort";
$table = "Teachers";
try {
  $db = new PDO("mysql:host=172.17.0.2;dbname=$database", $user, $password);
  echo "<h2>Print Teachers Noorderpoort</h2><ol>";
  foreach($db->query("SELECT FirstName FROM $table") as $row) {
    echo "<li>" . $row['FirstName'] . "</li>";
  }
  echo "</ol>";
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}
?>

Zorg ervoor dat de namen/IP-adres/Wachtwoorden/databases/tabellen overeenkomen met jouw omgeving!

Het (interne-docker)ip-adres van je MariaDB haal je op met:

docker inspect mariadbdemo | grep IPAddress

Als dit gereed staat ga je 1 directory terug naar:

cd ~/php-pdo

Hier maak je de Dockerfile met de volgende inhoud:

FROM php:8.0-apache
COPY ./web-pdo/ /var/www/html/
RUN docker-php-ext-install pdo pdo_mysql

Zie dat er een php installatie plaats vindt om pdo verbindingen mogelijk te maken.

Maak nu van je Dockerfile een image:

docker build -t my-php-pdo .

En run daarna de image op een andere poort dan poort 80:

docker run --name my-php-pdo -p 8080:80 -d my-php-pdo

met docker ps controleren of de container draait:

CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS          PORTS                  NAMES
85dff9d35bfe   my-php-pdo   "docker-php-entrypoi…"   23 minutes ago   Up 23 minutes   0.0.0.0:8080->80/tcp   my-php-pdo
d77d71d759e1   my-php       "docker-php-entrypoi…"   46 minutes ago   Up 46 minutes   0.0.0.0:80->80/tcp     my-php-app
2e11bc5dcba4   mariadb      "docker-entrypoint.s…"   5 hours ago      Up 43 minutes   3306/tcp               mariadbdemo

Daarna ga je naar de website met een browser om te zien of je database nu beschikbaar is op de website.