Synology docker로 asp.net core 배포하기

Synology 2019.11.05 댓글 Plorence

시놀로지 환경

반드시 docker를 지원하는 시놀로지 모델을 사용하셔야 합니다.

저는 DS218+을 사용하였습니다.

빌드 환경

Windows 10 64bit

Visual Studio 2019(asp.net core 설치해야 함.)

Docker

 

프로젝트 생성

  1. 프로젝트 생성
  2. 새 ASP.NET Core 웹 애플리케이션 선택
  3. 이름, 경로 설정하고 "솔루션 및 프로젝트를 같은 디렉터리에 배치"  체크 해제 후 만들기
  4. 아무거나 선택 후 위쪽에 .NET Core 버전 설정 후 오른쪽에 Docker 지원 사용 -> Linux 선택
  5. 만들기

(.NET Core 2.1, MVC를 사용하였습니다.)

 

처음 프로젝트 로딩할 때 빌드하는데, 도커까지 빌드됩니다.

도커 빌드 중에 에러가 뜨는데, 프로젝트만 성공적으로 빌드된다면 배포 가능합니다.

 

도커 빌드를 위한 프로젝트 설정

프로젝트 폴더에 있는 Dockerfile을 솔루션 파일이 위치한 곳으로 복사합니다.

C:\Users\John\source\repos\WebApplication1\WebApplication1\Dockerfile
->
C:\Users\John\source\repos\WebApplication1\Dockerfile

그다음 솔루션 폴더에서 쉽게 빌드하기 위해 PowerShell을 작성합니다.

docker rmi $(docker images -f "dangling=true" -q)
#캐시 이미지 삭제
docker build --force-rm=false --no-cache=false --rm=true -t __PROJECT__:__TAG__ .
#Dockerfile를 이용해 빌드
docker save -o __PROJECT__.img __PROJECT__:__TAG__
#생성된 이미지를 .img 파일로 저장
docker image rm -f __PROJECT__:__TAG__
#도커에 이미지 삭제
docker rmi $(docker images -f "dangling=true" -q)
#캐시 이미지 삭제

__PROJECT__는 asp.net core 프로젝트 이름이고, __TAG__는 도커 버전에 쓰일 태그입니다.

이때 __PROJECT__:__TAG__처럼 둘다 같이 쓰이는 경우에는 모두 소문자여야 합니다.

파일명은 publish.ps1으로 하고 솔루션 폴더에 위치하도록 지정했습니다.

publish.ps1를 실행해 빌드가 끝났으면 이미지가 생성됩니다.

 

시놀로지 도커에 이미지 올리기

적절한 공유 폴더에 이미지를 업로드합니다.

Docker 이미지 탭

도커 이미지 탭으로 들어가서 추가 -> 파일에서 추가에서 아까 업로드한 이미지를 선택합니다.

추가가 되었으면 이미지를 더블클릭하여 컨테이너를 만듭니다.

창이 하나 열렸으면 고급 설정 버튼을 클릭합니다.

도커 컨테이너 생성에서 고급 설정

포트 설정에서 로컬, 컨테이너 포트 둘 다 입력해줍니다.

저는 5124로 접속할 거니 이렇게 해줬습니다.

asp.net core에서 5124로 열리도록 환경도 바꿔줍니다.

그다음 적용하면 컨테이너가 만들어지면서 자동으로 시작됩니다.

도커 컨테이너 로그

컨테이너 탭에서 만든 컨테이너를 더블클릭하고, 로그 탭에 가보면 아래와 같은 로그가 있습니다.

Now listening on: http://[::]:5124

 

공유기 설정

외부에서 접속할 거니까 당연히 포트 포워딩을 해야 합니다.

이건 공유기마다 방법이 다르므로 생략하겠습니다.

 

특정 도메인으로 접속 시 리다이렉션(리디렉션) 시켜주기

이쯤 왔으면 http://외부아이피:포트/ 로 접속이 되어야 합니다.

역방향 프록시를 통해 리다이렉션 시켜줘야 합니다.

제어판 -> 응용 프로그램 포털 -> 역방향 프록시

여기서 생성 버튼을 눌러줍니다.

http://test.com:5124/으로 들어오면 http://localhost:5124/으로 리다이렉션 시켜줍니다.

 

마무리하며

빌드 편하게 하려고 프로젝트에서 빌드 후 이벤트를 지정해서 docker build 하면 문제가 생깁니다.

그 이유는 Dockerfile내에서 프로젝트를 빌드하는데, 이 과정에서 빌드 후 이벤트도 처리하기 때문입니다.

Dockerfile과 publish.ps1는 한번 만들어놓으면 크게 변경할 일은 없으니 이렇게 쓰시면 됩니다.

예제를 통해 배포된 사이트는 여기서 확인할 수 있습니다.

(멋이 안나서 .NET core 3으로 변경후 했습니다.)

댓글