Windows에서 Docker 사용하기? 지금 학습 시작하거나…!

컨테이너와 도커에 처음 접하고 주로 Windows에서 작업하는 경우 즐거운 시간을 보낼 수 있습니다. 이 문서에서는 Docker Desktop for Windows 또는 이 문서에서 Docker Desktop로 간단히 언급하는 방법으로 Windows 10에서 Docker를 설정하는 방법을 배우게 될 것입니다.

Docker Desktop은 Docker Engine과 관리 클라이언트가 함께 패키지로 제공되어 Windows 10에서 쉽게 사용할 수 있습니다. 이 문서에서는 Docker Desktop을 설치하고 첫 번째 컨테이너를 배포하고 호스트와 컨테이너 간에 데이터를 공유하는 방법을 알아보게 될 것입니다.

Windows에서 Docker를 사용하기 위한 사전 조건

이 문서는 Docker Desktop을 사용하여 Windows에서 Docker의 다양한 단계를 안내하는 문서입니다. 따라하려면 먼저 몇 가지 특정 요구 사항이 갖춰져 있어야 합니다.

  • 800MB 이상의 데이터를 다운로드하기 위한 인터넷 연결
  • Pro, Enterprise 또는 Education 버전이 설치된 Windows 10 64비트. Windows 10에서 Hyper-V를 실행하기 위해서는 이 버전이 1703 이상이어야 합니다.
  • A CPU with SLAT (nested paging) compatibility. All AMD/Intel processors since approximately 2008 are SLAT compatible
  • 최소 4GB의 RAM
  • 가상화 기술 또는 VT-x로 표시되는 BIOS 하드웨어 가상화. 이 기능은 활성화되어 있어야 하며 작업 관리자의 성능 탭에서 활성화됨으로 표시되어야 합니다. 아래 그림 참조.
Enabled BIOS virtualization shown in Windows Task Manager

Docker Desktop 다운로드 및 설치하기

가장 먼저, Windows에서 Docker를 사용하려면 Docker Desktop을 다운로드하고 설치해야 합니다. Docker Desktop은 안정 버전과 테스트 버전으로 제공됩니다.

안정 버전은 분기별로 출시되며 완전히 테스트된 응용 프로그램을 제공합니다. 이 글에서는 안정 버전을 사용할 것입니다.

경고: 설치 중 Docker Desktop은 Hyper-V 하이퍼바이저를 설치하라는 메시지를 표시할 수 있습니다. 이렇게 하면 Hyper-V 하이퍼바이저가 VirtualBox, VMWare 등의 사용자 모드 하이퍼바이저에서 게스트 가상 머신 실행을 방지합니다. VirtualBox와 VMWare의 Hyper-V 지원은 제한적이지만 추후 추가될 예정입니다.

또한 Docker Desktop을 Docker.com에서 직접 다운로드하거나 Windows 패키지 관리자인 Chocolatey를 통해 다운로드할 수도 있습니다. 각 방법에 대해 간단히 알아보겠습니다.

Docker.com에서부터

docker.com에서 Docker Desktop을 직접 다운로드하려면 제품 페이지로 이동하여 계정을 등록하고 다운로드할 수 있습니다. 이렇게 하면 계정을 등록하여 프로덕션에서 Docker를 사용할 경우 선호됩니다.

그러나 처음으로 Docker를 테스트하려는 경우 직접 다운로드하여 훨씬 간편합니다.

EXE 파일을 다운로드한 후 실행 파일을 실행하고 모든 기본값을 수락하는 프롬프트를 클릭합니다.

아래에 표시된대로 Linux 컨테이너 대신 Windows 컨테이너 사용에 대해 묻는 경우, 체크박스를 활성화하지 않습니다. 이 기사에서는 Linux 컨테이너를 사용합니다.

Installing Docker Desktop

설치가 완료되면 컴퓨터를 재부팅합니다.

