Pour tout ce qui suit, il faut avoir sous Windows ou MacOS démarré Docker Desktop.
Déploiement d’un site pur front end mono container
C’est le cas le plus simple.
Pour rappeler une image Docker est construite en copiant les fichiers d’un projet vers une image qui sera « buildée ». Cette image sera runnée pour devenir un container.
Déploiement d’une application PHP/MySQL multicontainer
Une application PHP/MySQL est fait d’un script PHP et d’une base de données. On ne peut pas mettre dans une seule image, donc il nous faudra deux images, les runner sous forme de deux containers. Il faut que la bse de données soit disponible avant que le script PHP ne soit exécuté.
Le script PHP va faire une requête en base de donnée, donc il faut que les deux containers puissent communiquer entre eux.
Enfin on doit pouvoir visiter l’application PHP depui snotre ordinateur hôte.
FROM php:7.3-apache #Install git and MySQL extensions for PHP RUN apt-get update && apt-get install -y git RUN docker-php-ext-install pdo pdo_mysql mysqli RUN a2enmod rewrite COPY src /var/www/html/ EXPOSE 80/tcp EXPOSE 443/tcp
On va builder une image pour le projet PHP, pour l’image de MySQL on va prendre l’image officielle de MySQL.
Et pour mettre en musique les deux images, on a le fichier docker-compose.yml
version: '3.8'
volumes:
mysql_data:
# Persistent storage for MySQL data
services:
mysql:
image: mysql:8.0
container_name: mysql8
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: app_db # Create a default database
MYSQL_USER: app_user # Create a non-root user
MYSQL_PASSWORD: app_password # Password for the non-root user
ports:
- "3306:3306" # Optional: Expose MySQL port to host
volumes:
- mysql_data:/var/lib/mysql # Persist database files
restart: always
php:
container_name: php_app
build:
context: .
dockerfile: Dockerfile
ports:
- "8080:80" # Map port 80 in the container to port 8080 on the host
depends_on:
- mysql # Ensure MySQL starts before PHP
environment:
MYSQL_DB_HOST: mysql # MySQL service hostname
MYSQL_DB_PORT: 3306
MYSQL_DB_USER: app_user
MYSQL_DB_PASS: app_password
MYSQL_DB_NAME: app_db
Ne soyez pas effrayés par la syntaxe, il y a un formalisme qui reste le même pour ce genre de fichier.
Ici on a deux images, l’image de Mysql est configurée avec le mot de passe root, nom de la bdd, du user et le mot de passe du user non root. On mappe le port 3306 de l’hôte (à gauche des deux points) à celui du container (à droite).
Pour le container de l’application PHP, on définit des variables d’environnement qui sont bien sûr un peu identique aux pramétrage de du container MySQL, mais on n’est pas obligé de les avoir et on peut coder en dur dans le script les mots de passe et autre nom de base de donnée. On mappe le port 8080 de l’hôte au port 80 du container. Pour lancer l amachinerie faites :
docker-compose up docker-compose docn pour arrêter # et si vous faites des modifications il faut rebuilder l'image
Vous allez peut être rencontrer un soucis pour la connexion à la base de données, MySQL8, qui utiliser un hashage nouveau, il vous faudra rentrer dans le docker de MySQL et taper la commande suivante:
docker exec -it mysql8 mysql -uroot -psecret //mysql native password use sha1, newer method use sha2 but not supported by PDO, so roll back to native password //et une fois dans le prompt de MySQL: //exécutez la requêtes SLQ suivante : ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'secret'; FLUSH PRIVILEGES;
Cette commande a pour but d’utiliser l’ancien algorithme de hashage de mot de passe.
Le script PHP
C’est un simple script qui fait une connexion à al base de donnée et va dumper l’objet PDO
<!DOCTYPE html>
<html lang="en">
<head>
<title>Show databases in MySQL server</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<h1>Show databases in MySQL server</h1>
<?php
$dsn = 'mysql:host=mysql;dbname=app_db';
$user = "root";
$pass = "secret";
// Création de l'objet de connexion qui va nous permettre de faire des requêtes SQL
$pdo = new \PDO($dsn, $user, $pass);
$result = $pdo->exec("SET CHARACTER SET utf8");
var_dump($pdo);
?>
</div>
</body>
</html>