WSL 2에서 Docker 원격 컨테이너 시작

이 단계별 가이드는 WSL 2(Linux용 Windows 하위 시스템, 버전 2)를 사용해 Windows용 Docker Desktop을 설정하여 원격 컨테이너로 개발을 시작하는 데 도움이 됩니다.

Windows용 Docker Desktop은 Docker화된 앱을 빌드, 배송 및 실행하기 위한 개발 환경을 제공합니다. WSL 2 기반 엔진을 사용하도록 설정하면 동일한 컴퓨터의 Docker Desktop에서 Linux 및 Windows 컨테이너를 모두 실행할 수 있습니다. (Docker Desktop은 개인용 및 중소기업용으로 무료입니다. Pro, Team 또는 Business 가격 책정에 대한 정보는 Docker 사이트 FAQ를 참조하세요.)

참고 항목

Windows 및 Linux용 Windows 하위 시스템과의 통합으로 인해 Docker Desktop을 사용하는 것이 좋습니다. 그러나 Docker Desktop은 Linux 및 Windows 컨테이너 실행을 모두 지원하지만 두 컨테이너를 동시에 실행할 수는 없습니다. Linux 및 Windows 컨테이너를 동시에 실행하려면 WSL에서 별도의 Docker 인스턴스를 설치하고 실행해야 합니다. 동시 컨테이너를 실행해야 하거나 Linux 배포판에 직접 컨테이너 엔진을 설치하려는 경우 Ubuntu에 Docker 엔진 설치 또는 Linux 컨테이너 실행을 위한 Podman 설치와 같은 해당 컨테이너 서비스에 대한 Linux 설치 지침을 따릅니다.

Docker 컨테이너 개요

Docker는 컨테이너를 사용하여 애플리케이션을 만들고, 배포하고, 실행하는 데 사용되는 도구입니다. 개발자는 컨테이너를 사용하여 필요한 모든 파트(라이브러리, 프레임워크, 종속성 등)와 함께 앱을 패키징하여 하나의 패키지로 제공할 수 있습니다. 컨테이너를 사용하면 앱을 실행하는 컴퓨터(코드를 작성하고 테스트하는 데 사용된 머신과 다를 수도 있음)의 사용자 지정된 설정 또는 이전에 설치한 라이브러리와 상관없이 앱이 동일하게 실행됩니다. 따라서 개발자는 코드가 실행될 시스템에 대해 신경 쓰지 않고 코드 작성에 집중할 수 있습니다.

Docker 컨테이너는 가상 머신과 비슷하지만 전체 가상 운영 체제를 만들지는 않습니다. 대신 Docker를 사용하면 앱이 실행 중인 시스템과 동일한 Linux 커널을 사용할 수 있습니다. 따라서 호스트 컴퓨터에 아직 없는 파트만 앱 패키지에 필요하므로 패키지 크기를 줄이고 성능을 높일 수 있습니다.

컨테이너가 인기 있는 또 다른 이유는 Kubernetes 같은 도구와 함께 Docker 컨테이너를 사용하면 지속적인 가용성을 얻을 수 있다는 점입니다. 이렇게 하면 여러 버전의 앱 컨테이너를 서로 다른 시간에 만들 수 있습니다. 업데이트 또는 유지 관리를 위해 전체 시스템을 중단하는 대신, 각 컨테이너(및 해당 마이크로서비스)를 필요할 때 바꿀 수 있습니다. 모든 업데이트가 포함된 새 컨테이너를 준비하고, 프로덕션용 컨테이너를 설정하고, 준비가 되면 새 컨테이너를 가리킬 수 있습니다. 컨테이너를 사용하여 여러 버전의 앱을 보관하고, 필요한 경우 안전 대비책으로 앱을 계속 실행할 수도 있습니다.

자세한 내용은 Docker 컨테이너 소개를 참조하세요.

필수 조건

자세한 내용은 Windows에 Docker Desktop을 설치하기 위한 Docker 문서 시스템 요구 사항을 참조하세요.

Windows Server에 Docker를 설치하는 방법을 알아보려면 시작: 컨테이너용 Windows 준비를 참조 하세요.