Windows 컨테이너 또는 Linux 컨테이너를 사용하는 옵션을 선택하면 Docker가 이미지를 Windows 커널 또는 Linux 커널에 연결하도록 지정합니다. 설치 후에는 시스템 트레이에 있는 Docker 아이콘을 마우스 오른쪽 단추로 클릭하고 아래에 표시된대로 Windows 컨테이너로 전환할 수 있습니다.

Switching to Windows containers

Chocolatey를 사용합니다

도커 데스크탑을 다운로드하고 설치하는 다른 옵션은 초콜렛을 사용하는 것입니다. 초콜렛은 다운로드 및 설치 작업을 자동화합니다. 이를 위해 관리자 권한으로 명령 줄 콘솔(cmd 또는 PowerShell)을 열어 아래 명령을 실행하여 한 번에 프로그램을 다운로드하고 설치하십시오.

choco install docker-desktop

완료되면 Windows 10을 재부팅하십시오.

테스트 릴리스를 시도하려면 다음 명령을 실행하여 다운로드하고 설치할 수 있습니다. choco install docker-desktop --pre.

도커 데스크탑 설치 유효성 검사

설치가 완료되면 도커 데스크탑은 자동으로 도커를 제공하는 서비스로 실행됩니다. 재부팅 후 Windows에 로그인하면 시스템 트레이에 표시됩니다. 하지만 실제로 작동하는지 어떻게 알 수 있을까요?

도커 데스크탑이 올바르게 작동하는지 확인하려면 명령 줄 콘솔을 열고 docker 명령을 실행하십시오. 설치가 잘 되었다면 도커 명령 참조가 표시됩니다.

마지막으로, hello-world라는 예제 컨테이너 이미지를 도커에 다운로드하고 실행하려면 docker run hello-world 명령을 실행하십시오. 모든 것이 정상이라면 아래와 같은 출력이 표시됩니다.

A successful test image run via Docker Desktop

도커 컨테이너에서 명령 실행하기

Docker Desktop가 설치되었고 모두 확인했나요? 그럼 이제 어떻게 시작할까요? Windows에서 Docker를 시작하기 위해 Docker 컨테이너에서 수행할 수 있는 일반적인 작업 중 하나는 명령 실행입니다. docker run 명령을 통해 호스트(Windows 10 PC)를 통해 실행 중인 컨테이너로 직접 명령을 보낼 수 있습니다.

docker run을 사용하여 컨테이너에서 명령을 실행하려면 먼저 이미지 이름을 지정한 다음 명령을 입력해야 합니다. 시작하려면 Docker에 아래에서 볼 수 있는 대로 alpine이라는 이름의 컨테이너 안에서 hostname 명령을 실행하도록 지시하세요.

> docker run alpine hostname
b74ff46601af

현재 컴퓨터에 alpine Docker 이미지가 없기 때문에 Docker on Windows는 Docker Hub에서 작은 이미지를 다운로드하고 해당 이미지에서 컨테이너를 시작한 다음 명령을 직접 컨테이너로 전송하고 한 번에 종료합니다.

컨테이너를 계속 실행하려면 -it 매개변수를 사용할 수도 있습니다. 이 매개변수는 Docker에게 명령을 실행한 후 “대화형 모드”로 컨테이너를 계속 유지하도록 알려줍니다. 그러면 터미널 프롬프트가 나타나 ready to go 상태가 됩니다.

> docker run -it alpine sh
/ #

터미널에서 작업을 마치면 exit을 입력하여 Windows 10으로 돌아갈 수 있습니다.

컨테이너에서 Docker 호스트의 파일에 액세스하기

다른 일반적인 작업은 컨테이너에서 호스트 파일에 접근하는 것입니다. Windows에서 Docker를 사용하여 컨테이너에 호스트 파일에 액세스할 수 있도록 디렉토리 경로를 바인딩하여 호스트 파일을 컨테이너에 공유할 수 있습니다. 이 과정을 바인딩이라고 합니다.

