WSL 2에서 Dev Containers 사용하기
2020년 7월 1일 | Brigit Murtaugh, @BrigitMurtaugh
Docker 컨테이너와 WSL 2(Windows Subsystem for Linux 2)의 강력한 기능을 활용하면, 깊이 통합된 Linux 커널을 사용하는 샌드박스 환경인 컨테이너 안에서 Windows 환경을 유지하면서 애플리케이션을 개발할 수 있습니다.
5월에는 가상화 분야에 몇 가지 흥미로운 발표가 있었습니다. Windows 10 5월 2020 업데이트에는 WSL 2가 기본 기능으로 포함되었고, Docker Desktop Stable 2.3.0.2는 WSL 2 백엔드 지원과 함께 정식 출시되었습니다.
이전 블로그 게시물(이전 블로그 게시물)에서는 WSL 2에서 Docker를 사용하는 방법을 살펴보았습니다. 첫 번째 요구 사항은 WSL 2 지원이 아직 안정적인 Windows 릴리스에 포함되지 않았으므로 Windows Insiders를 설치하는 것이었고, 다음으로는 Docker WSL 2의 Tech Preview를 설치하는 것이었습니다. 이제 Windows WSL 2와 Docker 지원 모두 안정적인 정식 릴리스에 포함되었습니다!
이 게시물에서는 이러한 도구들이 어떻게 작동하는지, 그리고 Visual Studio Code에서 이를 어떻게 활용하여 WSL 2에서 Dev Containers를 생산적으로 사용할 수 있는지 살펴보겠습니다.
가상화의 새로운 시대
WSL 2와 최신 버전의 Docker Desktop은 모두 가상화 작동 방식을 변화시킵니다.
WSL 2
이전 게시물(이전 게시물)에서 논의했듯이, WSL 2는 경량 가상 머신(VM) 내부에 실제 Linux 커널을 사용하여 Linux용 Windows 하위 시스템에 대한 새로운 접근 방식을 취합니다. 빠른 부팅 시간, 작은 리소스 사용량, 그리고 VM 구성 또는 관리 요구 사항이 전혀 없도록 Windows 환경에 원활하고 깊이 통합된 것처럼 최적화되었습니다.
시스템 호출을 통해 파일 액세스, 메모리 요청, 프로세스 생성과 같은 작업을 수행할 수 있습니다. WSL 2는 완전한 Linux 커널을 포함하므로 전체 시스템 호출 기능을 갖추고 있어 Docker와 같은 좋아하는 앱이 완전하고 안정적으로 작동합니다.
Docker
WSL 1에서는 Windows와 Linux의 근본적인 차이로 인해 Docker Engine이 WSL 내에서 직접 실행될 수 없었고, Docker 팀은 Hyper-V VM과 LinuxKit을 사용하는 대안 솔루션을 개발했습니다. 하지만 WSL 2는 이제 전체 시스템 호출 기능을 갖추고 있으므로 Docker는 WSL 2에서 완전히 실행될 수 있으며, 이는 Docker 팀의 투자를 더욱 촉진했습니다.
2020년 5월 버전의 Docker Desktop은 WSL 2의 동적 메모리 할당을 활용하여 컨테이너를 훨씬 빠르게 빌드하고 리소스를 덜 소비할 수 있습니다. 이전 버전에 거의 1분이 걸리던 것과 달리, 콜드 스타트까지 10초 미만이 걸릴 수 있습니다. 또한, Hyper-V가 더 이상 요구 사항이 아니므로 이 게시물에서 자세히 설명하는 단계는 Windows 10 Home에서도 작동합니다.
Windows의 WSL 2와 Docker Desktop이 이제 정식 출시되었으므로 WSL 2에서 Dev Containers를 사용하는 것에 대해 더욱 확신을 가질 수 있습니다.
시작하기
전제 조건
- Windows 10 버전 2004를 설치합니다.
- 장치에서 실행 중인 Windows 버전을 확인하려면 **Windows 로고** 키 + **R**을 누르고, **실행** 상자에 **winver**를 입력한 다음 **확인**을 선택합니다.
- Visual Studio Code를 설치합니다.
- WSL 2 설치 가이드를 따라 WSL 2를 활성화합니다.
- Microsoft Store(Microsoft Store)에서 Ubuntu(또는 선호하는 Linux 배포판)를 설치합니다.
- Docker Desktop Stable 2.3.0.2를 설치합니다.
설치가 완료되면 Docker는 WSL이 설치된 것을 인식하고 WSL 통합을 활성화하라는 메시지를 표시합니다. 팝업 창에서 **WSL 통합 사용**을 선택합니다.

