Cursus
J'ai consacré de nombreuses heures à la gestion manuelle des conteneurs Docker dans les environnements de développement et de production. Les configurations incompatibles, les états instables et l'incertitude quant à la compatibilité de ma configuration locale avec la production ont compliqué chaque déploiement. Lorsque j'ai découvert le fournisseur Docker de Terraform, tout a changé.
Dans ce tutoriel, je vais vous guider à travers l'intégration de Terraform avec Docker afin de créer une infrastructure reproductible et contrôlée par version. Vous apprendrez à provisionner des conteneurs, à gérer les réseaux et les volumes, à mettre en œuvre des contraintes de ressources et à maintenir l'état au sein de votre équipe.
Que vous gériez des serveurs de compilation ou orchestriez des microservices, veuillez vous munir de votre terminal et transformons ensemble votre manière de gérer l'infrastructure Docker.
Si vous débutez avec Docker, je vous recommande de commencer par notre cours Introduction à Docker.
Qu'est-ce que l'intégration Terraform Docker ?
Terraform est un outil d'infrastructure en tant que code qui gère les cycles de vie des ressources via un flux de travail déclaratif. Au lieu d'exécuter des commandes Docker individuelles, vous définissez l'état souhaité de l'infrastructure dans des fichiers de configuration. Terraform exécute ensuite un cycle de vie planifier-appliquer-supprimer : il calcule les modifications requises, affiche un aperçu et ne les applique qu'après approbation.
Le serveur Terraform Docker provider sert de couche de traduction entre le code HashiCorp Configuration Language (HCL) et l'API Docker. Lors de l'écriture d'resource “docker_container" s dans une configuration, le fournisseur convertit cette déclaration en appels API Docker appropriés. Cette abstraction signifie que les ressources Docker peuvent être gérées à l'aide du même flux de travail que celui utilisé pour l'infrastructure cloud.
C'est en ce point que Terraform se distingue de Docker Compose.
Bien que Compose gère les conteneurs selon une approche basée sur les projets à l'aide de fichiers YAML, il ne conserve pas de fichier d'état répertoriant ce qui existe réellement.
Terraform, en revanche, enregistre toutes les ressources qu'il crée dans terraform.tfstate, ce qui lui permet de détecter les divergences entre ma configuration et la réalité. Si quelqu'un modifie manuellement un conteneur, Terraform le détectera et pourra le restaurer à l'état défini.

