Cours Docker PRATIQUE
Cours Docker PRATIQUE
Cours Docker PRATIQUE
Objectifs
Définition
Avantages
2.1 Images
Une image est un modèle immuable qui contient tout ce dont une application a besoin
pour s'exécuter (code, bibliothèques, configurations).
Les images sont créées à partir d'un fichier Dockerfile.
2.2 Conteneurs
Docker Hub est un registre public où sont stockées et partagées les images Docker.
3. Installation de Docker
Sur Linux (Ubuntu) :
Vérifiez l'installation :
docker --version
docker images
Conteneurs actifs :
docker ps
docker ps -a
docker rm <nom_conteneur>
Points clés
docker --version
Les serveurs web populaires comme nginx ou Apache HTTP Server sont disponibles sur
Docker Hub.
html
<!DOCTYPE html>
<html>
<head>
<title>Mon Serveur Web Docker</title>
</head>
<body>
<h1>Bienvenue sur mon serveur web avec Docker !</h1>
</body>
</html>
2. Partager le fichier avec le conteneur
Arrêter le conteneur :
Redémarrer le conteneur :
Supprimer le conteneur :
docker rm mon_nginx
Si vous voulez créer une image personnalisée avec votre serveur web et contenu inclus,
utilisez un fichier Dockerfile.
dockerfile
FROM nginx:latest
COPY index.html /usr/share/nginx/html/index.html
dockerfile
Copier le code
# Utilisez une image de base avec MySQL
FROM mysql:8.0
bash
Copier le code
docker build -t mysql-web-server .
bash
Copier le code
docker run -d -p 8080:80 -p 3306:3306 --name mysql-web-server mysql-web-
server
Volumes : Ajoutez des volumes pour persister les données MySQL ou servir des
fichiers web depuis l’hôte.
Docker Compose : Pour un environnement plus structuré, utilisez Docker Compose
pour gérer MySQL et le serveur web dans des services distincts.
4o
ChatGPT
Créer un volume pour un conteneur Docker permet de persister des données, même si le
conteneur est recréé ou supprimé. Voici comment configurer un volume pour MySQL ou un
serveur web.
Docker gère les volumes via des commandes simples. Vous pouvez créer un volume dédié
pour les données MySQL avec cette commande :
bash
Copier le code
docker volume create mysql_data
Cela crée un volume nommé mysql_data qui pourra être utilisé pour stocker les données
MySQL.
Étape 2 : Attacher le volume dans un conteneur
Lors de l'exécution d'un conteneur MySQL, vous devez monter ce volume. Par exemple :
bash
Copier le code
docker run -d --name mysql-container \
-e MYSQL_ROOT_PASSWORD=rootpassword \
-v mysql_data:/var/lib/mysql \
mysql:8.0
Pour Apache ou Nginx, vous pouvez créer un volume pour stocker les fichiers du site web :
bash
Copier le code
docker volume create web_content
bash
Copier le code
docker run -d --name apache-container \
-v web_content:/var/www/html \
-p 8080:80 \
httpd:2.4
Pour ajouter ou modifier les fichiers dans le volume depuis votre hôte :
bash
Copier le code
docker volume inspect web_content
2. Naviguez dans le chemin retourné, puis placez vos fichiers dans ce dossier.
Étape 5 : Vérification
dockerfile
Copier le code
VOLUME /var/lib/mysql
VOLUME /var/www/html
Mais cette méthode ne permet pas de nommer les volumes. Elle est utile pour des
configurations automatisées.
Souhaitez-vous continuer avec une configuration Docker Compose qui inclut ces volumes ?
4o
oui
ChatGPT a dit :
ChatGPT
Avec Docker Compose, vous pouvez gérer facilement les volumes et configurer plusieurs
services comme MySQL et un serveur web. Voici comment configurer un fichier docker-
compose.yml avec des volumes.
yaml
Copier le code
version: '3.9'
services:
mysql:
image: mysql:8.0
container_name: mysql-container
restart: always
environment:
MYSQL_ROOT_PASSWORD: rootpassword
volumes:
- mysql_data:/var/lib/mysql
ports:
- "3306:3306"
web:
image: httpd:2.4
container_name: apache-container
restart: always
volumes:
- web_content:/usr/local/apache2/htdocs
ports:
- "8080:80"
volumes:
mysql_data:
web_content:
bash
Copier le code
docker-compose up -d
Les volumes créés par Docker Compose sont gérés automatiquement. Vous pouvez inspecter
leur emplacement sur votre hôte avec :
bash
Copier le code
docker volume inspect web_content
Accédez au chemin indiqué et ajoutez vos fichiers HTML pour qu’ils soient visibles sur le
serveur web.
bash
Copier le code
docker-compose down
Par défaut, les volumes créés avec Docker Compose ne sont pas supprimés, ce qui garantit la
persistance des données.
bash
Copier le code
docker-compose down -v
1. mysql_data : Stocke les données de MySQL, comme les bases de données et les
journaux de transaction.
2. web_content : Permet de servir vos fichiers web.
html
Copier le code
<h1>Bienvenue sur Docker Compose !</h1>
4o
ChatGPT
Ajoutons phpMyAdmin à votre configuration Docker Compose pour gérer MySQL via une
interface web.
yaml
Copier le code
version: '3.9'
services:
mysql:
image: mysql:8.0
container_name: mysql-container
restart: always
environment:
MYSQL_ROOT_PASSWORD: rootpassword
volumes:
- mysql_data:/var/lib/mysql
ports:
- "3306:3306"
web:
image: httpd:2.4
container_name: apache-container
restart: always
volumes:
- web_content:/usr/local/apache2/htdocs
ports:
- "8080:80"
phpmyadmin:
image: phpmyadmin:latest
container_name: phpmyadmin-container
restart: always
environment:
PMA_HOST: mysql
PMA_PORT: 3306
ports:
- "8081:80"
volumes:
mysql_data:
web_content:
1. Service phpmyadmin :
o Utilise l’image officielle phpmyadmin:latest.
o Connecte phpMyAdmin à MySQL via le service mysql.
o Expose phpMyAdmin sur le port 8081 de l’hôte.
2. Variable d’environnement :
o PMA_HOST : Spécifie le conteneur MySQL auquel phpMyAdmin doit se
connecter.
o PMA_PORT : Définit le port utilisé pour MySQL (par défaut 3306).
bash
Copier le code
docker-compose up -d
php
Copier le code
<?php
phpinfo();
?>
bash
Copier le code
docker-compose down
Étape Bonus : Ajouter PHP au serveur Apache
Pour activer PHP sur Apache, modifiez la configuration. Si vous le souhaitez, je peux adapter
le fichier Docker Compose pour inclure une image avec PHP. Voulez-vous cette amélioration
?
4o
oui
ChatGPT a dit :
ChatGPT
Pour activer PHP sur le serveur Apache dans votre configuration Docker Compose, nous
allons remplacer l'image httpd:2.4 par une image officielle d'Apache avec PHP intégré,
telle que php:apache.
yaml
Copier le code
version: '3.9'
services:
mysql:
image: mysql:8.0
container_name: mysql-container
restart: always
environment:
MYSQL_ROOT_PASSWORD: rootpassword
volumes:
- mysql_data:/var/lib/mysql
ports:
- "3306:3306"
web:
image: php:8.2-apache
container_name: apache-php-container
restart: always
volumes:
- web_content:/var/www/html
ports:
- "8080:80"
phpmyadmin:
image: phpmyadmin:latest
container_name: phpmyadmin-container
restart: always
environment:
PMA_HOST: mysql
PMA_PORT: 3306
ports:
- "8081:80"
volumes:
mysql_data:
web_content:
1. Service web :
o L'image php:8.2-apache inclut PHP 8.2 et Apache configurés ensemble.
o Les fichiers HTML et PHP du site seront stockés dans le volume
web_content (monté sur /var/www/html).
2. Autres services :
o Aucune modification pour mysql et phpmyadmin.
php
Copier le code
<?php
echo "Bienvenue sur Apache avec PHP dans Docker !";
phpinfo();
?>
Si votre projet nécessite des extensions PHP spécifiques (comme pdo_mysql pour la
connexion MySQL), modifiez le service web pour les installer via Dockerfile.
dockerfile
Copier le code
FROM php:8.2-apache
yaml
Copier le code
web:
build:
context: .
dockerfile: Dockerfile
container_name: apache-php-container
restart: always
volumes:
- web_content:/var/www/html
ports:
- "8080:80"
bash
Copier le code
docker-compose up --build -d
phpMyAdmin reste disponible sur http://localhost:8081 pour gérer vos bases MySQL.
Souhaitez-vous ajouter des exemples de connexion MySQL depuis un script PHP pour tester
la configuration complète ?
Pour tester la connexion à MySQL depuis un script PHP, nous allons créer un fichier PHP
simple qui se connecte à la base de données MySQL et affiche un message confirmant la
connexion.
Avant de tester, connectez-vous à MySQL via phpMyAdmin ou le client MySQL pour créer
une base de données :
1. Accédez à http://localhost:8081.
2. Connectez-vous avec :
o Utilisateur : root
o Mot de passe : rootpassword
3. Créez une base de données nommée test_db.
php
Copier le code
<?php
$servername = "mysql";
$username = "root";
$password = "rootpassword";
$database = "test_db";
try {
// Connexion à MySQL
$conn = new PDO("mysql:host=$servername;dbname=$database", $username,
$password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
text
Copier le code
Connexion réussie à la base de données 'test_db'!
3. Si une erreur se produit, le message affichera des détails sur le problème (par
exemple, informations de connexion incorrectes ou problème réseau).
Pour tester des requêtes SQL, modifiez le fichier db_test.php pour insérer et lire des
données :
php
Copier le code
<?php
$servername = "mysql";
$username = "root";
$password = "rootpassword";
$database = "test_db";
try {
$conn = new PDO("mysql:host=$servername;dbname=$database", $username,
$password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Listez les conteneurs en cours d'exécution pour identifier celui que vous souhaitez atteindre :
bash
Copier le code
docker ps
La sortie montre :
bash
Copier le code
docker run -d -p 8080:80 --name my_container ubuntu
Docker utilise par défaut le réseau bridge. Vous pouvez vérifier les réseaux existants :
bash
Copier le code
docker network ls
bash
Copier le code
docker network create my_network
bash
Copier le code
docker network connect my_network my_container
4. Accéder au conteneur via SSH (optionnel)
bash
Copier le code
docker exec -it my_container bash
apt update
apt install openssh-server -y
service ssh start
Assurez-vous que le port SSH (par défaut 22) est exposé lorsque vous démarrez le
conteneur :
bash
Copier le code
docker run -d -p 2222:22 --name ssh_container ubuntu
bash
Copier le code
ssh user@host_ip -p 2222
Si votre conteneur exécute une application ou un service web (par exemple, un serveur Nginx
sur le port 80) :
bash
Copier le code
curl http://host_ip:8080
Utilisez Docker pour vous connecter directement au conteneur via son IP interne :
Étape 1 : Récupérez l'adresse IP du conteneur
bash
Copier le code
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}
{{end}}' my_container
bash
Copier le code
docker exec -it my_container bash
7. Dépannage
bash
Copier le code
docker ps
bash
Copier le code
docker logs my_container
Avec ces étapes, vous pourrez vous connecter efficacement à un conteneur via le réseau.