사용자 고유의 웹앱을 실행하도록 Docker 이미지 사용자 지정

완료됨

Docker 허브는 사용자 고유의 컨테이너화된 앱 빌드를 시작할 수 있는 유용한 이미지 소스입니다. 필요한 기본 기능을 제공하는 이미지를 다운로드하고, 그 위에 사용자 고유의 애플리케이션을 레이어링하여 새로운 사용자 지정 이미지를 만들 수 있습니다. Dockerfile을 작성하여 이 프로세스의 단계를 자동화할 수 있습니다.

온라인 의류 매장 시나리오에 등장하는 회사는 Docker를 발판 삼아 앞으로 나아가기로 결정했습니다. 다음 단계는 웹 애플리케이션을 컨테이너화하는 가장 좋은 방법을 결정하는 것입니다. 이 회사는 ASP.NET Core를 사용하여 여러 앱을 빌드할 계획입니다. Docker Hub에 이 프레임워크를 포함하는 기본 이미지가 있다는 것을 확인했습니다. 개념 증명의 차원에서, 이 기본 이미지를 시작하고 웹 앱 중 하나의 코드를 추가하여 새로운 사용자 지정 이미지를 만들려고 합니다. 뿐만 아니라 새 웹앱 버전을 릴리스할 때마다 자동화할 수 있도록 이 프로세스를 쉽게 반복할 수 있게 만들어야 합니다.

이 단원에서는 사용자 지정 Docker 이미지를 만드는 방법과 Dockerfile을 작성하여 프로세스를 자동화하는 방법을 알아보겠습니다.

Dockerfile을 사용하여 사용자 지정 이미지 만들기

애플리케이션이 포함된 Docker 이미지를 만들려면 일반적으로 파일 및 구성 정보를 추가하는 기본 이미지를 식별하는 작업부터 시작합니다. 적합한 기본 이미지를 식별하는 프로세스는 일반적으로 Docker Hub에서 이미지 검색으로 시작됩니다. 애플리케이션 프레임워크와 Linux 배포판(예: Ubuntu 또는 Alpine)의 모든 유틸리티 및 도구를 포함하고 있는 이미지가 필요합니다. 예를 들어 컨테이너에 패키징하려는 ASP.NET Core 애플리케이션이 있는 경우 Microsoft는 이미 ASP.NET Core 런타임을 포함하고 있는 mcr.microsoft.com/dotnet/core/aspnet 이미지를 게시합니다.

기본 이미지로 컨테이너를 시작한 후 변경하여 이미지를 사용자 지정할 수 있습니다. 로컬 파일 시스템의 컨테이너에 파일을 복사하고, 다양한 도구와 유틸리티를 실행하여 코드를 컴파일하는 작업과 비슷한 변경 작업이 주를 이룹니다. 변경을 마쳤으면 docker commit 명령을 사용하여 변경 내용을 새 이미지에 저장합니다.

위의 프로세스를 수동으로 완료하려면 시간이 오래 걸리고 오류가 발생하기 쉽습니다. Bash 같은 스크립트 언어를 사용하여 스크립팅할 수도 있지만, Docker는 Dockerfile을 통해 이미지 만들기를 효율적으로 자동화하는 방법을 제공합니다.

Dockerfile은 이미지를 빌드하는 데 필요한 모든 명령이 포함된 일반 텍스트 파일입니다. Dockerfile은 이미지를 빌드하고 구성하기 위해 설계된 최소 스크립팅 언어로 작성됩니다. 이들은 기본 이미지로 시작하는 이미지를 빌드하는 데 필요한 작업을 문서화합니다.

다음 예제는 .NET Core 2.2 애플리케이션을 빌드하여 새 이미지에 패키징하는 Dockerfile을 보여 줍니다.

FROM mcr.microsoft.com/dotnet/core/sdk:2.2
WORKDIR /app
COPY myapp_code .
RUN dotnet build -c Release -o /rel
EXPOSE 80
WORKDIR /rel
ENTRYPOINT ["dotnet", "myapp.dll"]

이 파일에서 다음 작업이 수행됩니다.

명령 작업
FROM 지정된 이미지를 다운로드하고 이 이미지를 기반으로 새 컨테이너를 만듭니다.
WORKDIR 후속 명령에 사용되는 컨테이너의 현재 작업 디렉터리를 설정합니다.
복사 호스트 컴퓨터에서 컨테이너로 파일을 복사합니다. 첫 번째 인수(myapp_code)는 호스트 컴퓨터의 파일 또는 폴더입니다. 두 번째 인수(.)는 컨테이너에서 대상 역할을 하는 파일 또는 폴더의 이름을 지정합니다. 이 예에서는 대상이 현재 작업 디렉터리입니다(/app).
실행 컨테이너에서 명령을 실행합니다. RUN 명령의 인수는 명령줄 명령입니다.
EXPOSE 새 이미지에서 컨테이너를 실행할 때 열 포트를 지정하는 구성을 만듭니다. 컨테이너가 웹앱을 실행하는 경우 포트 80을 노출하는 것이 일반적입니다.
ENTRYPOINT 컨테이너를 시작할 때 실행해야 하는 작업을 지정합니다. 이 예제에서는 새로 빌드된 앱을 실행합니다. 실행할 명령과 각 인수를 문자열 배열로 지정합니다.

규칙에 따라, Docker 이미지로 패키징할 애플리케이션의 Dockerfile은 일반적으로 소스 코드의 루트에 있으며 이름은 거의 항상 Dockerfile입니다.

docker build 명령은 Dockerfile을 실행하여 새 이미지를 만듭니다. 이 명령의 구문에는 다음과 같은 매개 변수가 있습니다.

  • -f 플래그는 사용할 Dockerfile의 이름을 나타냅니다.
  • -t 플래그는 만들려는 이미지의 이름(이 예에서는 myapp:v1)을 지정합니다.
  • 마지막 매개 변수인 .COPY 명령의 원본 파일에 대한 빌드 컨텍스트, 즉, 빌드 프로세스 중에 필요한 호스트 컴퓨터의 파일 세트를 제공합니다.
docker build -t myapp:v1 .

내부적으로 docker build 명령은 컨테이너를 만들고, 컨테이너 안에서 명령을 실행한 다음, 변경 내용을 새 이미지로 커밋합니다.