Windows의 Dockerfile
Docker 엔진에는 컨테이너 이미지 생성을 자동화하는 도구가 포함되어 있습니다.
docker commit
명령을 실행하여 컨테이너 이미지를 수동으로 만들 수 있지만 자동화된 이미지 만들기 프로세스를 채택하면 다음과 같은 많은 이점이 있습니다.
- 컨테이너 이미지를 코드로 저장합니다.
- 유지 관리 및 업그레이드를 위해 컨테이너 이미지를 신속하고 정확하게 재현합니다.
- 컨테이너 이미지와 개발 주기 간의 연속 통합.
이 자동화를 구동하는 Docker 구성 요소는 Dockerfile 및 docker build
명령입니다.
Dockerfile은 새 컨테이너 이미지를 만드는 데 필요한 지침이 포함된 텍스트 파일입니다. 이러한 지침에는 기본으로 사용할 기존 이미지의 식별, 이미지 생성 프로세스 중에 실행할 명령 및 컨테이너 이미지의 새 인스턴스가 배포될 때 실행되는 명령이 포함됩니다.
Docker 빌드는 Dockerfile을 사용하고 이미지 만들기 프로세스를 트리거하는 Docker 엔진 명령입니다.
이 항목에서는 Windows 컨테이너에서 Dockerfiles를 사용하고, 기본 구문을 이해하고, 가장 일반적인 Dockerfile 지침이 무엇인지를 보여 줍니다.
이 문서에서는 컨테이너 이미지 및 컨테이너 이미지 계층의 개념을 설명합니다. 이미지 및 이미지 계층화에 대해 자세히 알아보려면 컨테이너 기본 이미지 참조하세요.
Dockerfiles에 대한 자세한 내용은 Dockerfile 참조를참고하세요.
기본 구문
가장 기본적인 형태로 Dockerfile은 매우 간단할 수 있습니다. 다음 예제에서는 IIS 및 'hello world' 사이트를 포함하는 새 이미지를 만듭니다. 이 예제에는 각 단계를 설명하는 주석(#
표시)이 포함되어 있습니다. 이 문서의 후속 섹션에서는 Dockerfile 구문 규칙 및 Dockerfile 지침에 대해 자세히 설명합니다.
메모
확장 없이 Dockerfile을 만들어야 합니다. Windows에서 이 작업을 수행하려면 선택한 편집기를 사용하여 파일을 만든 다음 표기법 "Dockerfile"(따옴표 포함)으로 저장합니다.
# Sample Dockerfile
# Indicates that the windowsservercore image will be used as the base image.
FROM mcr.microsoft.com/windows/servercore:ltsc2019
# Metadata indicating an image maintainer.
LABEL maintainer="jshelton@contoso.com"
# Uses dism.exe to install the IIS role.
RUN dism.exe /online /enable-feature /all /featurename:iis-webserver /NoRestart
# Creates an HTML file and adds content to this file.
RUN echo "Hello World - Dockerfile" > c:\inetpub\wwwroot\index.html
# Sets a command or process that will run each time a container is run from the new image.
CMD [ "cmd" ]
Windows용 Dockerfiles의 추가 예제는 Windows 리포지토리 Dockerfile을 참조하세요.
지시
Dockerfile 지침은 컨테이너 이미지를 만드는 데 필요한 지침을 Docker 엔진에 제공합니다. 이러한 지침은 하나씩 순서대로 수행됩니다. 다음 예제는 Dockerfiles에서 가장 일반적으로 사용되는 지침입니다. Dockerfile 지침의 전체 목록은 Dockerfile 참조참조하세요.
보낸 사람
FROM
명령은 새 이미지 만들기 프로세스 중에 사용할 컨테이너 이미지를 설정합니다. 예를 들어 명령 FROM mcr.microsoft.com/windows/servercore
사용하는 경우 결과 이미지는 Windows Server Core 기본 OS 이미지에서 파생되고 종속성이 있습니다. Docker 빌드 프로세스가 실행되는 시스템에 지정된 이미지가 없는 경우 Docker 엔진은 공용 또는 프라이빗 이미지 레지스트리에서 이미지를 다운로드하려고 시도합니다.
FROM 명령의 형식은 다음과 같습니다.
FROM <image>
FROM 명령의 예는 다음과 같습니다.
MCR(Microsoft Container Registry)에서 ltsc2019 버전 Windows Server Core를 다운로드하려면 다음을 실행합니다.
FROM mcr.microsoft.com/windows/servercore:ltsc2019
자세한 내용은 FROM 참조참조하세요.
달리다
RUN
명령은 실행할 명령을 지정하고 새 컨테이너 이미지로 캡처합니다. 이러한 명령에는 소프트웨어 설치, 파일 및 디렉터리 만들기, 환경 구성 만들기 등의 항목이 포함될 수 있습니다.
RUN 명령은 다음과 같습니다.
# exec form
RUN ["<executable>", "<param 1>", "<param 2>"]
# shell form
RUN <command>
exec와 셸 형식의 차이점은 RUN
명령이 실행되는 방식입니다. exec 양식을 사용하는 경우 지정된 프로그램이 명시적으로 실행됩니다.
다음은 exec 양식의 예입니다.
FROM mcr.microsoft.com/windows/servercore:ltsc2019
RUN ["powershell", "New-Item", "c:/test"]
결과 이미지는 powershell New-Item c:/test
명령을 실행합니다.
docker history doc-exe-method
IMAGE CREATED CREATED BY SIZE COMMENT
b3452b13e472 2 minutes ago powershell New-Item c:/test 30.76 MB
반대로 다음 예제에서는 셸 형식으로 동일한 작업을 실행합니다.
FROM mcr.microsoft.com/windows/servercore:ltsc2019
RUN powershell New-Item c:\test
결과 이미지에는 cmd /S /C powershell New-Item c:\test
대한 실행 명령이 있습니다.
docker history doc-shell-method
IMAGE CREATED CREATED BY SIZE COMMENT
062a543374fc 19 seconds ago cmd /S /C powershell New-Item c:\test 30.76 MB
Windows에서 RUN을 사용하기 위한 고려 사항
Windows에서 RUN
지시문을 exec 형식으로 사용하는 경우 백슬래시를 이스케이프해야 합니다.
RUN ["powershell", "New-Item", "c:\\test"]
대상 프로그램이 Windows 설치 관리자인 경우 실제(자동) 설치 절차를 시작하기 전에 /x:<directory>
플래그를 통해 설치를 추출해야 합니다. 다른 작업을 수행하기 전에 명령이 종료되기를 기다려야 합니다. 그렇지 않으면 아무 것도 설치하지 않고 프로세스가 조기에 종료됩니다. 자세한 내용은 아래 예제를 참조하세요.
Windows에서 RUN을 사용하는 예제
다음 예제 Dockerfile은 DISM을 사용하여 컨테이너 이미지에 IIS를 설치합니다.
RUN dism.exe /online /enable-feature /all /featurename:iis-webserver /NoRestart
이 예제에서는 Visual Studio 재배포 가능 패키지를 설치합니다.
Start-Process
및 -Wait
매개 변수는 설치 관리자를 실행하는 데 사용됩니다. 이렇게 하면 Dockerfile의 다음 명령으로 이동하기 전에 설치가 완료됩니다.
RUN powershell.exe -Command Start-Process c:\vcredist_x86.exe -ArgumentList '/quiet' -Wait
RUN 명령에 대한 자세한 내용은 RUN 참조참조하세요.
복사
COPY
명령은 파일 및 디렉터리를 컨테이너의 파일 시스템에 복사합니다. 파일과 디렉터리는 Dockerfile에 상대적인 경로에 있어야 합니다.
COPY
명령의 형식은 다음과 같습니다.
COPY <source> <destination>
원본 또는 대상에 공백이 포함된 경우 다음 예제와 같이 경로를 대괄호와 큰따옴표로 묶습니다.
COPY ["<source>", "<destination>"]
Windows에서 COPY를 사용하기 위한 고려 사항
Windows에서 대상 형식은 반드시 슬래시(/)를 사용해야 합니다. 예를 들어 유효한 COPY
지침은 다음과 같습니다.
COPY test1.txt /temp/
COPY test1.txt c:/temp/
한편 백슬라이시가 있는 다음 형식은 작동하지 않습니다.
COPY test1.txt c:\temp\
Windows에서 COPY를 사용하는 예제
다음 예제에서는 원본 디렉터리의 내용을 컨테이너 이미지의 sqllite
디렉터리에 추가합니다.
COPY source /sqlite/
다음 예제에서는 구성으로 시작하는 모든 파일을 컨테이너 이미지의 c:\temp
디렉터리에 추가합니다.
COPY config* c:/temp/
COPY
명령에 대한 자세한 내용은 COPY 참조에서 확인하세요.
더하다
ADD 명령은 COPY 명령과 비슷하지만 더 많은 기능을 제공합니다. 호스트에서 컨테이너 이미지로 파일을 복사하는 것 외에도 ADD
명령은 URL 사양을 사용하여 원격 위치에서 파일을 복사할 수도 있습니다.
ADD
명령의 형식은 다음과 같습니다.
ADD <source> <destination>
원본 또는 대상에 공백이 포함된 경우 경로를 대괄호와 큰따옴표로 묶습니다.
ADD ["<source>", "<destination>"]
Windows에서 ADD를 실행하기 위한 고려 사항
Windows에서 대상 형식은 앞슬래시를 사용해야 합니다. 예를 들어 유효한 ADD
지침은 다음과 같습니다.
ADD test1.txt /temp/
ADD test1.txt c:/temp/
한편 백슬래시가 포함된 다음 형식은 지원되지 않습니다.
ADD test1.txt c:\temp\
또한 Linux에서 ADD
명령은 복사 시 압축된 패키지를 확장합니다. 이 기능은 Windows에서 사용할 수 없습니다.
Windows에서 ADD를 사용하는 예제
다음 예제에서는 원본 디렉터리의 내용을 컨테이너 이미지의 sqllite
디렉터리에 추가합니다.
ADD source /sqlite/
다음 예제에서는 "config"로 시작하는 모든 파일을 컨테이너 이미지의 c:\temp
디렉터리에 추가합니다.
ADD config* c:/temp/
다음 예제에서는 컨테이너 이미지의 c:\temp
디렉터리에 Windows용 Python을 다운로드합니다.
ADD https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe /temp/python-3.5.1.exe
ADD
명령에 대한 자세한 내용은 ADD 참조참조하세요.
작업 디렉토리 (WORKDIR)
WORKDIR
명령은 RUN
, CMD
등의 다른 Dockerfile 명령과 컨테이너 이미지의 실행 인스턴스를 실행하기 위한 작업 디렉터리에 대한 작업 디렉터리를 설정합니다.
WORKDIR
명령의 형식은 다음과 같습니다.
WORKDIR <path to working directory>
Windows에서 WORKDIR을 사용하기 위한 고려 사항
Windows에서 작업 디렉터리에 백슬래시를 포함하는 경우 이스케이프해야 합니다.
WORKDIR c:\\windows
예제
WORKDIR c:\\Apache24\\bin
WORKDIR
명령에 대한 자세한 내용은 WORKDIR 참조를에서 확인하세요.
명령 프롬프트 (CMD)
CMD
명령은 컨테이너 이미지의 인스턴스를 배포할 때 실행할 기본 명령을 설정합니다. 예를 들어 컨테이너가 NGINX 웹 서버를 호스팅하는 경우 CMD
nginx.exe
같은 명령을 사용하여 웹 서버를 시작하는 지침을 포함할 수 있습니다. Dockerfile에 여러 CMD
명령이 지정된 경우 마지막 명령만 평가됩니다.
CMD
명령의 형식은 다음과 같습니다.
# exec form
CMD ["<executable", "<param>"]
# shell form
CMD <command>
Windows에서 CMD를 사용하기 위한 고려 사항
Windows에서 CMD
명령에 지정된 파일 경로는 슬래시를 사용하거나 \\
백슬라이스를 이스케이프해야 합니다. 다음은 유효한 CMD
지침입니다.
# exec form
CMD ["c:\\Apache24\\bin\\httpd.exe", "-w"]
# shell form
CMD c:\\Apache24\\bin\\httpd.exe -w
그러나 적절한 슬래시가 없는 다음 형식은 작동하지 않습니다.
CMD c:\Apache24\bin\httpd.exe -w
CMD
명령에 대한 자세한 내용은 CMD 참조참조하세요.
이스케이프 문자
대부분의 경우 Dockerfile 명령은 여러 줄에 걸쳐 있어야 합니다. 이렇게 하려면 이스케이프 문자를 사용할 수 있습니다. 기본 Dockerfile 이스케이프 문자는 백슬래시 (\
)입니다. 그러나 백슬래시는 Windows의 파일 경로 구분 기호이기도 하므로 이를 사용하여 여러 줄에 걸쳐 있으면 문제가 발생할 수 있습니다. 이를 해결하려면 파서 지시문을 사용하여 기본 이스케이프 문자를 변경할 수 있습니다. 파서 지시문에 대한 자세한 내용은 Parser 지시문참조하세요.
다음 예제에서는 기본 이스케이프 문자를 사용하여 여러 줄에 걸쳐 있는 단일 RUN 명령을 보여 줍니다.
FROM mcr.microsoft.com/windows/servercore:ltsc2019
RUN powershell.exe -Command \
$ErrorActionPreference = 'Stop'; \
wget https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe -OutFile c:\python-3.5.1.exe ; \
Start-Process c:\python-3.5.1.exe -ArgumentList '/quiet InstallAllUsers=1 PrependPath=1' -Wait ; \
Remove-Item c:\python-3.5.1.exe -Force
이스케이프 문자를 수정하려면 Dockerfile의 첫 번째 줄에 이스케이프 파서 지시문을 배치합니다. 이 내용은 다음 예제에서 확인할 수 있습니다.
메모
두 값만 이스케이프 문자로 사용할 수 있습니다. \
및 `
.
# escape=`
FROM mcr.microsoft.com/windows/servercore:ltsc2019
RUN powershell.exe -Command `
$ErrorActionPreference = 'Stop'; `
wget https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe -OutFile c:\python-3.5.1.exe ; `
Start-Process c:\python-3.5.1.exe -ArgumentList '/quiet InstallAllUsers=1 PrependPath=1' -Wait ; `
Remove-Item c:\python-3.5.1.exe -Force
이스케이프 파서 지시문에 대한 자세한 내용은 이스케이프 파서 지시문참조하세요.
Dockerfile의 PowerShell
PowerShell cmdlet
PowerShell cmdlet은 RUN
작업을 사용하여 Dockerfile에서 실행할 수 있습니다.
FROM mcr.microsoft.com/windows/servercore:ltsc2019
RUN powershell -command Expand-Archive -Path c:\apache.zip -DestinationPath c:\
REST 호출
PowerShell의 Invoke-WebRequest
cmdlet은 웹 서비스에서 정보 또는 파일을 수집할 때 유용할 수 있습니다. 예를 들어 Python을 포함하는 이미지를 빌드하는 경우 다음 예제와 같이 $ProgressPreference
SilentlyContinue
설정하여 더 빠른 다운로드를 달성할 수 있습니다.
FROM mcr.microsoft.com/windows/servercore:ltsc2019
RUN powershell.exe -Command \
$ErrorActionPreference = 'Stop'; \
$ProgressPreference = 'SilentlyContinue'; \
Invoke-WebRequest https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe -OutFile c:\python-3.5.1.exe ; \
Start-Process c:\python-3.5.1.exe -ArgumentList '/quiet InstallAllUsers=1 PrependPath=1' -Wait ; \
Remove-Item c:\python-3.5.1.exe -Force
메모
Invoke-WebRequest
Nano 서버에서도 작동합니다.
이미지를 만드는 동안 PowerShell을 사용하여 파일을 다운로드하는 또 다른 옵션은 .NET WebClient 라이브러리를 사용하는 것입니다. 이렇게 하면 다운로드 성능이 향상 될 수 있습니다. 다음 예제에서는 WebClient 라이브러리를 사용하여 Python 소프트웨어를 다운로드합니다.
FROM mcr.microsoft.com/windows/servercore:ltsc2019
RUN powershell.exe -Command \
$ErrorActionPreference = 'Stop'; \
(New-Object System.Net.WebClient).DownloadFile('https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe','c:\python-3.5.1.exe') ; \
Start-Process c:\python-3.5.1.exe -ArgumentList '/quiet InstallAllUsers=1 PrependPath=1' -Wait ; \
Remove-Item c:\python-3.5.1.exe -Force
메모
Nano 서버는 현재 WebClient를 지원하지 않습니다.
PowerShell 스크립트
경우에 따라 이미지를 만드는 동안 사용하는 컨테이너에 스크립트를 복사한 다음 컨테이너 내에서 스크립트를 실행하는 것이 유용할 수 있습니다.
메모
이렇게 하면 이미지 계층 캐싱이 제한되고 Dockerfile의 가독성이 저하됩니다.
이 예제에서는 ADD
명령을 사용하여 빌드 컴퓨터에서 컨테이너로 스크립트를 복사합니다. 그런 다음 RUN 명령을 사용하여 이 스크립트를 실행합니다.
FROM mcr.microsoft.com/windows/servercore:ltsc2019
ADD script.ps1 /windows/temp/script.ps1
RUN powershell.exe -executionpolicy bypass c:\windows\temp\script.ps1
Docker 빌드
Dockerfile이 만들어지고 디스크에 저장되면 docker build
실행하여 새 이미지를 만들 수 있습니다.
docker build
명령은 몇 가지 선택적 매개 변수와 Dockerfile 경로를 사용합니다. 모든 빌드 옵션 목록을 포함하여 Docker Build에 대한 전체 설명서는 빌드 참조참조하세요.
docker build
명령의 형식은 다음과 같습니다.
docker build [OPTIONS] PATH
예를 들어 다음 명령은 "iis"라는 이미지를 만듭니다.
docker build -t iis .
빌드 프로세스가 시작되면 출력은 상태를 나타내고 발생한 오류를 보고합니다.
C:\> docker build -t iis .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM mcr.microsoft.com/windows/servercore:ltsc2019
---> 6801d964fda5
Step 2 : RUN dism /online /enable-feature /all /featurename:iis-webserver /NoRestart
---> Running in ae8759fb47db
Deployment Image Servicing and Management tool
Version: 10.0.10586.0
Image Version: 10.0.10586.0
Enabling feature(s)
The operation completed successfully.
---> 4cd675d35444
Removing intermediate container ae8759fb47db
Step 3 : RUN echo "Hello World - Dockerfile" > c:\inetpub\wwwroot\index.html
---> Running in 9a26b8bcaa3a
---> e2aafdfbe392
Removing intermediate container 9a26b8bcaa3a
Successfully built e2aafdfbe392
그 결과 새 컨테이너 이미지가 생성되며, 이 예제에서는 "iis"라는 이름이 지정됩니다.
docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
iis latest e2aafdfbe392 About a minute ago 207.8 MB
windowsservercore latest 6801d964fda5 4 months ago 0 B