Cette approche est particulièrement efficace dans plusieurs scénarios :
- Pour les serveurs de compilation reproductibles, il est possible de supprimer et de recréer l'environnement complet à l'aide d'une seule commande, garantissant ainsi la cohérence.
- Dans les environnements de test, il est possible de mettre en place une infrastructure isolée pour chaque exécution de test.
- Pour les déploiements immuables, il est préférable de remplacer entièrement les conteneurs plutôt que de les modifier sur place, ce qui réduit les risques liés au déploiement.
Conditions préalables et installation
Avant de nous plonger dans les configurations Terraform, veuillez vérifier que les outils requis sont installés et correctement configurés.
Respect des exigences du système
Veuillez d'abord vérifier que Docker Engine est opérationnel sur votre machine.
-
Linux : Veuillez vérifier auprès de
docker ps -
macOS ou Windows : Veuillez vous assurer que Docker Desktop est correctement installé et opérationnel.
Le fournisseur Terraform doit pouvoir accéder au démon Docker. Il est donc nécessaire de vérifier que votre utilisateur dispose des autorisations requises pour accéder au socket Unix à l'adresse /var/run/docker.sock sous Linux ou au canal nommé sous Windows.
Ensuite, veuillez installer l'interface CLI Terraform à partir du site officiel de HashiCorp. L'installation de Terraform varie selonle système d'exploitation :
-
Linux : Veuillez télécharger le paquet approprié ou utiliser le gestionnaire de paquets de votre distribution.
-
macOS : Veuillez utiliser Homebrew. Veuillez d'abord installer le tap HashiCorp à l'aide de la commande
brew tap hashicorp/tap, puis installez Terraform à l'aide de la commandebrew install hashicorp/tap/terraform. -
Windows : Veuillez télécharger le fichier binaire depuis hashicorp.com et l'ajouter à votre PATH, ou utiliser Chocolatey :
choco install terraform.
Une fois l'installation terminée, veuillez vérifier qu'elle s'est déroulée correctement en exécutant le fichier terraform version.
Une fois Docker et Terraform vérifiés, l'étape suivante consiste à organiser les fichiers du projet pour faciliter leur maintenance.
Configuration de la structure du projet
Les projets Terraform bénéficient d'une approche claire et structurée. En général, je crée un répertoire dédié à mon projet Terraform et j'initialise le contrôle de version :
mkdir terraform-docker-project
cd terraform-docker-project
git init
Le contrôle de version est essentiel pour l'infrastructure en tant que code. Toute modification apportée à l'infrastructure Docker doit être suivie, examinée et réversible. J'ajoute généralement le répertoire de travail et les fichiers d'état de Terraform aufichierou .gitignore afin de les exclure du contrôle de version :
.terraform/
*.tfstate
*.tfstate.backup
.terraform.lock.hcl
Enfin, je crée un fichier vierge main.tf dans lequel je définirai mon infrastructure. Ce fichier contiendra la configuration du fournisseur et les définitions des ressources.
Fournisseur Docker Terraform et ressources principales
Une fois la structure du projet mise en place, il est temps de configurer le fournisseur Docker et de commencer à définir les ressources.
Initialisation du fournisseur Docker
Tout d'abord, en ajoutant la configuration du fournisseur à main.tf:
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "~> 3.0"
}
}
}
provider "docker" {
host = "unix:///var/run/docker.sock"
}
Le bloc ` required_providers ` indique à Terraform où télécharger le plugin du fournisseur. L'utilisation de contraintes de version (~> 3.0) permet des mises à jour mineures tout en évitant les modifications importantes. Pour les hôtes Docker distants, vous pouvez modifier le paramètre host en quelque chose comme tcp://192.168.1.100:2376.
Veuillez maintenant exécuter terraform init dans le répertoire racine du projet. Cela télécharge le plugin du fournisseur Docker et le stocke dans .terraform/providers/. La commande affiche la version exacte installée, et Terraform crée un fichier de verrouillage afin de garantir la cohérence des versions des fournisseurs au sein de mon équipe.

