Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 4개 있습니다.)

Synology NAS(DS216+II)에 docker 설치 후 .NET Core 2.1 응용 프로그램 실행하는 방법

아쉽지만, .NET Core는 Synology NAS 버전의 리눅스는 지원하지 않습니다. 아마 누군가 포팅을 하면 되겠지만 ^^ 아직 그렇게까지는 작업이 안 된 것 같습니다. 대신 Synology NAS에서도 docker가 설치되기 때문에 docker 위에서 .NET Core 응용 프로그램을 실행하는 것은 가능합니다. 이에 대해서는 다음의 글에서 소개하고 있습니다.

How to install and use Docker on Synology
; https://blog.pavelsklenar.com/how-to-install-and-use-docker-on-synology/

How to deploy asp.net core 2.0 to synology NAS
; https://www.mysharings.com/coderblog/how-to-deploy-asp-net-core-2-0-to-synology-nas/

어디 한번 ^^ 직접 해볼까요?

다행히, 제가 가진 "DS216+II"은 Intel CPU 계열로 docker를 지원하는 모델에 포함되므로 Synology Diskstation 관리 페이지의 "패키지 센터"에 보면 다음과 같이 "docker"가 올라와 있습니다.

netcore_on_docker_on_synologynas_1.png

ipkg, opkg 등의 패키지 관리자가 아닌, 저렇게 Diskstation의 패키지 센터에서 지원해 주니 매우 쉽게 설치가 끝납니다. 물론 설치 후 Diskstation 관리 화면의 시작 메뉴에서 docker 아이콘을 선택해 GUI 화면으로 docker를 관리할 수도 있고 SSH 연결 콘솔에서 docker 명령을 이용해 관리하는 것도 가능합니다.

자, 그럼 이제 docker에 올릴 .NET Core 2.1 응용 프로그램을 담은 이미지만 준비하면 되겠군요. ^^ 테스트를 위해 간단하게 .NET Core Console 응용 프로그램만을 docker 이미지로 만든 것을,

.NET Core 콘솔 응용 프로그램을 배포(publish) 시 docker image 자동 생성
; https://www.sysnet.pe.kr/2/0/11708

사용해 보겠습니다. 위의 글에 따라 실습하면 로컬 docker에 netcore_app 이미지가 생겼을 것입니다. 그럼 이것을 파일로 저장하고,

C:\> docker save -o c:\temp\netcore_app.img netcore_app

NAS 디스크에 복사합니다. Synology에 docker가 설치되면 기본적으로 \docker 디렉터리가 하나 생성되므로 다음과 같이 네트워크 복사를 할 수 있습니다.

C:\> robocopy c:\temp \\...[NAS 주소]...\docker netcore_app.img

마지막으로 Diskstation의 관리 화면에서 docker 프로그램을 이용해 netcore_app.img를 로드할 수 있지만, 여기서는 SSH 연결로 NAS 측 docker에서 docker load로 다음과 같이 직접 실행해 봅니다.

~# docker load -i netcore_app.img
8b15606a9e3e: Loading layer [==================================================>]  58.44MB/58.44MB
e21eadb9b098: Loading layer [==================================================>]  44.23MB/44.23MB
afd643d90d06: Loading layer [==================================================>]   7.17MB/7.17MB
adce30b608bb: Loading layer [==================================================>]  74.28MB/74.28MB
27a7cfe11541: Loading layer [==================================================>]  1.536kB/1.536kB
a6eb8fcaefd7: Loading layer [==================================================>]  9.728kB/9.728kB
Loaded image: netcore_app:latest

~# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
netcore_app         latest              205ea304ca0b        8 minutes ago       180MB

~# docker run --rm -it netcore_app
Hello World!

출력 결과가 잘 나오는군요. ^^




콘솔 프로그램을 배포해 봤으니, 이제 ASP.NET Core 웹 애플리케이션도 배포해 보겠습니다. 처음부터 ASP.NET Coer 웹 응용 프로그램의 프로젝트를 생성 시 "Enable Docker Support"를 지정해 docker 이미지를 만드는 것도 가능하지만 그 옵션을 끈 프로젝트에 대해서도 다음의 글에 설명한 것에 따라,

.NET Core 콘솔 응용 프로그램을 배포(publish) 시 docker image 자동 생성
; https://www.sysnet.pe.kr/2/0/11708

Dockerfile의 내용을 다음과 같이 채워 docker 이미지를 만들 수 있습니다.

# .NET Core 2.1 기준
FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base

FROM base AS final
ARG CONFIGNAME

WORKDIR /app
COPY /bin/${CONFIGNAME}/netcoreapp2.1/publish/  .

ENV ASPNETCORE_URLS http://*:7500
EXPOSE 7500

ENTRYPOINT ["dotnet", "netcore_web.dll"]

어떤 방식으로든 docker 이미지를 만들었으면 역시 마찬가지로 내보내기 한 다음,

C:\> docker save -o c:\temp\netcore_web.img netcore_web

NAS 디스크에 복사하고,

C:\> robocopy c:\temp \\...[NAS 주소]...\docker netcore_web.img

SSH 콘솔이든,

~# docker load -i netcore_app.img

Diskstation의 docker 관리 화면이든 이용해서 이미지를 로드해 실행하면 됩니다.

docker run --rm -it -d -p 8080:7500 --name myweb netcore_web

일단 실행이 되면 "docker ps -a"를 이용해 실행 중인 container를 확인하거나 역시 Diskstation의 docker 관리 화면을 통해 다음과 같이 제어할 수 있습니다.

