Docker Build Tag로 Docker Windows 이미지 만드는 방법

당신은 Docker Windows 이미지에 익숙한가요? 현재 Windows 환경에서 작업하고 있는데, Docker 빌드를 통해 컨테이너 이미지를 만드는 방법을 배우고 싶으신가요? 당신이 올바른 장소에 왔습니다. 새로운 것을 배우는 가장 좋은 방법은 docker builddocker build "태그" 명령을 사용하여 직접 해보는 것입니다!

이 글에서는 Dockerfile을 사용하여 첫 번째 Windows Docker 이미지를 생성하는 방법에 대해 배우게 될 것입니다. docker build 명령을 사용해 시작해 봅시다!

시작해 봅시다!

Docker 컨테이너 이미지 이해하기

오랫동안 여러 운영 체제(OS)에서 테스트하거나 개발을 수행하는 유일한 방법은 선택한 OS 버전의 여러 전용 물리 또는 가상 머신에 이미지를 사용하는 것이었습니다. 이 방법론은 각 소프트웨어와 OS 사양을 위해 새로운 머신을 프로비저닝하는 데 더 많은 하드웨어와 오버헤드가 필요했습니다.

하지만 요즘에는 Docker 컨테이너 이미지의 사용이 증가하고 있습니다. 이는 마이크로서비스 아키텍처의 인기로 인한 것입니다. Docker의 인기 상승에 대응하여 Microsoft는 자사의 Docker 허브 페이지에서 여러 주요 제품에 대한 Docker 이미지를 공개적으로 지원하기 시작했습니다. 그들은 심지어 Windows 10 및 Windows Server 2016에서 제품 기능으로 Windows 이미지의 네이티브 지원을 추가했습니다!

A Docker image is run on a container by using the Docker Engine. Docker images have many benefits such as portability (applicable to multiple environments and platforms), customizable, and highly scalable.  As you can see below, unlike traditional virtual machines, the Docker engine runs on a layer between the host OS kernel and the isolated application services that are being containerized.

Source: Docker

Docker 빌드와 이미지 이해하기

docker build 명령은 컨테이너 이미지를 자동으로 생성하고 컨테이너를 코드로 채택하는 DevOps 실천 방법을 활용하며 프로젝트의 개발 주기에 컨테이너화를 통합 할 수 있습니다. Dockerfile은 단순히 Docker가 기존 이미지를 기반으로 새로운 컨테이너 이미지를 생성하는 데 사용하는 빌드 지침을 포함하는 텍스트 파일입니다.

사용자는 컨테이너 이미지가 배포되거나 처음 시작될 때 실행될 기본 이미지와 명령 목록을 지정할 수 있습니다. 이 문서에서는 Windows 컨테이너를 사용하여 Dockerfile에서 Windows 기반 도커 이미지를 생성하는 방법을 알아보게 됩니다.

이 방법은 사전에 미리 빌드된 컨테이너 이미지를 사용하는 것보다 여러 가지 장점이 있습니다:

  1. 여러 버전의 Windows에 대해 컨테이너 이미지를 다시 빌드할 수 있으므로 다양한 플랫폼에서 코드 변경을 테스트하는 데 유용합니다.
  2. 컨테이너에 설치되는 내용을 더 많이 제어할 수 있습니다. 이를 통해 컨테이너 크기를 최소화할 수 있습니다.
  3. 보안상의 이유로 컨테이너를 취약점으로부터 검사하고 기본 이미지에 보안 강화를 적용할 수도 있습니다.

사전 요구 사항

이 문서는 Dockerfile을 사용하여 Docker 이미지를 빌드하는 방법에 대한 안내입니다. 따라하기를 원한다면 다음 선행 조건을 충족해야 합니다.

  • Windows용 Docker 설치. 저는 환경에서 Docker Community Edition (CE) 버전 2.1.0.4를 사용할 것입니다.
  • 인터넷 액세스가 필요하여 Docker 이미지를 다운로드해야 합니다.
  • Windows 10+ 운영 체제 (이 튜토리얼에서는 버전 1709를 사용 중입니다)
  • 중첩 가상화가 활성화되어 있어야 합니다
  • 로컬 머신에서 5GB의 무료 디스크 공간이 필요합니다
  • PowerShell 5.0+
  • 이 튜토리얼에서는 Visual Studio Code IDE를 사용합니다. 그러나 원하는 IDE를 자유롭게 사용하십시오.

