À la fin de ce tutoriel, vous saurez versionner un
.devcontainer/devcontainer.json, Reopen in Container (VS Code / Cursor), distinguer Dev Container local, Remote SSH et Codespaces, et dérouler un lab (local + EC2t3.microoptionnelle enca-central-1) sans secrets dans Git.Niveau : Intermédiaire · Temps estimé : 55–75 min · Versions cibles : Dev Containers spec 2026 · VS Code / Cursor Remote – Containers · Remote – SSH · Docker Engine 27+ · AWS CLI v2 · Dernière vérification : 2026-09-11 · Region :
ca-central-1Slug :
wow-devcontainers-remote· Série : WOW (41/50) · Mot-clé SEO : dev containers · Publish : HOLD← Précédent : Nix flakes et devshells · → Suivant : Homelab k3s · Aussi : Platform Engineering 2026
Prérequis
- Docker Engine 27+ — Installer Docker Engine
- Bases d’images — Dockerfile · stacks — Compose v2
- VS Code ou Cursor : extensions Dev Containers et Remote – SSH
- Compte AWS lab (profil
lab) si EC2 optionnelle — Démarrer avec AWS · EC2 + SSM - Clé SSH hors dépôt (
~/.ssh/, jamais dans Git)
Coût estimé : 0 € en lab local (image mcr.microsoft.com). Variante EC2 t3.micro Ubuntu ca-central-1 : 0–1 € si Free Tier / quelques heures puis terminate. Pas de NAT, EBS > 8 Go, EIP oubliée.
export AWS_PROFILE=lab
export AWS_DEFAULT_REGION=ca-central-1
aws sts get-caller-identity
Ce que nous allons construire
Dev Containers + Remote SSH (WOW 41/50) — ca-central-1
├── Pourquoi : parity local/CI, onboarding, « works on my machine »
├── .devcontainer/devcontainer.json (image, features, ports, postCreate)
├── Comparatif : local vs Remote SSH vs GitHub Codespaces
├── Pattern équipe : repo + SSH bastion/lab EC2 (profil lab)
├── Lab : (1) repo + base:ubuntu + features docker/awscli/gh
│ (2) Reopen in Container
│ (3) Remote SSH t3.micro Ubuntu + Docker
│ (4) cleanup terminate
└── Quiz + FAQ + maillage WOW
(Schéma — alt : « VS Code/Cursor ouvre un Dev Container versionné ; option Remote SSH vers EC2 lab ca-central-1 ».)
Étape 1 — Pourquoi des Dev Containers en 2026 ?
« Works on my machine » : Python 3.11 vs 3.12, AWS CLI v1 vs v2, Compose manquant, droits Docker divergents. La CI (ubuntu-latest) n’est pas votre laptop. L’onboarding SRE devient deux jours de brew install.
Un Dev Container (spec containers.dev ; VS Code, Cursor, Codespaces, DevPod) décrit l’environnement dans le dépôt : image, features, ports, postCreateCommand, extensions. Cloner + Reopen in Container = même shell et mêmes versions.
C’est l’inner loop du golden path plateforme. Les devshells Nix visent la même reproductibilité ; en 2026 beaucoup d’équipes combinent Nix (binaires) et Dev Container (Docker, AWS CLI, IDE).
| Pression | Réponse |
|---|---|
| Onboarding | devcontainer.json + Reopen |
| Parité local / CI | Même image / features que le job |
| Drift laptop | Ubuntu de base, pas « mon macOS » |
| Outils AWS / gh / docker | Features officielles |
Étape 2 — Anatomie de devcontainer.json
Fichier canonique : .devcontainer/devcontainer.json.
| Clé | Rôle |
|---|---|
image |
Base mcr.microsoft.com/devcontainers/base:ubuntu |
features |
Modules officiels (docker, aws-cli, github-cli) |
forwardPorts |
Ports locaux (ex. 8080) |
postCreateCommand |
Après le premier build (deps, vérifs) |
remoteUser |
Non-root (vscode) |
customizations.vscode.extensions |
Extensions dans le conteneur |
Les features évitent un Dockerfile maison. Docker-in-Docker (DiD) va au laptop ; sur t3.micro, préférez docker-outside-of-docker (DooD) — Installer Docker Engine.
Jamais de secrets (AWS_SECRET_ACCESS_KEY, jetons gh, PEM) dans le JSON, un devcontainer.env commité, ou un postCreateCommand. Montez ~/.aws en lecture si besoin, sinon OIDC / SSM. Clés SSH hors repo.
Étape 3 — Local vs Remote SSH vs Codespaces
Trois modes, un contrat (le JSON) :
| Mode | Workspace | Usage | Piège |
|---|---|---|---|
| Dev Container local | Docker laptop | Quotidien | RAM ; DiD lourd |
| Remote SSH | VM / bastion / EC2 lab | VPC, poste verrouillé | SSH 0.0.0.0/0 ; PEM dans Git |
| Codespaces | VM GitHub | Zéro Docker local | Idle payant ; région ≠ ca-central-1 |
Remote – SSH pose un serveur d’éditeur sur l’hôte distant. Vous pouvez ensuite Reopen in Container là-bas si Docker est installé : pattern laptop mince + lab EC2.
Codespaces lit le même fichier. Utile sans Docker Desktop ; DEH ancre le lab en ca-central-1 (IAM, VPC, FinOps). Ne mélangez pas un Codespaces us-east-1 et des rôles ca-central-1.
Étape 4 — Pattern équipe : repo + bastion / EC2 lab
- Un
.devcontainer/à la racine (ou un JSON par sous-projet). - Image officielle + features pinées (
:2,:1). - README : Reopen + versions (
docker version,aws --version). - Distant : SSH vers bastion / EC2 lab
ca-central-1(profillab), SG/32ou SSM Session Manager — pas de 22 public. - AWS hors Git ; CI en OIDC.
Le bastion est un compute éphémère (Owner, Env=lab), pas un coffre à secrets. Suite homelab : wow-homelab-k3s.
Étape 5 — Lab reproductible
Mini-repo (docker + aws + gh) en conteneur, puis Remote SSH sur t3.micro Ubuntu.
5.1 — Scaffold local
mkdir -p wow-devcontainers-lab/.devcontainer
cd wow-devcontainers-lab && git init
.devcontainer/devcontainer.json :
{
"name": "DEH DevOps lab",
"image": "mcr.microsoft.com/devcontainers/base:ubuntu",
"features": {
"ghcr.io/devcontainers/features/docker-in-docker:2": { "moby": true },
"ghcr.io/devcontainers/features/aws-cli:1": {},
"ghcr.io/devcontainers/features/github-cli:1": {}
},
"forwardPorts": [8080],
"postCreateCommand": "aws --version && gh --version && docker version",
"remoteUser": "vscode"
}
printf '%sn' '.env' '*.pem' 'id_rsa*' '.aws/' > .gitignore
echo "# lab WOW 41 — pas de secrets" > README.md
git add . && git commit -m "chore: devcontainer lab DEH"
5.2 — Reopen in Container
- Ouvrez le dossier dans VS Code ou Cursor.
- Palette → Dev Containers: Reopen in Container.
- Attendez le pull
base:ubuntuet les features. - Terminal :
whoami # vscode
aws --version # aws-cli/2.x
gh --version
docker version # client + engine (DiD)
Si Docker échoue : daemon hôte (installer-docker-engine). Laptop léger : feature docker-outside-of-docker:1 à la place de DiD.
5.3 — Variante Remote SSH (EC2 t3.micro, optionnel)
Pas de SSH 0.0.0.0/0. SG : votre /32 ou SSM only.
export AWS_PROFILE=lab
export AWS_DEFAULT_REGION=ca-central-1
# AMI Ubuntu 24.04 : aws ec2 describe-images --owners 099720109477 --filters Name=name,Values=ubuntu/images/hvm-ssd-gp3/ubuntu-noble-24.04-amd64-server-*
aws ec2 run-instances --image-id ami-XXXXXXXX --instance-type t3.micro
--iam-instance-profile Name=lab-ec2-profile
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=deh-devcontainer-lab},{Key=Owner,Value=lab},{Key=Env,Value=lab}]'
--count 1
Installez Docker sur l’Ubuntu (user-data ou SSM) — installer-docker-engine. Puis :
- Shell :
aws ssm start-session --target i-…(SSM). - IDE : Remote – SSH (IP privée / bastion) ou
ProxyCommand+ documentAWS-StartSSHSession. Clonez le repo sur l’instance, Reopen in Container si Docker est prêt.
t3.micro (1 Go) est juste pour DiD : DooD + une session IDE, puis terminate.
5.4 — Cleanup terminate
IID=$(aws ec2 describe-instances --filters Name=tag:Name,Values=deh-devcontainer-lab
Name=instance-state-name,Values=running,stopped,pending
--query 'Reservations[].Instances[].InstanceId' --output text)
aws ec2 terminate-instances --instance-ids $IID
docker rmi mcr.microsoft.com/devcontainers/base:ubuntu 2>/dev/null || true
Pas d’EBS orphelin ni d’EIP. Local : Reopen Folder Locally.
Étape 6 — Checklist, sécurité, anti-patterns
| Règle DEH | Détail |
|---|---|
| Pas de secrets Git | Ni PEM, ni .env, ni AWS_SECRET_* dans postCreateCommand |
| Clés SSH hors repo | ~/.ssh/, agent, SSM — jamais id_rsa commité |
| SSM d’abord | Instance profile ; 22 public = anti-pattern |
| Region | ca-central-1 + profil lab |
| Destruction | terminate + docker rmi fin de lab |
| Features pinées | docker-in-docker:2, bump par PR |
Anti-patterns : image latest individuelle ; 12 README d’install contradictoires ; Codespaces idle ; bastion root partagé ; ~/.aws monté en écriture ; t3.micro laissé running.
Erreurs fréquentes
| Erreur | Impact | Correction |
|---|---|---|
| Daemon Docker down | Reopen échoue | Démarrer Engine / Desktop |
| DiD sur t3.micro | OOM | DooD, puis terminate |
| Port 22 ouvert au monde | Scan | SG /32 ou SSM only |
| Secrets dans le JSON | Fuite Git | .gitignore + OIDC |
| Region us-east-1 | Drift IAM | AWS_DEFAULT_REGION=ca-central-1 |
| Features non pinées | Build non repro | Maj explicite |
Quiz (5 questions)
1. Un Dev Container vise surtout à :
– A. Remplacer Kubernetes
– B. Versionner l’environnement de dev (parity, onboarding)
– C. Facturer Codespaces
2. postCreateCommand sert à :
– A. Stocker des secrets AWS
– B. Exécuter des commandes après création du conteneur
– C. Ouvrir le port 22
3. Remote SSH vs Dev Container local :
– A. SSH : IDE sur l’hôte distant ; local : Docker du laptop
– B. Identique
– C. SSH interdit Docker
4. Region lab DEH :
– A. us-east-1
– B. ca-central-1
– C. eu-west-3
5. Accès EC2 lab préféré :
– A. SSH 0.0.0.0/0
– B. SSM Session Manager (et/ou SSH restreint / ProxyCommand SSM)
– C. PEM dans le dépôt
Réponses : 1‑B · 2‑B · 3‑A · 4‑B · 5‑B
FAQ
Dev Container = Dockerfile de prod ?
Non. Inner loop (outils, IDE, CLI). La prod reste un Dockerfile durci. Pas de user vscode ni DiD en production.
Faut-il Nix et un Dev Container ?
Complémentaires. Nix devshells : toolchains sans daemon. Dev Container : Docker + AWS CLI + extensions identiques pour l’équipe.
Cursor lit-il devcontainer.json ?
Oui (Dev Containers / Remote – Containers). C’est un contrat d’éditeur, pas un lock-in VS Code. Vérifiez features et customizations.
Pourquoi pas uniquement Codespaces ?
Même JSON, zéro Docker local. DEH lab = ca-central-1. Codespaces idle = facture ; l’EC2 aussi — terminate.
Comment coller la CI au Dev Container ?
Même image / features dans le job (ou devcontainer up). Objectif : aws --version laptop = Actions. Pas de secrets ; OIDC.
SSM remplace-t-il Remote SSH ?
Pour le shell, oui (Session Manager). Pour l’IDE, Remote SSH via SSM (AWS-StartSSHSession) sans 22 public — pattern 2026.
Pour aller plus loin
- Installer Docker Engine · Dockerfile · Compose v2
- Nix flakes et devshells (WOW 40) · Homelab k3s (WOW 42)
- Platform Engineering 2026
- EC2 + SSM · SSM Session Manager
Maillage série WOW
| ← Précédent | Nix flakes et devshells |
| → Suivant | Homelab k3s |
| Aussi | Platform Engineering · Docker Engine · Dockerfile · Compose v2 |
Meta publication (SEO)
- Title SEO : Dev Containers + Remote SSH : environnements d’équipe 2026 (guide FR)
- Meta description : Dev Containers VS Code/Cursor + Remote SSH : parity local/CI, onboarding, lab EC2 ca-central-1. FAQ, quiz et check-list DEH.
- Focus keyword : dev containers
- Secondary : remote ssh, devcontainer.json, vscode remote containers, codespaces, ca-central-1
- Image :
assets/web/devopelastichayway/cover-wow-devcontainers-remote-1200x630.webp(à générer) - Catégorie : WOW / Inner loop · Niveau : Intermédiaire
- URL cible : https://devopelastichayway.com/tutoriels/wow-devcontainers-remote/
- Post live : N/A (nouveau) · slug
wow-devcontainers-remote· Publish : HOLD (draft only — feu vert Maître requis)
Pour aller plus loin — hubs live
Retour parcours Catalogue Tutoriels — hub de la série et leçons sœurs.