Aller au contenu
Développement medium

Dev Containers : environnements de développement reproductibles

12 min de lecture

Dev Containers crée un environnement de développement identique pour tous les membres de votre équipe, quel que soit leur système d’exploitation. Fini le “ça marche sur ma machine” : les dépendances, versions et configurations sont définies dans un fichier versionné. Ce guide couvre la configuration de base, Docker Compose, les features, et l’intégration CI/CD.

Sans environnement standardisé, chaque développeur a sa propre configuration :

ProblèmeConséquence
Versions différentes (Node, Python…)Bugs impossibles à reproduire
Dépendances système manquantes”Ça marche chez moi”
Configuration manuelleOnboarding de plusieurs heures
Pollution du système localConflits entre projets

Dev Containers résout ces problèmes avec Docker :

  • Environnement défini en code : fichier devcontainer.json versionné
  • Isolation complète : chaque projet a son container
  • Portabilité : fonctionne sur Linux, macOS, Windows
  • Onboarding instantané : clone le repo, ouvre VS Code, c’est prêt

Quand vous ouvrez un projet avec Dev Containers :

  1. VS Code lit .devcontainer/devcontainer.json
  2. Docker crée le container avec l’image spécifiée
  3. VS Code Server s’installe dans le container
  4. Extensions et dépendances s’installent automatiquement
  5. Votre code est monté dans le container (volume)

Vous travaillez dans VS Code normalement, mais tout s’exécute dans le container : terminal, debug, LSP, extensions.

  1. Visual Studio Code

    Téléchargez depuis code.visualstudio.com.

  2. Docker

    Le moteur de containers qui exécute l’environnement. Installez Docker Desktop ou Docker Engine.

    Fenêtre de terminal
    docker --version
    # Docker version 24.0.7 ou supérieur
  3. Extension Dev Containers

    Installez l’extension Dev Containers (anciennement “Remote - Containers”) :

    Fenêtre de terminal
    code --install-extension ms-vscode-remote.remote-containers

    Ou recherchez “Dev Containers” dans le Marketplace (ID : ms-vscode-remote.remote-containers).

À la racine de votre projet, créez le dossier .devcontainer/ :

mon-projet/
├── .devcontainer/
│ └── devcontainer.json
├── src/
├── package.json
└── ...
{
"name": "Astro Dev Container",
"image": "node:20-alpine3.19",
"postCreateCommand": "npm ci",
"customizations": {
"vscode": {
"extensions": [
"astro-build.astro-vscode",
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode"
]
}
},
"forwardPorts": [4321]
}

Explication des champs :

ChampDescription
nameNom affiché dans VS Code
imageImage Docker à utiliser
postCreateCommandCommande exécutée après création (installation)
customizations.vscode.extensionsExtensions à installer automatiquement
forwardPortsPorts exposés sur localhost
  1. Ouvrez le projet dans VS Code
  2. Appuyez sur F1Dev Containers: Reopen in Container
  3. VS Code télécharge l’image, crée le container, installe les extensions
  4. Votre terminal s’exécute maintenant dans le container

Vérification :

Fenêtre de terminal
# Dans le terminal VS Code (container)
node --version
# v20.x.x
cat /etc/os-release | grep PRETTY_NAME
# PRETTY_NAME="Alpine Linux v3.19"

La spec définit plusieurs hooks exécutés à différents moments :

HookMomentUsage typique
postCreateCommandAprès création du containernpm ci, installation dépendances
postStartCommandÀ chaque démarrageLancer un serveur de dev
postAttachCommandÀ chaque connexion VS CodeMessages de bienvenue
initializeCommandAvant création (sur l’hôte)Clone de submodules

Exemple avec séparation des responsabilités :

{
"postCreateCommand": "npm ci",
"postStartCommand": "npm run dev -- --host"
}
{
"containerEnv": {
"NODE_ENV": "development",
"DATABASE_URL": "postgres://user:pass@db:5432/mydb"
}
}

Par défaut, le container peut s’exécuter en root. Pour un comportement plus proche de la production :

{
"remoteUser": "node"
}

L’utilisateur node existe dans les images officielles Node.js. Pour d’autres images, utilisez containerUser ou créez l’utilisateur dans un Dockerfile.

{
"mounts": [
"source=${localEnv:HOME}/.ssh,target=/home/node/.ssh,type=bind,readonly"
]
}

Cela monte vos clés SSH dans le container pour les opérations Git.

Les features sont des modules réutilisables qui installent des outils dans votre container. Plus propre que de tout faire dans un Dockerfile.

{
"image": "mcr.microsoft.com/devcontainers/base:ubuntu",
"features": {
"ghcr.io/devcontainers/features/node:1": {
"version": "20"
},
"ghcr.io/devcontainers/features/docker-in-docker:2": {},
"ghcr.io/devcontainers/features/git:1": {}
}
}

Features populaires :

FeatureDescription
nodeNode.js + npm
pythonPython + pip
docker-in-dockerDocker dans le container
kubectl-helm-minikubeOutils Kubernetes
terraformTerraform CLI
aws-cliAWS CLI