참고: Docker를 설치할 때 Windows Containers Configuration을 활성화해야 합니다.

준비 단계

먼저 Docker 이미지 및 해당 이미지에서 빌드할 모든 컨테이너를 저장할 폴더가 필요합니다. 이를 위해 PowerShell 또는 cmd 터미널을 열고 (이 기사 전체에서 PowerShell을 사용합니다) C:\Containers라는 새 폴더를 만듭니다.

폴더가 만들어지면 해당 디렉터리로 이동하십시오. 이렇게 하면 콘솔의 현재 작업 디렉터리가 C:\Containers로 설정되어 이 디렉터리에 모든 다운로드가 기본으로 지정됩니다.

PS51> mkdir C:\Containers
PS51> cd C:\Containers

이 기사에서는 먼저 시작할 수 있습니다. 이 프로젝트를 진행하는 데 필요한 대부분의 파일이 이미 준비되어 있습니다. 폴더를 생성한 후에는 Git pull을(를) 실행하여 TechSnips Github 저장소에서 이 기사에 필요한 파일을 C:\Containers 폴더로 복사하십시오. 완료되면 C:\Containers 폴더가 아래와 같이 보이는지 확인하십시오.

Tutorial files

IIS Windows Docker 이미지 다운로드

첫 번째 수행할 작업은 “템플릿” 또는 기본 이미지를 다운로드하는 것입니다. 나중에 자신만의 Docker 이미지를 빌드할 것이지만 먼저 시작할 이미지가 필요합니다. 이 자습서에 필요한 최신 IIS 및 Windows Server Core 이미지를 다운로드할 것입니다. 업데이트된 이미지 목록은 공식 Microsoft Docker 허브 이미지 페이지에서 확인할 수 있습니다.

현재 Docker 기본 이미지 검토

이미지 저장소에서 이미지를 다운로드하기 전에 현재 로컬 시스템에 있는 Docker 기본 이미지를 먼저 검토해 보겠습니다. 이를 위해 관리자 권한으로 PowerShell 콘솔을 실행한 다음 docker images를 입력하십시오. 이 명령은 로컬 시스템의 모든 이미지를 반환합니다.

아래에서 볼 수 있듯이 사용 가능한 이미지는 처음에는 비어 있습니다.

PS51> docker images
Docker Build Tag : Listing available Docker images

기본 이미지 다운로드

이제 도커 허브에서 기본 IIS 이미지를 다운로드하는 시간입니다. 이를 위해 아래에 표시된대로 docker pull을 실행하세요. 이 프로세스는 인터넷 속도에 따라 완료되기까지 시간이 소요될 수 있습니다.

PS51> docker pull mcr.microsoft.com/windows/servercore/iis
Downloading an image from the Docker Hub

이제 docker images를 실행하면이 튜토리얼용 최신 Microsoft Windows Core IIS 이미지가 사용 가능한 것을 확인할 수 있습니다.

PS51> docker images
Viewing available Docker images

도커 파일 검사

이 튜토리얼용 기존 도커 파일을 이전 단계에서 다운로드했습니다. 이제 정확히 무엇을 하는지 살펴 보겠습니다.

선호하는 편집기에서 C:\Containers\Container1\Dockerfile 파일을 엽니다. 이 Docker 파일의 내용은 빌드 시에 컨테이너 이미지가 어떻게 구성될 것인지를 정의하는 데 사용됩니다.

이 파일의 각 부분이하는 일에 대한 설명을 인라인 주석에서 볼 수 있습니다.

# 최신 microsoft/iis 이미지가 기본 이미지로 사용될 것임을 지정합니다.
# 빌드 프로세스에서 사용할 기본 컨테이너 이미지를 지정하는 데 사용됩니다.

# 네이밍 규칙이 "**소유자/응용 프로그램 이름: 태그 이름**"임을 유의하십시오.
# (microsoft/iis:latest로 표시됨); 따라서 우리의 경우 이미지의 소유자는
# Microsoft이고 응용 프로그램은 "latest" 태그 이름을 사용하여 IIS입니다.
# 가장 최신 이미지 버전을 가져올 것임을 지정하기 위해 사용됩니다.
FROM microsoft/iis:latest

