90DaysOfDevOps (Day 82)

고태규·2026년 1월 31일

DevOps

목록 보기
77/87
post-thumbnail

해당 스터디는 90DaysOfDevOps
https://github.com/MichaelCade/90DaysOfDevOps
를 기반으로 진행한 내용입니다.

Day 82 - Dev Containers in VS Code


1. Dev Containers의 본질과 도입 필요성


1-1. 단순한 Docker가 아닌 환경 사양 (Spec)

많은 개발자가 Dev Containers를 단순히 Docker 이미지를 띄우는 것으로 오해하곤 한다.

하지만 Dev Containers는 커뮤니티가 채택한 오픈 소스 사양(Specification)이다.

  • 정의: 단순한 OS 뿐만 아니라 개발에 필요한 도구, 런타임, Extensions, 설정, 파일 시스템 마운트 등을 코드인 devcontainer.json로 정의한 집합체다.

  • 아키텍처:

    • 로컬 VS Code가 컨테이너 내부의 VS Code Server와 연결되는 구조다.

    • 소스 코드는 마운트되어 격리된 환경에서 실행되지만, 개발자는 로컬 테마와 단축키를 그대로 사용하는 Inner Loop(내부 개발 루프)를 경험할 수 있다.


1-2. 왜 도입해야 하는가?

개발 현장에서 겪는 세 가지 주요 고통을 해결한다.

  • 고통스러운 온보딩:

    • 신규 프로젝트 투입 시 하드웨어 세팅, 라이선스 설정, 특정 경로 파일 복사 등 수작업으로 인해 며칠씩 소요되는 시간을 단축한다.
  • 버전 호환성 문제:

    • "팀원 A는 Node 14를 쓰고 나는 Node 12를 써서 코드가 깨지는" 상황을 방지한다.

    • 컨설팅 업무 시 고객사마다 다른 언어 버전(.NET, Java 등)을 요구해도, 로컬 머신의 오염 없이 프로젝트별로 격리된 환경을 사용할 수 있다.

  • 문서화와 실행의 괴리:

    • README에 "시작 전 1, 2, 3단계를 수행하시오"라고 적어도 누락하기 쉽다.

    • Dev Containers는 post-create-command 등을 통해 초기화 작업을 자동화한다.


2. 환경 구축 실습


Dev Containers의 가장 큰 장점은 로컬(Docker Desktop)과 클라우드(GitHub Codespaces)를 동일한 설정으로 오갈 수 있다는 유연성이다.

2-1. 로컬 VS Code에서의 구축

프레젠테이션에서는 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")하면 로컬에는 없는 도구들이 설치된 완벽한 개발 환경이 뚝딱 만들어진다.

2-2. GitHub Codespaces를 활용한 클라우드 개발

고사양 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


3. 디버깅 및 네트워크 통합


Dev Containers는 환경만 격리할 뿐, 개발자가 누려야 할 생산성 도구(디버거, 네트워크 등)는 로컬 환경처럼 투명하게 연결해 준다.

3-1. 로컬과 동일한 원격 디버깅

프레젠테이션에서는 Rust와 Go 언어 샘플을 통해 디버깅 과정을 시연했다.

  • 코드는 컨테이너(또는 클라우드) 내부에서 돌지만, 개발자는 로컬 VS Code에서 중단점(Breakpoint)을 설정한다.

  • F5를 눌러 실행하면 정확히 중단점에서 멈추고, 변수 값 조사(Inspect)나 스택 추적을 로컬 개발과 똑같이 수행할 수 있다.

3-2. 포트 포워딩

웹 애플리케이션 개발 시 네트워크 연결도 자동으로 처리된다.

  • 시나리오: 클라우드 Codespace 내부에서 웹 서버를 9000번 포트로 실행했다.

  • 자동 연결: VS Code는 이를 감지하고 내 로컬 머신의 localhost:9000으로 자동 포트 포워딩을 수행한다.

  • 결과: 개발자는 자신의 로컬 브라우저(Chrome, Edge 등)를 열어 localhost:9000에 접속하면, 클라우드에 있는 서버와 연결된다. 심지어 이 요청에 대해서도 실시간 디버깅이 작동한다.


4. 정리


Dev Containers는 단순한 도구가 아니라 개발 환경의 표준화를 위한 솔루션이다.

프로젝트에 .devcontainer 폴더를 추가하는 것만으로, 팀 전체가 버전 의존성에서 벗어나고 온보딩 시간을 획기적으로 단축할 수 있다.


0개의 댓글