해당 스터디는 90DaysOfDevOps
https://github.com/MichaelCade/90DaysOfDevOps
를 기반으로 진행한 내용입니다.
Day 82 - Dev Containers in VS Code
많은 개발자가 Dev Containers를 단순히 Docker 이미지를 띄우는 것으로 오해하곤 한다.
하지만 Dev Containers는 커뮤니티가 채택한 오픈 소스 사양(Specification)이다.
정의: 단순한 OS 뿐만 아니라 개발에 필요한 도구, 런타임, Extensions, 설정, 파일 시스템 마운트 등을 코드인 devcontainer.json로 정의한 집합체다.

아키텍처:
로컬 VS Code가 컨테이너 내부의 VS Code Server와 연결되는 구조다.
소스 코드는 마운트되어 격리된 환경에서 실행되지만, 개발자는 로컬 테마와 단축키를 그대로 사용하는 Inner Loop(내부 개발 루프)를 경험할 수 있다.
개발 현장에서 겪는 세 가지 주요 고통을 해결한다.
고통스러운 온보딩:
버전 호환성 문제:
"팀원 A는 Node 14를 쓰고 나는 Node 12를 써서 코드가 깨지는" 상황을 방지한다.
컨설팅 업무 시 고객사마다 다른 언어 버전(.NET, Java 등)을 요구해도, 로컬 머신의 오염 없이 프로젝트별로 격리된 환경을 사용할 수 있다.
문서화와 실행의 괴리:
README에 "시작 전 1, 2, 3단계를 수행하시오"라고 적어도 누락하기 쉽다.
Dev Containers는 post-create-command 등을 통해 초기화 작업을 자동화한다.
Dev Containers의 가장 큰 장점은 로컬(Docker Desktop)과 클라우드(GitHub Codespaces)를 동일한 설정으로 오갈 수 있다는 유연성이다.
프레젠테이션에서는 VS Code와 Docker Desktop(WSL 2)을 사용한 데모를 통해 다음 과정을 시연했다.
필수 도구: 'Dev Containers' 확장 프로그램과 'GitHub Codespaces' 확장이 필요하다.
설정 생성: 명령 팔레트(F1)에서 Add Dev Container Configuration Files를 실행하여 템플릿을 선택한다. Alpine, Debian 같은 OS 베이스나 Go, Rust 같은 언어 베이스 템플릿을 제공한다.
기능 활용: 복잡한 Dockerfile 스크립트 작성 없이, 'Features' 메뉴에서 Azure CLI, Terraform, Kubectl 등을 체크박스 선택만으로 컨테이너에 주입할 수 있다.
결과물:
.devcontainer 폴더 내에 devcontainer.json(메인 설정), Dockerfile(빌드 정의), dependabot.yml(버전 관리) 등이 생성된다.
이를 실행("Reopen in Container")하면 로컬에는 없는 도구들이 설치된 완벽한 개발 환경이 뚝딱 만들어진다.
고사양 PC가 없거나 Docker 라이선스 문제가 있다면 GitHub Codespaces가 대안이 된다.
브라우저 모드: GitHub 리포지토리에서 버튼 하나로 실행되며, 별도 설치 없이 브라우저 내에서 VS Code 환경을 제공한다. .NET 8, GitHub CLI 등 설정된 도구가 즉시 가용 상태가 된다.
하이브리드 모드 (Open in VS Code): 브라우저가 어색하다면, 로컬 VS Code를 인터페이스로 사용하고 컴퓨팅 자원만 클라우드(Codespace)를 사용할 수 있다. 로컬의 편안함과 클라우드의 성능을 동시에 누리는 방식이다.
관리 기능: Dotfiles(개인 설정) 자동 적용, Secrets(API 키) 관리, 데이터 주권을 위한 리전 선택 등을 지원한다.
containers.dev 문서: https://containers.dev/features
Dev Containers는 환경만 격리할 뿐, 개발자가 누려야 할 생산성 도구(디버거, 네트워크 등)는 로컬 환경처럼 투명하게 연결해 준다.
프레젠테이션에서는 Rust와 Go 언어 샘플을 통해 디버깅 과정을 시연했다.
코드는 컨테이너(또는 클라우드) 내부에서 돌지만, 개발자는 로컬 VS Code에서 중단점(Breakpoint)을 설정한다.
F5를 눌러 실행하면 정확히 중단점에서 멈추고, 변수 값 조사(Inspect)나 스택 추적을 로컬 개발과 똑같이 수행할 수 있다.
웹 애플리케이션 개발 시 네트워크 연결도 자동으로 처리된다.
시나리오: 클라우드 Codespace 내부에서 웹 서버를 9000번 포트로 실행했다.
자동 연결: VS Code는 이를 감지하고 내 로컬 머신의 localhost:9000으로 자동 포트 포워딩을 수행한다.
결과: 개발자는 자신의 로컬 브라우저(Chrome, Edge 등)를 열어 localhost:9000에 접속하면, 클라우드에 있는 서버와 연결된다. 심지어 이 요청에 대해서도 실시간 디버깅이 작동한다.
Dev Containers는 단순한 도구가 아니라 개발 환경의 표준화를 위한 솔루션이다.
프로젝트에 .devcontainer 폴더를 추가하는 것만으로, 팀 전체가 버전 의존성에서 벗어나고 온보딩 시간을 획기적으로 단축할 수 있다.