Gestion des images de conteneurs
Une fois le fournisseur initialisé, l'étape suivante consiste à définir les images du conteneur. Avant de créer des conteneurs, il est nécessaire de gérer les images qu'ils utiliseront. Par conséquent, il est important de définir une ressource image :
resource "docker_image" "nginx" {
name = "nginx:1.29"
keep_locally = true
}
Veuillez ajouter cette ressource immédiatement après le bloc du fournisseur. Le paramètre « keep_locally » est important, car il empêche Terraform de supprimer l'image lorsque j'exécute « terraform destroy ». Ceci est utile lorsque plusieurs conteneurs partagent la même image ou lorsque je souhaite conserver les images mises en cache entre les déploiements.
Pour les déploiements en production, veuillez épingler les images à l'aide de leur résumé SHA256 afin de garantir leur immuabilité.
resource "docker_image" "nginx" {
name = "nginx@sha256:b60f25eb5acdd79172de1a289891d9cfe4fc3669daddeeb68619240cbe839d9f"
}
Le résumé peut être obtenu auprès du registre des conteneurs. Pour les images Docker Hub telles que nginx, vous pouvez les trouver sur le site officiel de Docker dans la section Tags. L'utilisation de digests garantit que le même fichier binaire d'image est déployé à chaque fois, même si quelqu'un publie unenouvelle image avec la même balise.
Approvisionnement des conteneurs Docker
Une fois les images définies, l'étape suivante consiste à créer des conteneurs qui y font référence :
resource "docker_container" "web" {
name = "nginx-web"
image = docker_image.nginx.image_id
ports {
internal = 80
external = 8080
}
env = [
"NGINX_HOST=example.com",
"NGINX_PORT=80"
]
}
L'image est référencée à l'aide de l'adresse docker_image.nginx.image_id. Cela crée une dépendance implicite, car Terraform ne tentera pas de créer le conteneur tant que l'image n'existe pas. Le bloc « ports » mappe le port interne 80 du conteneur au port 8080 de mon hôte, ce qui équivaut à docker run -p 8080:80.
Les variables d'environnement sont ajoutées à la liste env sous forme de chaînes de caractères. Terraform recréera le conteneur si l'un des paramètres change, garantissant ainsi que l'infrastructure en cours d'exécution correspond toujours à la configuration.
À ce stade, veuillez exécuter la commande « terraform plan » pour visualiser ce que Terraform va créer, puis « terraform apply » pour provisionner l'infrastructure. Terraform procédera à la création de l'image et du conteneur. Vous pouvez vérifier cela en consultant la ressource dans Docker Desktop ou en exécutant la commande « docker ps » dans le terminal.
Réseau, stockage et limites des ressources dans Terraform
Maintenant que vous disposez d'un conteneur de base opérationnel et que vous comprenez le flux de travail principal, nous allons étendre l'infrastructure avec des fonctionnalités prêtes pour la production. Les sections suivantes s'appuient sur ces bases en ajoutant la mise en réseau, le stockage persistant et les contraintes de ressources, tous essentiels pour les déploiements dans le monde réel.
Gestion du réseautage
Afin de permettre la communication entre les conteneurs tout en maintenant leur isolation, il est essentiel de créer des réseaux dédiés. Voici comment créer des réseaux isolés pour contrôler la connectivité des conteneurs. Veuillez ajouter la ressource suivante au fichier main.tf:
resource "docker_network" "app_network" {
name = "application_net"
driver = "bridge"
}
Veuillez maintenant ajouter un deuxième conteneur qui utilise ce réseau. Veuillez ajouter ceci après le conteneur web:
resource "docker_container" "api" {
name = "api-server"
image = docker_image.nginx.image_id
networks_advanced {
name = docker_network.app_network.name
}
}
Cela permet de créer un réseau de ponts dédié et d'y associer le conteneur api. Les conteneurs d'un même réseau peuvent communiquer en utilisant leurs noms de conteneur comme noms d'hôte, ce qui est idéal pour les architectures de microservices.
Veuillez vérifier l'isolation du réseau en exécutant docker network inspect application_net et en vous assurant que seuls les conteneurs prévus sont connectés. Veuillez vous assurer d'exécuter cette commande après avoir créé les ressources à l'aide de terraform plan et terraform apply.

