Exercice 06 : Projet Capstone - Créer et Gérer une Infrastructure Docker avec Terraform
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Configurer le provider Docker dans Terraform
- ✅ Décrire une infrastructure en HCL (
resource,variable,output) - ✅ Exécuter le workflow complet :
init→plan→apply→destroy - ✅ Lire et interpréter le state Terraform
- ✅ Modifier l'infrastructure et observer les changements
Durée estimée : 40 minutes
Difficulté : ⭐⭐⭐☆☆ (Intermédiaire)
Prérequis :
- Terraform installé (
terraform version) - Docker installé et démarré
- Module Terraform Débutant complété
📖 Contexte
Vous allez créer votre première infrastructure "as code" avec Terraform, en utilisant le provider Docker (idéal pour apprendre sans cloud payant). Vous gérerez des conteneurs Docker comme des ressources Terraform, et découvrirez comment Terraform calcule et applique les changements.
📋 Énoncé
Créez une infrastructure Docker complète avec Terraform : images, réseaux, conteneurs, et outputs. Puis modifiez et détruisez cette infrastructure.
🧭 Déroulement de l'exercice
Tâche 1 : Initialiser le projet Terraform
Créez un dossier terraform-docker/ et créez les fichiers main.tf, variables.tf, et outputs.tf. Dans main.tf, déclarez le required provider Docker avec sa version et la source kreuzwerker/docker.
Indice :
`hclterraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "~> 3.0"
}
}
}
>
provider "docker" {}
`Exécutez
terraform initpour télécharger le provider.
Vérification : terraform init réussit et crée un dossier .terraform/. terraform version affiche la version de Terraform et du provider Docker.
Tâche 2 : Déclarer des variables
Dans variables.tf, déclarez 3 variables :
app_name(string, default:"mon-app")nginx_version(string, default:"1.25-alpine")http_port(number, default:8080)
Indice :
`hclvariable "app_name" {
description = "Nom de l'application"
type = string
default = "mon-app"
}
`Les variables permettent de paramétrer l'infrastructure sans modifier le code HCL principal.
Vérification : terraform console permet de taper var.app_name et voir la valeur par défaut.
Tâche 3 : Créer le réseau et l'image Docker
Dans main.tf, ajoutez deux ressources Terraform :
docker_networknommé avecvar.app_namedocker_imagepournginx:${var.nginx_version}
Indice :
`hclresource "docker_network" "app_network" {
name = "${var.app_name}-network"
}
>
resource "docker_image" "nginx" {
name = "nginx:${var.nginx_version}"
}
`
terraform planaffiche les ressources qui seraient créées.
Vérification : terraform plan affiche 2 to add, 0 to change, 0 to destroy.
Tâche 4 : Créer le conteneur et appliquer
Ajoutez une ressource docker_container dans main.tf qui utilise l'image déclarée, se connecte au réseau, et mappe var.http_port sur le port 80. Appliquez l'infrastructure.
Indice :
`hclresource "docker_container" "web" {
name = var.app_name
image = docker_image.nginx.image_id
>
ports {
internal = 80
external = var.http_port
}
>
networks_advanced {
name = docker_network.app_network.name
}
}
`
docker_image.nginx.image_idréférence l'attributimage_idde la ressource image créée.
Vérification : terraform apply réussit. docker ps affiche le conteneur mon-app. curl http://localhost:8080 retourne du HTML Nginx.
Tâche 5 : Définir les outputs et lire le state
Dans outputs.tf, déclarez des outputs pour le nom du conteneur, son ID, et l'IP du réseau.
Indice :
`hcloutput "container_name" {
value = docker_container.web.name
}
output "container_id" {
value = docker_container.web.id
}
`
terraform outputaffiche les valeurs.terraform showaffiche le state complet.terraform state listliste les ressources gérées.
Vérification : terraform output container_name retourne mon-app. terraform state list liste les 3 ressources.
Tâche 6 : Modifier l'infrastructure et détruire
Changez la variable http_port à 9090 via un fichier terraform.tfvars. Relancez plan pour voir le changement planifié, puis apply. Enfin, détruisez toute l'infrastructure.
Indice : Créez
terraform.tfvarsavechttp_port = 9090.terraform plandoit afficher que le port va changer. Certains changements forcent la recréation du conteneur (forces replacement).terraform destroysupprime toutes les ressources.
Vérification : Après apply, curl http://localhost:9090 fonctionne. Après destroy, docker ps ne liste plus le conteneur.
🗂️ Mini-Projet : Infrastructure Docker complète en HCL
Arborescence du projet :
terraform-docker/
├── main.tf
├── variables.tf
├── outputs.tf
├── terraform.tfvars
└── .terraform/ ← généré par terraform init
└── ...Workflow complet :
cd terraform-docker/
# Initialiser
terraform init
# Valider la syntaxe
terraform validate
# Prévisualiser
terraform plan
# Appliquer
terraform apply -auto-approve
# Vérifier
terraform output
terraform state list
docker ps
# Tester
curl http://localhost:8080
# Modifier le port
echo 'http_port = 9090' > terraform.tfvars
terraform plan
terraform apply -auto-approve
curl http://localhost:9090
# Nettoyer
terraform destroy -auto-approve
docker ps # → videCheckpoints de validation :
terraform inittélécharge le providerkreuzwerker/dockerterraform planaffiche3 to addavant le premier applyterraform applycrée le réseau, l'image et le conteneur Dockercurl http://localhost:8080retourne du HTML Nginxterraform outputaffiche le nom et l'ID du conteneurterraform state listliste 3 ressources géréesterraform destroysupprime toutes les ressources