참고 항목

WSL은 WSL 버전 1 또는 WSL 2 모드 모두에서 배포를 실행할 수 있습니다. PowerShell을 열고 wsl -l -v를 입력하여 확인할 수 있습니다. wsl --set-version <distro> 2을 입력하여 배포가 WSL 2를 사용하도록 설정되었는지 확인합니다. <distro>를 배포판 이름(예: Ubuntu 18.04)으로 바꿉니다.

WSL 버전 1에서는 Windows와 Linux 간의 근본적인 차이점으로 인해 Docker 엔진이 WSL 내에서 직접 실행될 수 없었기 때문에 Docker 팀은 Hyper-V VM 및 LinuxKit을 사용하여 대체 솔루션을 개발했습니다. 그러나 WSL 2는 이제 전체 시스템 호출 용량을 갖춘 Linux 커널에서 실행되므로 Docker는 WSL 2에서 완전히 실행할 수 있습니다. 즉, Linux 컨테이너는 에뮬레이션 없이 기본적으로 실행될 수 있으므로 Windows와 Linux 도구 간의 성능과 상호 운용성이 향상됩니다.

Docker Desktop 설치

Windows용 Docker Desktop에서 지원되는 WSL 2 백 엔드를 사용하면 Linux 기반 개발 환경에서 작업하고 Linux 기반 컨테이너를 빌드하는 동시에 코드 편집 및 디버깅에 Visual Studio Code를 사용하고 Windows의 Microsoft Edge 브라우저에서 컨테이너를 실행할 수 있습니다.

Docker를 설치하려면(이미 WSL을 설치한 후):

  1. Docker Desktop을 다운로드하고 설치 지침을 따릅니다.

  2. 설치가 완료되면 Windows 시작 메뉴에서 Docker Desktop을 시작한 다음 작업 표시줄의 숨겨진 아이콘 메뉴에서 Docker 아이콘을 선택합니다. 아이콘을 마우스 오른쪽 단추로 클릭하여 Docker 명령 메뉴를 표시하고 "설정"을 선택합니다. Docker Desktop 대시보드 아이콘

  3. 설정>일반에서 "WSL 2 기반 엔진 사용"이 선택되어 있는지 확인합니다. Docker Desktop 일반 설정

  4. 설정>리소스>WSL 통합으로 이동하여 Docker 통합을 사용하도록 설정하려는 설치된 WSL 2 배포판에서 선택합니다. Docker Desktop 리소스 설정

  5. Docker가 설치되었는지 확인하려면 WSL 배포(예: Ubuntu)를 열고 다음을 입력하여 버전 및 빌드 번호를 표시합니다. docker --version

  6. docker run hello-world 명령을 사용하여 간단한 기본 제공 Docker 이미지를 실행하여 올바르게 설치되었는지 테스트합니다.

다음은 알아야 할 몇 가지 유용한 Docker 명령입니다.

  • Docker CLI에서 사용할 수 있는 명령 나열: docker
  • 특정 명령에 대한 정보 나열: docker <COMMAND> --help
  • 머신의 docker 이미지 나열(현재는 hello-world 이미지만 나열됨): docker image ls --all
  • docker container ls --all 또는 docker ps -a를 사용하여 컴퓨터의 컨테이너를 나열합니다(-a show all 플래그가 없으면 실행 중인 컨테이너만 표시됨).
  • WSL 2 컨텍스트에서 사용할 수 있는 통계 및 리소스(CPU 및 메모리)를 포함하여 Docker 설치와 관련된 시스템 전체 정보를 다음과 같이 나열합니다. docker info

VS Code를 사용하여 원격 컨테이너에서 개발