Une fois le réseau configuré pour la communication entre conteneurs, l'aspect critique suivant est la persistance des données.
Configuration des volumes persistants
Pour les données qui doivent être conservées après le redémarrage du conteneur, veuillez ajouter des ressources de volume. Veuillez insérer ceci avant les définitions du conteneur :
resource "docker_volume" "db_data" {
name = "postgres_data"
}
Veuillez maintenant ajouter un conteneur de base de données qui utilise ce volume :
resource "docker_container" "database" {
name = "postgres"
image = "postgres:15"
env = [
"POSTGRES_PASSWORD=mysecretpassword"
]
volumes {
volume_name = docker_volume.db_data.name
container_path = "/var/lib/postgresql/data"
}
}
Les volumes gérés de cette manière sont créés et contrôlés par Docker, puis stockés dans le répertoire de données de Docker. Pour partager des fichiers de configuration à partir de l'hôte, , veuillez utiliser des montages liés en spécifiant host_path au lieu de volume_name.
volumes {
host_path = "/opt/app/config"
container_path = "/etc/app/config"
read_only = true
}
Après s'être assuré que les données survivent au redémarrage des conteneurs, il est tout aussi important d'empêcher qu'un seul conteneur monopolise les ressources du système.
Définition des contraintes en matière de ressources
Au-delà du stockage, il est essentiel pour la stabilité du système de contrôler la quantité de CPU et de mémoire que chaque conteneur peut utiliser. Afin d'éviter que les conteneurs ne consomment des ressources excessives, veuillez appliquer des limites de ressources.
Bien que Docker permette de mettre à jour certaines limites de ressources sur place, le modèle déclaratif de Terraform nécessite souvent de remplacer le conteneur afin de garantir que l'état correspond à votre configuration. Afin d'éviter toute interruption pendant ce remplacement, nous appliquons la règle du cycle de vie « create_before_destroy ».
Important : Il est nécessaire de supprimer l'argument d'name fixe afin d'éviter les conflits de nommage pendant le processus de remplacement. Une option consiste à utiliser l'argument name_prefix à la place.
resource "docker_container" "api" {
name_prefix = "api-server-"
image = docker_image.nginx.image_id
memory = 512
cpu_shares = 1024
networks_advanced {
name = docker_network.app_network.name
}
lifecycle {
create_before_destroy = true
}
}
Le paramètre memory limite la mémoire RAM en mégaoctets. Le paramètre cpu_shares fonctionne différemment. Il s'agit d'un poids relatif utilisé en cas de contention du processeur. Un conteneur avec 1024 parts bénéficiera de deux fois plus de temps CPU qu'un conteneur avec 512 parts, mais uniquement lorsque l'hôte est sous charge.
Pour les limites CPU strictes, il est également possible d'utiliser cpu_set afin d'associer des conteneurs à des cœurs CPU spécifiques :
cpu_set = "0,1"
}
Veuillez vérifier ces contraintes en exécutant docker inspect background-worker --format='{{.HostConfig.Memory}} {{.HostConfig.CpuShares}} et en vous assurant que les valeurs Memory et NanoCpus correspondent à la configuration.
Comme indiqué précédemment, vous devez d'abord exécuter terraform plan et terraform apply pour créer les ressources.
À ce stade, le fichier main.tf contient la configuration du fournisseur, une image, un réseau, un volume et trois conteneurs avec différentes configurations.
Variables, modules et secrets dans Terraform
À mesure que l'infrastructure se développe, les valeurs codées en dur deviennent rigides. Cette section explique comment rendre la configuration réutilisable à l'aide de variables, de modules et d'une gestion appropriée des secrets.
Utilisation des variables d'entrée
La première étape pour rendre les configurations flexibles consiste à extraire les valeurs codées en dur dans des variables qui peuvent être facilement modifiées sans modifier le code principal. Pour ce faire, veuillez créer un nouveau fichier nommé variables.tf dans le même répertoire :
variable "web_port" {
description = "External port for web container"
type = number
default = 8080
validation {
condition = var.web_port > 1024 && var.web_port < 65535
error_message = "Port must be between 1024 and 65535."
}
}
Veuillez maintenant mettre à jour le conteneur Web dans main.tf afin d'utiliser cette variable :
resource "docker_container" "web" {
name = "nginx-web"
image = docker_image.nginx.image_id
ports {
internal = 80
external = var.web_port
}
env = [
"NGINX_HOST=example.com",
"NGINX_PORT=80"
]
}
Le bloc de validation empêche l'utilisation de ports privilégiés. Pour remplacer la valeur par défaut, veuillez créer un fichier terraform.tfvars:
web_port = 9000
Lorsque vous exécutez terraform apply, Terraform lit automatiquement les valeurs de ce fichier. Il est également possible de transmettre des valeurs via la ligne de commande : terraform apply -var="web_port=9000".
Création de modules réutilisables
Les variables permettent de résoudre le problème des valeurs codées en dur, mais que faire si vous devez déployer plusieurs fois le même modèle complet, avec toutes ses ressources ?
C'est là que les modules démontrent leur excellence. Considérez un module comme un plan qui regroupe tous ces éléments distincts en un seul ensemble, vous permettant ainsi de « supprimer » toute cette configuration complexe en une seule unité.
Commencez par créer une structure de répertoires pour le module :
mkdir -p modules/web-app
Veuillez maintenant créer le fichier modules/web-app/variables.tf et y ajouter les éléments suivants :
variable "environment" {
description = "Environment name"
type = string
}
variable "port" {
description = "External port"
type = number
}
Ensuite, veuillez créer un fichier principal modules/web-app/main.tf avec cette ressource :
resource "docker_container" "app" {
name = "app-${var.environment}"
image = var.image_id
ports {
internal = 80
external = var.port
}
}
Enfin, veuillez créer un fichier de sortie modules/web-app/outputs.tf, qui est principalement utilisé pour afficher dans le terminal la valeur souhaitée après avoir exécuté terraform apply:
output "container_ip" {
value = docker_container.app.network_data[0].ip_address
description = "IP address of the application container"
}
Après avoir ajouté les définitions des modules, veuillez exécuter la commande « terraform init » pour installer les modules, puis « terraform apply » pour créer les deux conteneurs à partir du même modèle. Vous devriez pouvoir visualiser toutes les ressources dans Docker Desktop.
Avec les modèles d'infrastructure réutilisables établis grâce aux modules, il existe un autre aspect essentiel de la gestion de la configuration : le traitement sécurisé des informations sensibles telles que les mots de passe et les clés API.
Traitement des données sensibles
Les valeurs sensibles, telles que les mots de passe de base de données, ne doivent pas être codées en dur. Vous pouvez également utiliser le fichier variables.tf et définir sensitive = true:
variable "db_password" {
description = "Database root password"
type = string
sensitive = true
}
Veuillez maintenant mettre à jour le conteneur de base de données dans main.tf afin de référencer le mot de passe de la base de données :
resource "docker_container" "database" {
name = "postgres"
image = "postgres:15"
env = [
"POSTGRES_PASSWORD=${var.db_password}"
]
volumes {
volume_name = docker_volume.db_data.name
container_path = "/var/lib/postgresql/data"
}
}
Au lieu d'inscrire le mot de passe dans terraform.tfvars et de le coder en dur, veuillez le définir comme variable d'environnement :
export TF_VAR_db_password="your-secure-password"
terraform apply
Le drapeau ` sensitive = true ` empêche Terraform d'afficher la valeur dans la sortie de la console.
Cependant, ces valeurs sont stockées en texte clair dans terraform.tfstate. Afin de garantir la sécurité de ce fichier, nous pouvons le sécuriser à l'aide de backends distants avec cryptage. Veuillez explorer comment procéder.
Gestion de l'état Terraform et intégration CI/CD
Cette section traite des mécanismes d'état et des workflows d'automatisation essentiels aux déploiements en production. Cependant, avant de mettre en œuvre l'automatisation, il est essentiel de comprendre comment Terraform suit votre infrastructure via son fichier d'état.
Comprendre la mécanique des états
L'état est à la base de la capacité de Terraform à gérer l'infrastructure. Le fichier terraform.tfstate associe la configuration aux identifiants réels des conteneurs Docker et aux attributs des ressources. Lors de l'exécution de l'terraform apply, Terraform compare cet état à la configuration et calcule les modifications minimales nécessaires.
Veuillez vérifier l'état actuel à l'aide de la commande ` terraform show`, qui affiche toutes les ressources gérées. Pour les équipes, les fichiers d'état locaux peuvent entraîner des problèmes, des conflits et des pertes de données potentielles. La solution réside dans les backends distants.
Pour les workflows axés sur Docker sans infrastructure cloud, l'offre gratuite d' s de Terraform Cloud est idéale. Veuillez ajouter un bloc backend à la section terraform dans main.tf:
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "~> 3.0"
}
}
backend "remote" {
organization = "your-org-name"
workspaces {
name = "docker-infrastructure"
}
}
}
Veuillez créer uncompte gratuitsur le site Web de Terraform. , exécutez terraform login pour vous authentifier avec le jeton fourni, puis terraform init pour migrer l'état. Cela permet le verrouillage d'état dans un espace de travail distant et la collaboration en équipe sans infrastructure cloud.
Il est également possible de créer unbackend distantchez des fournisseurs de services cloud tels qu'AWS ou GCP.

