>> 이전 글 참조: Docker로 ASP.NET Core SDK 3.1 앱 배포 |
Docker로 ASP.NET Core 앱을 만들때 보통 호스트 포트와 ASP.NET Core 컨테이너 서비스 포트를 매핑한다.
5000:80, 5001:443 이런 식으로.
docker-compose를 사용할 때는 아래와 같은 설정파일을 사용했다.
[docker-compose.yml]
version: '3.1'
...
services:
aspnetcore-app:
container_name: aspnetcore-app
image: mcr.microsoft.com/dotnet/core/aspnet:3.1-bionic
ports:
- 5000:80
- 5001:443
volumes:
- ./publish/:/app/
- ./appsettings.Docker.json:/app/appsettings.json
- ./logs/:/app/logs/
working_dir: /app
entrypoint:
- dotnet
- AspnetCore.App.dll
그런데, 이 설정만으로는 HTTPS 서비스를 사용할 수 없다. (443이나 5001 포트로 접속해 봐도 접속이 안된다.)
물론, Startup.cs에 services.AddHttpsRedirection(); 및 services.AddHsts(); 도 넣어놔도 마찬가지.
문제는 ASP.NET Core 서비스가 HTTPS를 사용하겠다는 설정이 없는 것인데,
아래 사이트에 해결책이 나와 있다.
바로, appsettings.json 파일에 https_port를 명시적으로 넣어주거나,
ASPNETCORE_HTTPS_PORT 환경변수를 작성하는 방법이 그것이다.
그런데, 이것이... 좀 골치 아프다.
위 참조 사이트도 그렇지만, 인터넷 사이트마다 설정 방법이 조금씩 다르거나 틀리게 되어 있어 제대로 설정하기가 쉽지 않다. 직접 이렇게 저렇게 시행착오를 겪어야 하는데... 바로 잡을 겸 기록을 남겨 본다.
>> 올바른 사용법 참조: https://docs.microsoft.com/en-us/aspnet/core/security/docker-compose-https?view=aspnetcore-3.1
1. 개발/테스트용 인증서 발급
D:\Docker> dotnet dev-certs https -ep aspnetcore.pfx -p pwd1234! |
(이렇게 하면 mmc 인증서-개인 항목에 localhost라는 인증서가 추가된다. aspnetcore.pfx 파일과 동일하다.)
2. 로컬 컴퓨터 루트 인증서 신뢰 처리
D:\Docker> dotnet dev-certs https -c D:\Docker> dotnet dev-certs https -t |
(-c는 --clean과 동일한 옵션이고, -t는 --trust와 동일한 옵션이다.)
3. docker-compose 설정 파일 수정
[docker-compose.yml]
version: '3.1'
...
services:
aspnetcore-app:
container_name: aspnetcore-app
image: mcr.microsoft.com/dotnet/core/aspnet:3.1-bionic
ports:
- 5000:80
- 5001:443
volumes:
- ./publish/:/app/
- ./appsettings.Docker.json:/app/appsettings.json
- ./logs/:/app/logs/
- ./aspnetcore.pfx:/app/aspnetcore.pfx
working_dir: /app
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=https://+:443;http://+:80
- ASPNETCORE_HTTPS_PORT=5001
- ASPNETCORE_Kestrel__Certificates__Default__Password=pwd1234!
- ASPNETCORE_Kestrel__Certificates__Default__Path=/app/aspnetcore.pfx
entrypoint:
- dotnet
- AspnetCore.App.dll
먼저, volumes 부분에 위에서 생성한 인증서 파일을 Docker 컨테이너 내부로 매핑해서 넣어준다. (실제 파일을 복사해 넣어 주는 것보다 이렇게 volume 매핑을 해 주는 것이 훨씬 편리하다.)
다음으로는 환경변수 environment 부분에 ASPNETCORE_ 로 시작하는 환경변수 5개를 넣어준다.
절대로 환경변수 값에 따옴표(") 같은 것을 쓰지 않는다! 이것이 핵심.
그리고, 외부 호스트에서 테스트할 때는 https://localhost:5001/ 로 접속해야 하므로 ASPNETCORE_HTTPS_PORT를 443이 아닌 5001로 설정해 주는 것이 두 번째 핵심이 되겠다. (HSTS 설정에 의해 http://localhost:5000/ 으로 접속하면 자동으로 https://localhost:5001/ 로 redirection 된다.)
4. Docker 컨테이너 구동
D:\Docker> docker-compose up -d |
(-d 옵션을 빼면 콘솔창에 디버깅 메시지가 실시간으로 쭈욱 올라온다. 오류를 발견해야 할 때 사용하면 편리하다.)
끝.
'Tech: > Server·IIS' 카테고리의 다른 글
Windows Server Core 유용한 팁 (0) | 2020.07.09 |
---|---|
Exchange EdgeSync 인증서 교체 (0) | 2020.06.25 |
Docker로 ASP.NET Core SDK 3.1 앱 배포 (0) | 2020.04.22 |
vs2017에서 ASP.NET Core Docker 컨테이너 배포 (2/2) (0) | 2020.04.10 |
vs2017에서 ASP.NET Core Docker 컨테이너 배포 (1/2) (0) | 2020.04.09 |