선택 사항: 최상의 환경을 위해 새로운 Windows Terminal을 설치하면 동일한 인터페이스에서 새 PowerShell 및 Ubuntu 터미널을 열 수 있습니다.
WSL 2에서 VS Code 열기
VS Code를 WSL 2 엔진에 연결해 보겠습니다. Ubuntu 터미널을 열고 원하는 소스 코드 폴더로 이동한 다음 code .을 입력합니다. 그러면 WSL을 전체 개발 환경으로 사용할 수 있는 VS Code 인스턴스가 실행됩니다. 명령 팔레트에서 WSL에 연결할 수도 있습니다. 간단한 HelloNode 애플리케이션을 열어 보겠습니다.

VS Code가 열리면 WSL이 설치된 것을 인식하고 WSL 확장(WSL)을 설치하라는 권장 메시지가 표시됩니다. **설치**를 선택합니다.

확장을 설치한 후 VS Code를 새로 고쳐 WSL 2에 연결할 수 있습니다.

새로 고침 후 창 왼쪽 하단에 있는 WSL 표시기를 확인하여 Ubuntu에 연결되었는지 확인할 수 있습니다.

WSL 확장을 설치하면 VS Code에 원격 탐색기가 추가됩니다. 탐색기 안을 보면 Linux 배포판에 대한 정보를 볼 수 있습니다.

컨테이너 작업
컨테이너를 보거나 연결하는 데 Dev Containers 확장을 활용할 수 있으며, 다음과 같은 다양한 시나리오에서도 사용할 수 있습니다.
이러한 구성을 통해 여러 머신에서 동일한 개발 환경을 쉽게 재현하고, DevContainer에 특정 프로젝트의 도구 및 확장을 설치하고, 배포 환경과 유사한 설정에서 개발할 수 있으며, 로컬 머신은 변경되지 않은 상태로 유지됩니다. 또한 Docker 확장을 사용하여 컨테이너를 보거나 연결할 수도 있습니다.
WSL 2 엔진을 사용할 때 Windows와 WSL 2 파일 시스템 모두에서 소스 코드에 액세스할 수 있지만, 성능이 훨씬 뛰어나므로 WSL 2 파일 시스템을 사용하는 것이 좋습니다. WSL 2 내부 파일 시스템을 사용할 때 성능이 더 좋으므로 이를 사용하는 방법을 안내해 드리겠습니다.
컨테이너에서 열 폴더를 선택해야 합니다. 먼저 Dev Containers 확장을 설치했는지 확인합니다. 그런 다음 WSL 확장을 사용하여 이미 열려 있는 폴더에서 **Dev Containers: Reopen in Container** 명령을 호출할 수 있습니다.
WSL 2 파일 시스템에 Node 프로젝트가 있는 기존 HelloNode 폴더가 있습니다. **Dev Containers: Reopen in Container**를 선택하겠습니다.

리포지토리에 아직 DevContainer 구성이 없으므로 컨테이너 정의 목록이 나타납니다. 나타나는 컨테이너 구성 정의 목록은 제 프로젝트 유형을 기준으로 필터링됩니다. **Node.js 14**를 선택하겠습니다.

VS Code의 새 인스턴스가 열립니다. VS Code가 이미지를 빌드한 다음 컨테이너를 시작합니다.

이제 애플리케이션에 컨테이너 구성 정보가 저장된 .devcontainer 폴더가 있습니다. WSL과 컨테이너 모두에 연결되었는지 다시 확인하기 위해 통합 터미널을 열고 uname 및 Node 버전을 확인해 보겠습니다.

보시다시피 uname은 Linux로 나왔으므로 여전히 WSL 2 엔진에 연결되어 있으며, node -v는 v14.4.0을 반환하므로 Node 14 컨테이너를 성공적으로 구성했습니다.
F5를 눌러 앱을 실행해 보겠습니다.

성공!
피드백 및 추가 자료
VS Code를 WSL 및 컨테이너와 함께 설정하는 데 도움이 되는 자세한 내용은 VS Code 원격 개발 설명서에 있습니다. 팀에 대한 질문이나 피드백이 있는 경우 VS Code 원격 개발 GitHub 리포지토리에 이슈를 열거나 @code로 트윗해 주세요.
행복한 코딩 되세요!
Brigit Murtaugh, VS Code 프로그램 관리자 @BrigitMurtaugh