Automatisation des flux de travail
Une fois la gestion de l'état configurée et stockée à distance, l'infrastructure est prête pour la collaboration en équipe. La dernière étape consiste à automatiser le processus de déploiement via des pipelines CI/CD, garantissant ainsi des modifications cohérentes et vérifiables.
Tout d'abord, veuillez créer .github/workflows/terraform.yml:
name: Terraform Docker Deploy
on:
pull_request:
branches: [main]
push:
branches: [main]
jobs:
terraform:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Setup Terraform
uses: hashicorp/setup-terraform@v3
- name: Terraform Init
run: terraform init
- name: Terraform Plan
if: github.event_name == 'pull_request'
run: terraform plan
- name: Terraform Apply
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
run: terraform apply -auto-approve
Ce workflow exécute terraform plan à chaque pull request, indiquant aux réviseurs les modifications qui seront apportées à l'infrastructure. Lorsque les modifications sont fusionnées dans le référentiel principal, l'outil terraform apply s'exécute automatiquement, garantissant ainsi que chaque modification de l'infrastructure passe par le même processus de révision que les modifications du code.
Dépannage des problèmes Terraform Docker
Même avec une configuration minutieuse, des problèmes peuvent survenir. Comprendre les problèmes courants et savoir quand envisager des alternatives permet de prendre de meilleures décisions architecturales.
« Accès refusé »
L'erreur la plus courante sous Linux est « permission refusée » lors de la connexion au socket Docker. Ceci se produit lorsque l'utilisateur ne dispose pas des autorisations nécessaires pour accéder à /var/run/docker.sock. Veuillez résoudre ce problème en ajoutant l'utilisateur au groupe docker:
sudo usermod -aG docker $USER
Veuillez ensuite vous déconnecter et vous reconnecter.
Problèmes de connectivité WSL2
Sous Windows avec WSL2, des problèmes de connectivité peuvent survenir en raison d'une différence dans le chemin d'accès au socket. Veuillez vous assurer que le paramètre « Exposer le démon sur tcp://localhost:2375 sans TLS » de Docker Desktop est activé, puis mettez à jour le fournisseur dans main.tf:
provider "docker" {
host = "tcp://localhost:2375"
}
Échecs d'authentification du registre privé
Pour les registres Docker privés, veuillez ajouter l'authentification au bloc fournisseur, définir les informations d'identification en tant que variables et les configurer via des variables d'environnement afin d'éviter les problèmes liés au codage en dur.
hclprovider "docker" {
host = "unix:///var/run/docker.sock"
registry_auth {
address = "registry.mycompany.com"
username = var.registry_username
password = var.registry_password
}
}
Solutions alternatives à Terraform
Au-delà du dépannage, il est tout aussi important de comprendre dans quels cas d'autres outils peuvent être plus adaptés que Terraform à votre cas d'utilisation spécifique.
Terraform par rapport à Kubernetes
Kubernetes propose des fonctionnalités d'orchestration beaucoup plus sophistiquées :
- Auto-guérison
- Planification avancée
- Découverte des services
- Équilibrage de charge intégré
Pour les déploiements complexes à plusieurs nœuds avec des exigences de haute disponibilité, Kubernetes constitue le choix le plus approprié. Terraform peut provisionner l'infrastructure Kubernetes, tandis que Helm oules manifestes Kubernetes gèrent le déploiement des applications.
Terraform par rapport à Ansible
Ansible est particulièrement performant dans la gestion de la configuration à l'intérieur des conteneurs. Terraform assure la mise en place de l'infrastructure, tandis qu'Ansible gère la configuration logicielle et l'installation des paquets. Ces deux outils fonctionnent souvent ensemble : Terraform génère des conteneurs Docker, puis Ansible configure les applications qui s'exécutent à l'intérieur de ceux-ci.
Terraform par rapport à Docker Compose
Pourles environnements de développement locaux simples, Docker Compose demeure le choix le plus pragmatique. Terraform est particulièrement efficace pour les déploiements reproductibles dans différents environnementset lorsqu'une intégration avec d'autres composants d'infrastructure est nécessaire.
Afin de vous aider à faire votre choix, j'ai résumé lesdifférences les plus importantesdans ce tableau :
|
Outil |
Atouts fondamentaux |
Meilleur cas d'utilisation |
Comparaison avec Terraform |
|
Kubernetes |
Orchestration sophistiquée (auto-réparation, planification avancée, équilibrage de charge). |
Déploiements complexes à plusieurs nœuds nécessitant une haute disponibilité. |
Complémentaire : Terraform fournit l'infrastructure (le cluster), tandis que Kubernetes gère le déploiement de l'application. |
|
Ansible |
Gestion de la configuration, installation de paquets et configuration de logiciels. |
Gestion des logiciels et de la configuration à l'intérieur des conteneurs. |
Complémentaire : Terraform génère les conteneurs Docker, et Ansible configure les applications qui s'exécutent à l'intérieur de ceux-ci. |
|
Docker Compose |
Une gestion de projet simple et pragmatique. |
Environnements de développement locaux simples. |
Alternative : Compose est plus facile pour le développement local, mais Terraform est plus adapté aux déploiements reproductibles dans différents environnements. |
Si vous recherchez un outil pour remplacer Docker, veuillez consulternotre guide sur les meilleures alternatives à Docker.
Conclusion
L'intégration de Docker dans la gestion du cycle de vie de Terraform transforme les déploiements de conteneurs, qui étaient auparavant des procédures manuelles, en une infrastructure reproductible et contrôlée par version. Dans ce tutoriel, j'ai présenté comment construire une infrastructure complète étape par étape, en commençant par un fournisseur et un seul conteneur, puis en ajoutant progressivement le réseau, le stockage, les variables, les modules et l'automatisation.
La principale différence réside dans le fait que Terraform gère l'approvisionnement, la création, la mise à jour et la suppression des ressources sur la base d'une configuration déclarative. Une orchestration complète avec mise à l'échelle automatique et autoréparation nécessite des outils tels que Kubernetes ou Docker Swarm. Terraform peut provisionner ces orchestrateurs, mais ne les remplace pas.
Pour les étapes suivantes, veuillez consulter la documentation officielle du registre Terraform relative au fournisseur Docker afin de découvrir les options avancées en matière de ressources, telles que les services Docker pour Swarm, la gestion des secrets et les configurations de plugins.
Si vous souhaitez acquérir une expérience pratique des conteneurs, je vous recommande de vous inscrire à notre cursus interactif « Conteneurisation et virtualisation avec Docker et Kubernetes ».
FAQ Terraform Docker
Comment puis-je empêcher Terraform de supprimer les images Docker lors de l'exécution de terraform destroy ?
Veuillez utiliser le paramètre keep_locally = true dans votre ressource docker_image. Cela indique à Terraform de conserver l'image en cache localement même après la destruction de l'infrastructure, ce qui est utile lorsque plusieurs conteneurs partagent la même image ou lorsque vous souhaitez conserver les images mises en cache entre les déploiements.
Pourquoi Terraform Cloud affiche-t-il des erreurs « Impossible de se connecter au démon Docker » ?
Par défaut, Terraform Cloud fonctionne en mode d'exécution à distance, ce qui signifie que les commandes s'exécutent sur les serveurs de Terraform Cloud où Docker n'est pas accessible. Veuillez configurer votre espace de travail pour utiliser le mode d'exécution local : accédez à Paramètres > Général > Mode d' d'exécution > locale. Cela permet de stocker l'état à distance tout en exécutant les commandes Terraform sur votre machine locale, où Docker est accessible.
Comment puis-je gérer les valeurs sensibles telles que les mots de passe de base de données dans Terraform ?
Veuillez marquer les variables comme sensibles en utilisant « sensitive = true » dans votre définition de variable. Pour Terraform Cloud, veuillez définir les variables sensibles dans l'interface utilisateur de l'espace de travail et les marquer comme « Sensibles ». Pour une exécution locale, veuillez utiliser des variables d'environnement avec le préfixe TF_VAR_ (par exemple, export TF_VAR_db_password="password"). Veuillez noter que les valeurs sont toujours stockées en texte clair dans terraform.tfstate. Par conséquent, veuillez toujours sécuriser votre fichier d'état.
Quelle est la différence entre Terraform et Docker Compose pour la gestion des conteneurs ?
Docker Compose gère les conteneurs via une approche YAML basée sur les projets, sans maintenir de fichiers d'état. Terraform enregistre toutes les ressources dans terraform.tfstate, ce qui permet de détecter les écarts entre la configuration et la réalité. Terraform excelle dans les déploiements reproductibles dans différents environnements et dans l'intégration avec d'autres infrastructures, tandis que Docker Compose est plus simple pour le développement local. Terraform offre une gestion explicite de l'état et un contrôle du cycle de vie (plan/apply/destroy).
Comment puis-je mettre à jour les limites de ressources des conteneurs Docker sans rencontrer d'erreurs ?
Bien que l'interface CLI Docker prenne en charge les mises à jour sur place, le fournisseur Terraform Docker impose souvent le remplacement des ressources afin de garantir la cohérence de l'état. Afin d'éviter toute interruption pendant ce remplacement, veuillez ajouter un bloc d'lifecycle { create_before_destroy = true }. Il est essentiel que vous supprimiez également l'argument fixe name (ou que vous utilisiez name_prefix) de votre définition de ressource. Si vous conservez un nom fixe tel que name = "web-server", le nouveau conteneur ne pourra pas démarrer et affichera une erreur « nom déjà utilisé » avant que l'ancien ne soit détruit.
En tant que fondateur de Martin Data Solutions et Data Scientist freelance, ingénieur ML et AI, j'apporte un portefeuille diversifié en régression, classification, NLP, LLM, RAG, réseaux neuronaux, méthodes d'ensemble et vision par ordinateur.
- A développé avec succès plusieurs projets de ML de bout en bout, y compris le nettoyage des données, l'analyse, la modélisation et le déploiement sur AWS et GCP, en fournissant des solutions impactantes et évolutives.
- Création d'applications web interactives et évolutives à l'aide de Streamlit et Gradio pour divers cas d'utilisation dans l'industrie.
- Enseigne et encadre des étudiants en science des données et en analyse, en favorisant leur développement professionnel par le biais d'approches d'apprentissage personnalisées.
- Conception du contenu des cours pour les applications de génération augmentée par récupération (RAG) adaptées aux exigences de l'entreprise.
- Rédaction de blogs techniques à fort impact sur l'IA et le ML, couvrant des sujets tels que les MLOps, les bases de données vectorielles et les LLM, avec un engagement significatif.
Dans chaque projet que je prends en charge, je m'assure d'appliquer des pratiques actualisées en matière d'ingénierie logicielle et de DevOps, comme le CI/CD, le linting de code, le formatage, la surveillance des modèles, le suivi des expériences et la gestion robuste des erreurs. Je m'engage à fournir des solutions complètes, en transformant les connaissances sur les données en stratégies pratiques qui aident les entreprises à se développer et à tirer le meilleur parti de la science des données, de l'apprentissage automatique et de l'IA.