# wwwroot 폴더의 내용을 새 컨테이너 이미지의 inetpub/wwwroot 폴더로 복사합니다.
# WWWroot 폴더를 IIS inetpub WWWroot로 복사하려는 것을 지정하는 데 사용됩니다.
# 컨테이너 내에서 해당 폴더의 전체 경로를 지정할 필요가 없습니다.
# 로컬 파일에 대한 경로를 지정하지 않아도 됩니다.
# 도커는 이미 시스템의 도커 파일 위치를 기준으로 파일과 폴더를 참조하는
# 논리를 내장하고 있으므로 로컬 파일에 대한 경로를 지정할 필요가 없습니다.
# 또한, 이것은 Linux가 아닌 Windows 기반 컨테이너이기 때문에 도커는 파일 경로에
COPY wwwroot c:/inetpub/wwwroot

# 슬래시를 사용합니다.

# 새 컨테이너 내에서 PowerShell 명령을 실행하여 이미지를 설정합니다.
# 기본 IIS 파일을 제거하고 TestPool이라는 새 응용 프로그램 풀을 만드는
RUN powershell Remove-Item c:/inetpub/wwwroot/iisstart.htm -force
RUN powershell Remove-Item c:/inetpub/wwwroot/iisstart.png -force
RUN powershell Import-Module WebAdministration
RUN powershell New-WebAppPool -Name 'TestPool'

# PowerShell 명령을 실행합니다.
# 새 컨테이너 이미지에서 포트 80을 노출시킵니다.
# 웹 사이트로의 http 연결을 허용하기 위해 TCP 포트 80을 열기 위해 사용됩니다.
# 그러나 이 줄은 주석 처리되어 있습니다. 왜냐하면 IIS 컨테이너에는 이 포트가
# 이미 기본적으로 열려 있기 때문입니다.

# 컨테이너 이미지의 주요 명령을 설정합니다.
# 이것은 이미지가 w3svc 서비스의 서비스 모니터를 실행하도록 지시합니다.
# 이것이 지정되면 w3svc 서비스가 중지되면 컨테이너가 자동으로 중지됩니다.
# 이 줄은 주석 처리되어 있습니다. 왜냐하면 IIS 컨테이너에는 이미 이 entrypoint가
# 기본적으로 설정되어 있기 때문입니다.
#ENTRYPOINT ["C:\\ServiceMonitor.exe", "w3svc"]

건물 새로 만들기

Dockerfile이 준비되어 있고 기본 IIS 이미지를 다운로드했습니다. 이제 Dockerfile을 사용하여 새 Docker 이미지를 빌드할 차례입니다.

새 이미지를 빌드하려면 docker build "tag" 명령을 사용하세요. 이 명령은 이미지를 생성합니다. 이 글에서는 -t ** 옵션을 사용하여 “tag” 부분을 대체하는 것도 볼 수 있습니다. 이 옵션을 사용하면 새 이미지에 친숙한 태그 이름을 지정하고 Dockerfile을 참조할 수 있습니다. Dockerfile이 있는 폴더 경로를 지정합니다.

아래에서 콘솔이 C:\Containers 디렉토리에 있는지 확인하고 C:\Containers\Container1 디렉토리의 Dockerfile에서 새 이미지를 빌드하는 예시를 볼 수 있습니다.

PS51> cd C:\Containers
PS51> docker build -t container1 .\Container1

시작하면 명령이 Docker 파일의 각 명령을 한 줄씩 횡단하면서 진행 상황을 볼 수 있습니다:

Building a progress of the command as it traverses each instruction in the docker filenew Docker image

완료되면 이제 새 Docker 이미지가 있어야 합니다!

이제 docker images 명령을 실행하여 사용 가능한 이미지를 확인합니다. 아래에서 container1 이미지가 생성된 예시를 볼 수 있습니다.

Viewing available Docker images

참고: docker build —help 명령은 실행 중인 docker 명령에 대한 자세한 정보를 표시하는 유용한 매개변수입니다.

Docker 컨테이너 실행

이 시점에서 새 이미지가 생성되었어야 합니다. 해당 이미지를 사용하여 컨테이너를 가동시키려면 docker run 명령을 사용하세요.

docker run 명령은 이전에 생성한 container1 이미지를 기반으로 새로운 Docker 컨테이너를 시작합니다. 아래 예시에서 이를 확인할 수 있습니다.