WSL 2와 함께 Docker를 사용하여 앱 개발을 시작하려면 WSL, Dev Containers 및 Docker 확장과 함께 VS Code를 사용하는 것이 좋습니다.

  • VS Code WSL 확장을 설치합니다. 이 확장을 사용하면 VS Code의 WSL에서 실행되는 Linux 프로젝트를 열 수 있습니다(경로 문제, 이진 파일 호환성 또는 기타 OS 간 문제에 대해 걱정할 필요 없음).

  • VS Code Dev Containers 확장을 설치합니다. 이 확장을 사용하면 컨테이너 내에서 개발 작업을 수행하도록 설정된 Visual Studio Code의 전체 기능을 활용하여 컨테이너 내부의 프로젝트 폴더 또는 리포지토리를 열 수 있습니다.

  • VS Code Docker 확장 설치. 이 확장은 VS Code 내부에서 컨테이너화된 애플리케이션을 빌드, 관리 및 배포하는 기능을 추가합니다. (실제로 컨테이너를 개발 환경으로 사용하려면 Dev Containers 확장이 필요합니다.)

Docker를 사용하여 기존 앱 프로젝트에 대한 개발 컨테이너를 만들어 보겠습니다.

  1. 이 예에서는 Python 개발 환경 설정 문서의 Django용 Hello World 자습서의 소스 코드를 사용할 예정입니다. 자체 프로젝트 소스 코드를 사용하려면 이 단계를 건너뛸 수 있습니다. GitHub에서 내 HelloWorld-Django 웹앱을 다운로드하려면 WSL 터미널(예: Ubuntu)을 열고 다음을 입력합니다. git clone https://github.com/mattwojo/helloworld-django.git

    참고 항목

    항상 도구를 사용하는 것과 동일한 파일 시스템에 코드를 저장합니다. 이렇게 하면 파일 액세스 성능이 빨라집니다. 이 예에서는 Linux 배포판(Ubuntu)을 사용 중이며 프로젝트 파일을 WSL 파일 시스템 \\wsl\에 저장하려고 합니다. Windows 파일 시스템에 프로젝트 파일을 저장하면 WSL에서 Linux 도구를 사용하여 해당 파일에 액세스할 때 작업 속도가 크게 느려집니다.

  2. WSL 터미널에서 이 프로젝트의 소스 코드 폴더로 디렉터리를 변경합니다.

    cd helloworld-django
    
  3. 다음을 입력하여 로컬 WSL 확장 서버에서 실행 중인 VS Code에서 프로젝트를 엽니다.

    code .
    

    VS Code 인스턴스의 왼쪽 하단 모서리에 있는 녹색 원격 표시기를 확인하여 WSL Linux 배포판에 연결되어 있는지 확인합니다.

    VS Code WSL 원격 표시기

  4. VS Code 명령 팔레트(Ctrl + Shift + P)에서 다음을 입력 합니다. 개발 컨테이너: WSL 확장을 사용하여 이미 열려 있는 폴더를 사용 중이므로 컨테이너 에서 다시 엽니다. 또는 개발 컨테이너: 컨테이너에서 폴더 열기... 로컬 \\wsl$ 공유를 사용하여 WSL 폴더를 선택합니다(Windows 쪽에서). 자세한 내용은 Visual Studio Code 빠른 시작: 컨테이너 에서 기존 폴더를 엽니다. 입력을 시작할 때 이러한 명령이 표시되지 않으면 검사 위에 연결된 Dev Containers 확장을 설치했는지 확인합니다.

    VS Code Dev Containers 명령

  5. 컨테이너화하려는 프로젝트 폴더를 선택합니다. 제 경우에는 \\wsl\Ubuntu-20.04\home\mattwojo\repos\helloworld-django\입니다.

    VS Code Dev Containers 폴더

  6. 아직 프로젝트 폴더(repo)에 개발 컨테이너 구성이 없기 때문에 컨테이너 정의 목록이 나타납니다. 표시되는 컨테이너 구성 정의 목록은 프로젝트 형식에 따라 필터링됩니다. Django 프로젝트의 경우 Python 3을 선택할 예정입니다.

    VS Code Dev Containers 구성 정의

  7. VS Code의 새 인스턴스가 열리고 새 이미지 빌드가 시작되며 빌드가 완료되면 컨테이너가 시작됩니다. Dockerfiledevcontainer.json 파일 내부의 컨테이너 구성 정보와 함께 새 .devcontainer 폴더가 나타나는 것을 볼 수 있습니다.

    VS Code .devcontainer 폴더

  8. 프로젝트가 여전히 WSL과 컨테이너 내 모두에 연결되어 있는지 확인하려면 VS Code 통합 터미널(Ctrl + Shift + ~)을 엽니다. uname을 입력하여 운영 체제를 확인하고 및 python3 --version을 입력하여 Python 버전을 확인합니다. uname이 "Linux"를 반환하므로 여전히 WSL 2 엔진에 연결되어 있고 Python 버전 번호는 WSL 배포에 설치된 Python 버전과 다를 수 있는 컨테이너 구성을 기반으로 합니다.

  9. Visual Studio Code를 사용하여 컨테이너 내에서 앱을 실행하고 디버그하려면 먼저 실행 메뉴를 엽니다(Ctrl+Shift+D 또는 맨 왼쪽 메뉴 모음에서 탭 선택). 그런 다음 실행 및 디버그를 선택하여 디버그 구성을 선택하고 프로젝트에 가장 적합한 구성을 선택합니다(내 예제에서는 "Django"). 이렇게 하면 앱 실행 방법에 대한 지침과 함께 프로젝트의 .vscode 폴더에 launch.json 파일이 만들어집니다.

    VS Code 실행 디버그 구성

  10. VS Code 내부에서 실행>디버깅 시작을 선택하거나 F5 키를 누릅니다. 이렇게 하면 VS Code 내에서 터미널이 열리고 "http://127.0.0.1:8000/에서 개발 서버 시작 중 -C로 서버 종료"와 같은 결과가 표시됩니다. 키를 누른 상태에서 표시되는 주소를 선택하여 기본 웹 브라우저에서 앱을 열고 컨테이너 내에서 실행 중인 프로젝트를 확인합니다.

    Docker 컨테이너를 실행하는 VS Code