netcore_on_docker_on_synologynas_2.png

당연히, NAS의 주소를 이용해 웹 브라우저로 접근하면,

http://...NAS 주소...:8080/

ASP.NET Core 웹 응용 프로그램의 응답을 받을 수 있습니다.




참고로, docker load로 동일한 이름의 이미지를 로드하는 경우,

~# docker load -i netcore_web.img
7ebd9b53a052: Loading layer [==================================================>]  2.761MB/2.761MB
The image netcore_web:latest already exists, renaming the old one with ID sha256:5df6f0dcd890152230aec7e5ab075de333dd4b865fe60e16626000297e8e1f33 to empty string
Loaded image: netcore_web:latest

docker는 자동으로 기존 이미지 파일에 대해 ID 값 변경을 한 후 이름을 "<none>"으로 바꿔 버립니다. 따라서 docker load를 하기 전 기존 이미지를 docker rmi 명령어로 지우거나, 아니면 "<none>" 이름의 이미지를 때때로 "docker image prune -f" 명령어로 지우는 것이 좋습니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 10/3/2018]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 76  77  78  79  80  81  82  83  84  85  86  87  [88]  89  90  ...
NoWriterDateCnt.TitleFile(s)
11441정성태1/18/201810711오류 유형: 447. ASP.NET Core 배포 오류 - Ensure that restore has run and that you have included '...' in the TargetFrameworks for your project.
11440정성태1/17/201813146.NET Framework: 727. ASP.NET의 HttpContext.Current 구현에 대응하는 ASP.NET Core의 IHttpContextAccessor/HttpContextAccessor 사용법파일 다운로드1
11439정성태1/17/201817490기타: 69. C# - CPU 100% 부하 주는 프로그램파일 다운로드1
11438정성태1/17/201812758오류 유형: 446. Error CS0234 The type or namespace name 'ITuple' does not exist in the namespace
11437정성태1/17/201811986VS.NET IDE: 124. Platform Toolset 설정에 따른 Visual C++의 헤더 파일 기본 디렉터리
11436정성태1/16/201813674개발 환경 구성: 352. ASP.NET Core (EXE) 프로세스가 IIS에서 호스팅되는 방법 - ASP.NET Core Module(AspNetCoreModule) [4]
11435정성태1/16/201814555개발 환경 구성: 351. OWIN 웹 서버(EXE)를 IIS에서 호스팅하는 방법 - HttpPlatformHandler (Reverse Proxy)파일 다운로드2
11434정성태1/15/201814804개발 환경 구성: 350. 사용자 정의 웹 서버(EXE)를 IIS에서 호스팅하는 방법 - HttpPlatformHandler (Reverse Proxy)파일 다운로드2
11433정성태1/15/201813157개발 환경 구성: 349. dotnet ef 명령어 사용을 위한 준비
11432정성태1/11/201817112.NET Framework: 726. WPF + Direct2D + SharpDX 출력 C# 예제파일 다운로드2
11431정성태1/11/201816649.NET Framework: 725. C# - 동기 방식이면서 비동기 메서드(awaitable)처럼 구현한 사례 [9]
11430정성태1/10/201819953.NET Framework: 724. WPF + Direct2D 출력 C# 예제 [2]파일 다운로드1
11429정성태1/9/201811561개발 환경 구성: 348. ASP.NET Core 2.1 Preview 버전 적용 방법
11428정성태1/6/201813798개발 환경 구성: 347. WinForm 프로젝트를 WPF 프로젝트 유형으로 변경하는 방법파일 다운로드1
11427정성태1/5/201812247오류 유형: 445. vcpkg 빌드 오류 - Starting the CLR failed with HRESULT 80040153
11426정성태1/5/201821146오류 유형: 444. curl로 호출할 때 발생하는 오류 정리
11425정성태1/4/201811928개발 환경 구성: 346. ASP.NET Core Web Application을 IIS에서 호스팅하는 방법 (2)
11424정성태1/4/201812120개발 환경 구성: 345. ASP.NET Core 프로젝트를 명령행에서 빌드하는 방법
11423정성태1/3/201829134VC++: 123. 내가 만든 코드보다 OpenCV의 속도가 월등히 빠른 이유 [8]파일 다운로드2
11422정성태1/2/201820345.NET Framework: 723. C# - OpenCvSharp 사용 시 C/C++을 이용한 속도 향상 (for 루프 연산) [4]파일 다운로드1
11421정성태1/2/201812571오류 유형: 443. Visual Studio - nuget configuration is invalid
11420정성태12/30/201716160.NET Framework: 722. C# - Windows 10 운영체제의 데스크톱 앱에서 음성인식(SpeechRecognizer) 사용하는 방법 [3]파일 다운로드1
11419정성태12/23/201717998.NET Framework: 721. WebClient 타입의 ...Async 메서드 호출은 왜 await + 동기 호출 시 hang 현상이 발생할까요? [2]파일 다운로드1
11418정성태12/23/201726662.NET Framework: 720. 비동기 메서드 내에서 await 시 ConfigureAwait 호출 의미 [2]파일 다운로드1
11417정성태12/22/201713786.NET Framework: 719. Task를 포함하는 async 메서드의 동작 방식 [2]
11416정성태12/21/201712637.NET Framework: 718. AsyncTaskMethodBuilder.Create() 메서드 동작 방식 [2]
... 76  77  78  79  80  81  82  83  84  85  86  87  [88]  89  90  ...