Aller au contenu

TP 1 : Provider Docker de Terraform

Découvrir le provider Docker de Terraform pour gérer des images, conteneurs, réseaux et volumes.

Ce TP permet de voir comment :

  • configurer le provider kreuzwerker/docker
  • télécharger une image Docker
  • déployer un conteneur avec exposition de port
  • créer un réseau Docker
  • monter un volume dans un conteneur
  • Terraform installé
  • Docker installé et lancé
Fenêtre de terminal
terraform version
docker version

Créez un répertoire pour votre projet :

Fenêtre de terminal
mkdir terraform-docker-tp
cd terraform-docker-tp

Créez un fichier main.tf avec le provider Docker :

terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "~> 3.0"
}
}
required_version = ">= 1.5.0"
}
provider "docker" {}

Ajoutez une ressource pour télécharger une image Docker :

resource "docker_image" "nginx_image" {
name = "nginx:stable"
keep_locally = true
}

Initialisez et appliquez :

Fenêtre de terminal
terraform init
terraform apply
docker images
resource "docker_container" "nginx_container" {
image = docker_image.nginx_image.name
name = "nginx-container"
ports {
internal = 80
external = 8080
}
}

Appliquez et vérifiez :

Fenêtre de terminal
terraform apply
docker ps
curl http://localhost:8080
resource "docker_network" "custom_network" {
name = "custom-network"
}

Connectez le conteneur au réseau :

Note : .latest est déprécié depuis la v3 du provider kreuzwerker/docker. Utiliser .image_id.

resource "docker_container" "nginx_container" {
name = "nginx-container"
image = docker_image.nginx_image.image_id
ports {
internal = 80
external = 8080
}
networks_advanced {
name = docker_network.custom_network.name
}
}

Appliquez et vérifiez :

Fenêtre de terminal
terraform apply
docker network ls
docker network inspect custom-network
resource "docker_volume" "nginx_volume" {
name = "nginx-data"
}

Montez le volume dans le conteneur :

resource "docker_container" "nginx_container" {
name = "nginx-container"
image = docker_image.nginx_image.image_id
ports {
internal = 80
external = 8080
}
networks_advanced {
name = docker_network.custom_network.name
}
volumes {
container_path = "/usr/share/nginx/html"
volume_name = docker_volume.nginx_volume.name
}
}

Pour Windows :

resource "docker_container" "nginx_container" {
name = "nginx-container"
image = docker_image.nginx_image.image_id
ports {
internal = 80
external = 8080
}
networks_advanced {
name = docker_network.custom_network.name
}
mounts {
source = "C:/docker-data/nginx"
target = "/usr/share/nginx/html"
type = "bind"
}
}

Appliquez et testez la persistance :

Fenêtre de terminal
terraform apply
docker volume ls
docker volume inspect nginx-data
echo "Hello Terraform!" > /var/lib/docker/volumes/nginx-data/_data/index.html
curl http://localhost:8080
Fenêtre de terminal
terraform destroy