이제 VS Code를 사용하여 코딩, 빌드, 실행, 배포 또는 디버그할 수 있는 WSL 2 백 엔드로 구동되는 Docker Desktop을 사용하여 원격 개발 컨테이너를 성공적으로 구성했습니다!

문제 해결

WSL Docker 컨텍스트가 더 이상 사용되지 않음

WSL용 Docker의 초기 Tech Preview를 사용하고 있었다면 이제 더 이상 사용되지 않고 더 이상 사용되지 않는 "wsl"이라는 Docker 컨텍스트가 있을 수 있습니다. docker context ls 명령을 사용하여 확인할 수 있습니다. 이 "wsl" 컨텍스트를 제거하여 Windows 및 WSL2 모두에 대한 기본 컨텍스트를 사용하려는 경우 명령을 docker context rm wsl 사용하여 오류를 방지할 수 있습니다.

더 이상 사용되지 않는 이 wsl 컨텍스트에서 발생할 수 있는 오류는 다음과 같습니다. docker wsl open //./pipe/docker_wsl: The system cannot find the file specified. 또는 error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_wsl/v1.40/images/json?all=1: open //./pipe/docker_wsl: The system cannot find the file specified.

이 문제에 대한 자세한 내용은 Windows 10의 Windows System for Linux(WSL2) 내에서 Docker를 설정하는 방법을 참조하세요.

Docker 이미지 스토리지 폴더를 찾는 데 문제가 있습니다.

Docker는 데이터를 저장할 두 개의 distro 폴더를 만듭니다.

  • \wsl$\docker-desktop
  • \wsl$\docker-desktop-data

WSL Linux 배포를 열고 explorer.exe .를 입력하여 Windows 파일 탐색기에서 폴더를 보면 이러한 폴더를 찾을 수 있습니다. \\wsl\<distro name>\mnt\wsl을 입력합니다. <distro name>을 배포 이름(예: Ubuntu-20.04)으로 바꾸면 이 폴더를 볼 수 있습니다.

WSL에서 Docker 스토리지 위치 찾기에관대해 자세히 알아봅니다. WSL 스토리지의 문제 또는 이 StackOverflow 게시물을 참조하세요.

WSL의 일반적인 문제 해결에 대한 추가 도움말은 문제 해결 문서를 참조하세요.

추가 리소스