주목할 점은 -d 매개변수를 사용한다는 것입니다. 이는 docker 런타임에게 이미지를 떼어낸 모드로 시작하고 컨테이너를 실행하는 데 사용된 루트 프로세스가 종료되면 종료하라는 것입니다.

docker run이 완료되면 생성된 컨테이너의 ID가 반환됩니다. 아래 예시에서는 이 ID를 $containerID 변수에 캡처하여 나중에 쉽게 참조할 수 있도록 합니다.

PS51> $containerID = docker run -d container1
PS51> $containerID
Running a Docker container

컨테이너가 시작되면 이제 docker ps 명령을 실행합니다. 이 명령을 사용하면 각 이미지를 사용하여 현재 실행 중인 컨테이너를 볼 수 있습니다. 아래에서 실행 중인 이미지가 자동으로 닉네임(busy_habit이라는 경우)이 생성되었음을 알 수 있습니다. 이 닉네임은 때로는 컨테이너 ID 대신 컨테이너를 관리하는 데 사용됩니다.

Listing running Docker containers

Docker 컨테이너 내에서 코드 실행

A new container is built from a new image you just created. Let’s now start actually using that container to run code. Running code inside of a Docker container is done using the docker exec command.

이 예제에서는 명령 구문을 사용하여 컨테이너에서 Get-ChildItem 명령의 PowerShell 출력을 확인하려면 docker exec를 실행합니다. 이는 Dockerfile의 지침이 기본 IIS 파일을 제거하는 데 성공했는지 확인합니다.

PS51> docker exec $containerID powershell Get-ChildItem c:\inetpub\wwwroot

아래에서는 index.html만 존재하는 것을 확인할 수 있습니다. 이는 기본 파일이 제거되었음을 의미합니다.

Running PowerShell commands in a Docker container

이제 컨테이너 이미지에서 IIS 웹 사이트에 연결을 시도할 수 있도록 컨테이너의 로컬 IP 주소를 가져오기 위해 ipconfig 명령을 실행합니다.

PS51> docker exec $containerID ipconfig

아래에서 ipconfig이 로컬 컴퓨터에서 실행되는 것처럼 컨테이너에서 실행되었고 모든 IP 정보를 반환했음을 확인할 수 있습니다.

Running ipconfig in a Docker container

IIS 웹사이트 검사

이제 여러분의 노력의 결과물을 드러내는 시간입니다! 도커 컨테이너에서 실행 중인 IIS 서버가 index.html 페이지를 올바르게 제공하는지 확인할 때입니다.

브라우저를 열고 ipconfig를 통해 찾은 IP4 주소를 주소 표시줄에 붙여넣습니다. 모든 것이 잘 되었다면 아래와 같이 Hello World!! 메시지가 표시됩니다.

IIS webpage running in a Docker container

Docker 히스토리 검토

도커 컨테이너를 사용할 때 유용한 명령어 중 하나는 docker history 명령입니다. 이미지나 컨테이너 자체를 생성하는 것과 직접적으로 관련되지는 않지만, docker history 명령은 컨테이너 이미지에 대한 변경 사항을 검토할 수 있는 유용한 명령입니다.

PS51> docker history container1

아래에서 볼 수 있듯이, docker history는 작업 중인 container1 컨테이너에서 수행된 모든 Dockerfile 및 PowerShell 활동을 반환합니다.

Inspecting container changes with docker history

실행 중인 Docker 이미지 정리

아래 단계는 시스템에서 실행 중인 모든 중지된 컨테이너를 정리하는 데 사용됩니다. 이렇게 하면 디스크 공간과 시스템 리소스가 해제됩니다.

시스템에서 실행 중인 컨테이너 목록을 보려면 docker ps 명령을 실행하세요:

PS51> docker ps
Viewing available Docker containers

이제 docker stop 명령을 사용하여 실행 중인 컨테이너를 중지합니다:

PS51> docker stop <image nick name: busy_haibt in my case>
PS51> docker stop <image nick name: unruffled_driscoll in my case>
Stopping Docker containers

마지막으로 중지된 컨테이너를 영구적으로 제거할 수 있습니다. docker system prune 명령을 사용하세요.

PS51> docker system prune
Removing Docker images

추가 읽기

Source:
https://adamtheautomator.com/docker-build-tag/