바인딩을 만들려면 로컬 드라이브에 폴더를 만드십시오. 이 예제에서는 E:\를 사용하여 input이라고 부르겠습니다. 그런 다음 폴더에 file.txt라는 새 텍스트 문서가 생성됩니다. 원하는 경로와 파일을 자유롭게 사용하십시오.

호스트와 컨테이너 사이에서 공유하려는 폴더가 준비되었다면, Docker는 --mount 매개변수를 사용하여 폴더를 마운트해야 합니다. --mount 매개변수는 세 가지 인수가 필요합니다. 마운트 유형, 소스 호스트 디렉토리 경로 및 대상 디렉토리 경로입니다. 대상 경로는 컨테이너 내에서 심볼릭 링크가 됩니다.

아래 예제에서는 Windows 10 호스트 내의 전체 E:\가 Linux 컨테이너 내의 /home/TEST 디렉토리로 표시되도록 마운트하는 방법을 보여줍니다.

> docker run --mount type=bind,source="E:/",target=/home/TEST -it alpine

호스트 폴더를 마운트하려고 할 때, Docker Desktop은 아래와 같이 도커 컨테이너와 이 드라이브를 공유할 수 있는 권한을 요청합니다.

Sharing a Docker drive

앞에서 설명한 대로 Windows 10 폴더에 file.txt 파일을 만들었다면, cat /home/TEST/input/file.txt를 실행하면 내용이 표시됩니다.

지금 방금 생성한 input 폴더를 삭제하고 cat ... 명령을 다시 실행하십시오. 셸이 이제 파일이 더 이상 존재하지 않음을 보여줍니다.

Working with files in Docker containers

네트워크 포트 매핑

Windows에서 Docker가 네트워킹을 처리하는 방법에 대해 알아야 할 또 다른 중요한 개념입니다. 간단한 소개를 위해 컨테이너에서 실행되는 웹 서비스에 로컬 호스트에서 액세스하는 데 필요한 작업을 살펴봅시다.

먼저, 예제 웹 페이지를 실행할 데모 이미지를 실행하십시오. dockersamples/static-site라는 Docker 이미지를 다운로드하고 실행하겠습니다. 이를 위해 docker container run을 사용할 것입니다.

다음 명령은 한 번에 네 가지 작업을 수행합니다:

  • static-site라는 Docker Hub에서 Docker 이미지를 다운로드합니다. docker-samples “디렉토리”에서
  • static-site 이미지에서 컨테이너 인스턴스를 시작합니다.
  • --detach를 사용하여 컨테이너를 즉시 터미널 전경에서 분리합니다.
  • --publish-all을 사용하여 실행 중인 컨테이너의 네트워크 포트를 Windows 10 호스트에 액세스할 수 있게 만듭니다.
docker container run --detach --publish-all dockersamples/static-site
## 동일한 작업을 수행하는 대체/간략한 구문:
## docker container run -d -P dockersamples/static-site
## docker run -d -P dockersamples/static-site

실행 후 Docker는 아래에 표시된 대로 시작된 컨테이너 ID를 반환합니다.

Docker container ID returned from running a container

네트워크 포트 공개

--publish-all 매개변수를 사용한 이후로는 로컬 호스트 포트가 컨테이너의 네트워크 스택에 매핑됩니다. docker ps 하위 명령을 사용하여 실행 중인 모든 컨테이너와 해당 컨테이너에 할당된 포트를 나열할 수 있습니다. 아래 예시에서는 하나의 컨테이너가 호스트 포트 32777을 컨테이너 포트 80에 매핑하고 호스트 포트 32776을 컨테이너 포트 443에 매핑하고 있습니다.

Showing port mapping of Docker container

Windows에서 Docker를 사용할 때 --publish-all 매개변수를 사용하면 Docker가 명시적으로 정의하지 않은 경우 컨테이너에 임의의 포트를 할당합니다.

