Docker로 ASP.NET Core Web API 배포하기

이번 포스팅에서는 Docker 컨테이너에 ASP.NET Web API Application을 배포하는 방법에 대해 써보려고 합니다.

운영체제 및 사전 준비 환경

OS는 Windows 7 64bit (Docker를 사용하시려면 64bit 운영체제는 필수입니다)
BIOS 설정에서 PC CPU 가상화 지원 기능 Enabled로 변경
Window용 Docker Toolbox 설치 (Git은 꼭 설치되어야 합니다)

만약 Docker를 처음 접하시는 분들이라면 이 동영상을 보시면 많은 도움이 될 것 같습니다~
도커 학습과 Boot2Docker

Docker Toolbox 둘러보기

Toolbox 설치를 완료하면 아래 3가지 아이콘이 보이게됩니다.
image_1
(Docker Quickstart Terminal, Oracle VM VirtualBox, Kitematic(Alpha))

빠르게 Docker 컨테이너에 ASP.NET Core Web Application 실행하기

.NET Core 설치된 컨테이너 실행

$ docker run -it --name aspnetcore -p 5050:5000 microsoft/dotnet:latest

run : 이미지를 컨테이너로 실행 (run 명령어 실행 시 이미지를 내려받은 적이 없다면 이미지를 받은 후 컨테이너 실행)
-i(interactive), -t(Pseudo-tty) : run 명령어 옵션, 실행된 컨테이너에 bash 명령을 사용할 수 있습니다.
–name : 컨테이너의 이름을 지정
-p : 포트 설정 (Host Port:Docker Container Port)

Docker Image의 Tag는 프로젝트 생성 시 사용한 .NET Core 버전을 잘 확인해서 설정하는 것이 좋습니다.
ex) .NET Core 1.1을 사용 시 → dotnet:1.1-sdk-projectjson
최신버전이라고 마냥 좋은 건 아니고 환경에 맞게 도커허브 microsoft/dotnet 사이트를 참고해서 설정하세요~

image_3

(참고)
exit 를 쳐서 빠져나갈 수 있는데, 이렇게 되면 컨테이너 실행이 중지된다. Ctrl + p,q 로 빠져나와야 컨테이너를 중지하지 않고 빠져나올 수 있다.

.NET Core Web Application 생성과 실행

mkdir myapp
cd myapp
  • myapp 폴더 생성 후 이동
dotnet new web
  • Web 프로젝트 생성

(중요)
기본적으로 Kestrel(cross-platform web server for ASP.NET Core )은 localhost(loopback interface)에서 수신 대기하도록 설정되어 있어서 .Net Application이 Docker Container 안에서 실행되는 경우 컨테이너 내부에서만 접근이 가능해진다.

이에 대한 해결책은 Program.cs에서 모든 IP Address에 대해 Listening 할 수 있도록 설정해 줘야 한다.

public static void Main(string[] args)
{
    var host = new WebHostBuilder()
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
+        .UseUrls("http://*:5000")
        .UseIISIntegration()
        .UseStartup<Startup>()
        .Build();

    host.Run();
}

(참고)

  apt-get update
  apt-get install vim
  vim Program.cs

image_4

테스트

image_5

간편한 배포를 위한 DockerFile 작성하기

DockerFile을 활용해서 배포를 하려면 아래와 같은 순서로 진행하면 된다.

  1. 가상머신에 GitHub 저장소 복제
  2. 소스코드가 있는 폴더에서 DockerFile 생성
  3. DockerFile build해서 이미지 생성
  4. 생성된 이미지를 사용하여 Docker 컨테이너 run

GitHub 저장소 복제

 git clone https://github.com/wooyoung85/TodoApi.git
 cd TodoApi/TodoApi

DockerFile 만들기

FROM microsoft/dotnet:1.1-sdk-projectjson

COPY . /myapp
WORKDIR /myapp

RUN ["dotnet", "restore"]
RUN ["dotnet", "build"]

EXPOSE 5000/tcp
ENV ASPNETCORE_URLS http://*:5000

ENTRYPOINT ["dotnet", "run"]

DockerFile 빌드하기

$ docker build -t wooyoung85/todoapi .

생성된 Image 사용하여 Docker RUN

$ docker run -it wooyoung85/todoapi --name todoapi


참고한 사이트
HOSTING .NET CORE ON LINUX WITH DOCKER - A NOOB’S GUIDE
DOCKERIZING AN ASP.NET CORE APPLICATION WITH GITHUB, DOCKER CLOUD AND AZURE