Consultez le catalogue de features pour la liste complète.

Quand votre projet nécessite plusieurs services (base de données, cache, API), utilisez Docker Compose.

services:
web:
image: node:20-alpine3.19
ports:
- "4321:4321"
volumes:
- ./:/workspace:cached
command: sleep infinity
db:
image: postgres:16
restart: unless-stopped
volumes:
- postgres-data:/var/lib/postgresql/data
environment:
POSTGRES_USER: myapp_user
POSTGRES_PASSWORD: myapp_password
POSTGRES_DB: myapp_db
ports:
- "5432:5432"
volumes:
postgres-data:
{
"name": "Mon App + Postgres",
"dockerComposeFile": "../docker-compose.yml",
"service": "web",
"workspaceFolder": "/workspace",
"postCreateCommand": "npm ci",
"forwardPorts": [4321, 5432],
"customizations": {
"vscode": {
"extensions": [
"astro-build.astro-vscode",
"ms-azuretools.vscode-docker"
]
}
}
}

Champs spécifiques à Compose :

ChampDescription
dockerComposeFileChemin vers le docker-compose.yml
serviceService principal (où VS Code se connecte)
workspaceFolderDossier de travail dans le container

Depuis le service web, la base de données est accessible via le nom du service :

Fenêtre de terminal
# Dans le terminal du container
psql -h db -U myapp_user -d myapp_db

Depuis votre machine locale, utilisez localhost:5432 grâce à forwardPorts.

Pour des besoins spécifiques, créez un Dockerfile :

FROM node:20-alpine3.19
# Installer des outils supplémentaires
RUN apk add --no-cache \
git \
openssh-client \
curl
# Créer un utilisateur non-root
RUN adduser -D -u 1000 developer
USER developer
WORKDIR /workspace
{
"name": "Custom Dev Container",
"build": {
"dockerfile": "Dockerfile",
"context": ".."
},
"remoteUser": "developer",
"postCreateCommand": "npm ci",
"forwardPorts": [4321]
}

Vous pouvez combiner l’accès SSH distant avec Dev Containers : VS Code se connecte en SSH à un serveur, puis utilise Docker sur ce serveur.

  1. Connectez-vous en SSH

    F1Remote-SSH: Connect to Host → sélectionnez votre serveur

  2. Ouvrez le projet

    Une fois connecté, ouvrez le dossier contenant .devcontainer/

  3. Ouvrez dans le container

    F1Dev Containers: Reopen in Container

Avantages :

  • Docker tourne sur le serveur (pas besoin de Docker local)
  • Ressources du serveur (RAM, CPU, stockage rapide)
  • Réseau du serveur (accès aux services internes)

Consultez la documentation officielle pour les configurations avancées.

Le devcontainer.json peut servir de source de vérité pour votre pipeline CI.

Dev Container = environnement de développement (VS Code) CI = job container basé sur la même image

.github/workflows/ci.yml
name: CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
container:
image: node:20-alpine3.19 # Même image que devcontainer.json
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
- name: Build
run: npm run build

Pour une cohérence totale, utilisez la CLI devcontainer :

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build dev container
uses: devcontainers/ci@v0.3
with:
runCmd: npm ci && npm test && npm run build

Cette approche utilise exactement la configuration de votre devcontainer.json.

OSRecommandation
LinuxCode sur le filesystem Linux, performances natives
macOSPréférer le code dans le container (volume nommé) pour éviter les I/O lents
WindowsStocker le code en WSL2 (\\wsl$\Ubuntu\...), pas sur /mnt/c/

Évitez de remonter node_modules depuis l’hôte :

{
"mounts": [
"source=myproject-node_modules,target=/workspace/node_modules,type=volume"
]
}

Cela stocke node_modules dans un volume Docker plus rapide.

SymptômeCause probableSolution
”Cannot connect to Docker”Docker non démarréLancez Docker Desktop
Container lent à créerTéléchargement de l’imageNormal la première fois, cache ensuite
Fichiers en root sur l’hôteremoteUser non configuréAjouter "remoteUser": "node"
Extensions non installéesMauvais format JSONVérifier customizations.vscode.extensions
Port non accessibleforwardPorts mal placéDoit être au premier niveau, pas dans customizations
Erreur “image not found”Typo dans le nom d’imageVérifier l’orthographe (alpine pas apline)

Si quelque chose ne fonctionne pas après une modification :

F1Dev Containers: Rebuild Container

Pour repartir de zéro (sans cache Docker) :

F1Dev Containers: Rebuild Container Without Cache

  1. Dev Containers = environnement en codedevcontainer.json définit tout
  2. Spec ouverte — Fonctionne avec VS Code, Codespaces, JetBrains, DevPod
  3. postCreateCommand pour l’installation, postStartCommand pour les process
  4. Features pour ajouter des outils sans Dockerfile
  5. Docker Compose pour les architectures multi-services
  6. forwardPorts au premier niveau — pas dans customizations
  7. Même image en CI — garantit la cohérence dev/production
  8. Remote SSH + DevContainers — Docker sur le serveur distant

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.