이제 웹 브라우저를 열고 http://localhost:32777 또는 Docker가 포트 80에 매핑한 포트로 이동합니다. 모든 것이 정상적으로 진행되면 아래의 웹페이지가 표시됩니다.

Resulting webpage running in the Docker container

게시된 포트 변경하기

이제 Windows의 Docker에서 실행 중인 Docker 컨테이너가 간단한 웹 페이지를 제공합니다. 축하합니다! 하지만 이제는 --publish-all과 무작위 포트 선택에 의존하지 않고 특정 포트 바인딩을 지정해야 합니다. 문제 없습니다. -p 매개변수를 사용하십시오.

먼저, docker ps를 실행하여 컨테이너의 고유한 문자열을 지정하여 실행 중인 컨테이너를 중지합니다. 컨테이너 ID는 컨테이너를 중지한 후에도 알 수 있습니다. 그런 다음 Docker에게 게시할 특정 포트를 할당하도록 컨테이너를 중지하고 새로 시작하세요.

포트를 지정하는 구문<외부 포트>:<컨테이너 포트>입니다. 발행하려는 각 포트에 대해 다음과 같이 외부 포트와 컨테이너 포트 번호와 함께 --publish 또는 -p 스위치를 사용하십시오.

> docker stop f766
> docker run --detach -p 1337:80 dockersamples/static-site

컨테이너 ID를 지정할 때는 고유하게 식별할 수 있는만큼의 ID만 입력하면 됩니다. 단일 컨테이너만 실행 중이고 해당 ID가 f766f4ac8d66bf7인 경우 f를 포함하여 임의의 문자를 사용하여 컨테이너를 식별할 수 있습니다. 요구 사항은 입력한 내용이 단일 컨테이너를 고유하게 식별할 수 있어야 한다는 것입니다.

이제 웹 브라우저로 이동하여 localhost:1337로 이동하십시오. 기억하세요, 이미지를 변경하지 않고 항상 포트 80에서 수신 대기하도록 설정은 도커 구성에서 포트 변환 규칙을 변경하는 것입니다. 이를 통해 컨테이너에 연결할 수 있습니다.

Webpage being served up on port 1337

모든 컨테이너 중지하기

docker stop을 사용하여 컨테이너를 중지할 수 있지만 어떻게 여러 컨테이너를 동시에 중지할 수 있을까요? 하나의 방법은 여러 개의 공백으로 구분된 컨테이너 ID를 제공하는 것입니다. 아래에서는 ID가 fd50b0a446e7, 36ee57c3b7da, 7c45664906ff인 세 개의 컨테이너를 중지하는 예제를 볼 수 있습니다.

> docker stop fd50 36ee 7c45

PowerShell에서 Docker 컨테이너를 관리하는 경우, 모든 컨테이너를 중지하는 단축키를 사용할 수도 있습니다. PowerShell의 명령 확장을 통해 중지 매개 변수에 컨테이너 ID 목록을 전달하십시오. docker ps -q를 사용하여 docker stop (docker ps -q)를 실행하십시오.

docker ps를 입력할 때 컨테이너가 나열되지 않으면 모든 컨테이너가 중지되었음을 확인하십시오.

정리

몇 개의 컨테이너 이미지를 다운로드하고 중지된 컨테이너를 실행했습니다. 중지되었지만 로컬 호스트 디스크에 할당된 저장 공간은 사라지지 않았습니다. 해당 공간을 해제하고 작업 공간을 지저분하게 만들지 않으려면 컨테이너를 삭제해야 합니다.

단일 컨테이너를 삭제하려면 다음과 같이 컨테이너 삭제 rm 매개 변수를 사용하십시오.

> docker container rm <container ID>

또는 중지된 모든 컨테이너를 삭제하려면 다음과 같이 prune 매개 변수를 사용하십시오.

> docker container prune

Source:
https://adamtheautomator.com/docker-windows/