ASP.NET Coreã¢ããªã±ãŒã·ã§ã³ã¯çã«ã¯ãã¹ãã©ãããã©ãŒã ã§ãããnixã§å®è¡ã§ããŸãããããã£ãŠãDockerã§ãå®è¡ã§ããŸãã Linuxã«ãããã€ããããã«ããã±ãŒãžåããNginxãšçµã¿åãããŠäœ¿çšââããæ¹æ³ãèŠãŠã¿ãŸãããã ã«ããã®äžã®è©³çްïŒ

泚ïŒHackerèªã®èšäºã®å®å
šçã®åºçç©ã·ãªãŒãºãç¶ç¶ããŸãã èè
ã®ã¹ãã«ãšå¥èªç¹ãä¿åãããŸããã
Dockerã«ã€ããŠ
ã»ãšãã©ã®äººããã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ã«ã€ããŠèããŠããŸãã ã¢ããªã±ãŒã·ã§ã³ãããŒãã«åå²ãããšããæŠå¿µã¯ããããæ°ãããã®ã§ãããšèšãããšã§ã¯ãããŸããã ããããæ°ãããã®ã¯å¿ããããŠãªãµã€ã¯ã«ãããå€ããã®ã§ãã
ã¢ãŒããã¯ãã£ã«ã€ããŠç°¡åã«èª¬æããããšãããšãWebã¢ããªã±ãŒã·ã§ã³ã¯ãµãŒãã¹ãšããå¥åã®åäžéšåã«åå²ãããŸãã ãµãŒãã¹ã¯äºãã«çŽæ¥å¯Ÿè©±ãããå
±éã®ããŒã¿ããŒã¹ããããŸããã ããã¯ãä»ã®ãµãŒãã¹ã«åœ±é¿ãäžããããšãªãåãµãŒãã¹ã倿Žã§ããããã«ããããã«è¡ãããŸãã ãµãŒãã¹ã¯ã³ã³ããã«ããã±ãŒãžåãããŠããŸãã ã³ã³ããã®äžã§ã¯ãDockerãããŒã«ãæ¯é
ããŸãã
Dockerãšã¯äœãã説æããããã«ã圌ãã¯ãã°ãã°ãä»®æ³ãã·ã³ããšããçšèªãç°¡åãªæ¹æ³ã§äœ¿çšããŸãã ééããªãé¡äŒŒæ§ã¯ãããŸãããããèšãã®ã¯ééã£ãŠããŸãã ãã®éããçè§£ããæãç°¡åãªæ¹æ³ã¯ãå
¬åŒã®dockerããã¥ã¡ã³ããŒã·ã§ã³ãã以äžã®ç»åãèŠãããšã§ãã


ã³ã³ããã¯ãçŸåšã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ã³ã¢ã䜿çšããã³ã³ãããããèªäœã«åå²ããŸãã äžæ¹ããã€ããŒãã€ã¶ãŒã䜿çšããä»®æ³ãã·ã³ã¯ããŒããŠã§ã¢ãªãœãŒã¹ã䜿çšããŸãã
ç»å/ç»åãããã³ã°ãŠã£ã³ããŠã¯èªã¿åãå°çšãªããžã§ã¯ãã§ãããå®éã«ã¯ãã³ã³ãããæ§ç¯ããããã®ãã³ãã¬ãŒããä¿åããŸãã ã³ã³ããã¯ãã³ãŒããå®è¡ãããç°å¢ã§ãã ç»åã¯ãªããžããªã«ä¿åãããŸãã ããšãã°ãå
¬åŒã®Docker Hubãªããžããªã§ã¯ã1ã€ã®ã€ã¡ãŒãžã®ã¿ããã©ã€ããŒãã«ä¿åã§ããŸãã ãã ããç¡æãªã®ã§ããã®å Žåã§ã圌ãã«æè¬ããå¿
èŠããããŸãã
æ
å ±
ã³ã³ããåã®ä»£è¡šã¯Dockerã ãã§ã¯ãããŸããã ããã«å ããŠãä»ã®æè¡ããããŸãã äŸïŒ
CoreOSã«ããrkt ïŒããã±ããããšçºé³ïŒ
Ubuntuã«ããLXD ïŒlexdiãšçºé³ïŒ
Windowsã³ã³ãããŒ-誰ãããæšæž¬ãããããšã¯ãããŸããã
çè«ã«æ
£ããŠããã®ã§ãå®è·µã«ç§»ããŸãããã
Dockerã¯å€ãã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«ã€ã³ã¹ããŒã«ã§ãããããDockerã€ã³ã¹ããŒã«ãåè§£ããæå³ã¯ãããŸããã ãã©ãããã©ãŒã çšã«Docker StoreããããŠã³ããŒãã§ããããšã®ã¿ã瀺ããŸãã Windowsã§Dockerãã€ã³ã¹ããŒã«ããå Žåã¯ãBIOSããã³OSã§ä»®æ³åãæå¹ã«ããå¿
èŠããããŸãã 10-keã§æå¹ã«ããæ¹æ³ã«ã€ããŠã¯ã次ã®èšäºãã芧ãã ããïŒWindows 10ã§ã®Hyper-Vã®ã€ã³ã¹ããŒã«
Docker察å¿ãããžã§ã¯ãã®äœæ
Dockerã¯ãã¡ããLinux補åã§ãããå¿
èŠã«å¿ããŠMacãŸãã¯Windowsçšã«éçºãããšãã«äœ¿çšã§ããŸãã Visual Studioã§ãããžã§ã¯ããäœæãããšãã«ãDockerãµããŒãã远å ããã«ã¯ã[DockerãµããŒããæå¹ã«ãã]ãã§ãã¯ããã¯ã¹ããªã³ã«ããŸãã
DockerãµããŒãã¯ãæ¢åã®ãããžã§ã¯ãã«è¿œå ã§ããŸãã ããŸããŸãªæ°ããã³ã³ããŒãã³ãã远å ãããã®ãšåãæ¹æ³ã§ããããžã§ã¯ãã«è¿œå ãããŸãã ã³ã³ããã¹ãã¡ãã¥ãŒã®è¿œå -DockerãµããŒãã
ãã·ã³ã«dockerãã€ã³ã¹ããŒã«ãããŠå®è¡ãããŠããå Žåãã³ã³ãœãŒã«ãèªåçã«éããã³ãã³ããå®è¡ãããŸã
docker pull microsoft/aspnetcore:2.0
ããã«ãããã€ã¡ãŒãžã®ããŠã³ããŒãããã»ã¹ãéå§ãããŸãã ãã®ç»åã¯ãå®éã«ã¯ç»åã®äœæå
ãšãªã空çœã§ãã ASP.NET Core 2.1ã¯ç°ãªãã€ã¡ãŒãžã䜿çšããŸã- ãã€ã¯ããœãã/ããããããïŒSDK
ãœãªã¥ãŒã·ã§ã³ã®ãããã£ã¬ã¯ããªã«ã次ã®ãã¡ã€ã«ãèªåçã«äœæãããŸãã
.dockerignoreïŒDockerã€ã¡ãŒãžãããã¡ã€ã«ãšãã£ã¬ã¯ããªãé€å€ïŒãdocker-compose.ymlïŒãã®ãã¡ã€ã«ã䜿çšããŠããã€ãã®ãµãŒãã¹ã®å®è¡ãæ§æã§ããŸãïŒãdocker-compose.override.ymlïŒè£å©æ§ædocker-composeïŒãdocker-compose.dcprojïŒ Visual Studioã®ãããžã§ã¯ããã¡ã€ã«ïŒã
Dockerfileãã¡ã€ã«ããããžã§ã¯ããã£ã¬ã¯ããªã«äœæãããŸãã å®éããã®ãã¡ã€ã«ã䜿çšããŠãç»åãäœæããŸãã ããã©ã«ãã§ã¯ïŒãããžã§ã¯ãã®ååãDockerServiceDemoã®å ŽåïŒã次ã®ããã«ãªããŸãã
FROM microsoft/aspnetcore:2.0 AS base WORKDIR /app EXPOSE 80 FROM microsoft/aspnetcore-build:2.0 AS build WORKDIR /src COPY DockerServiceDemo/DockerServiceDemo.csproj DockerServiceDemo/ RUN dotnet restore DockerServiceDemo/DockerServiceDemo.csproj COPY . . WORKDIR /src/DockerServiceDemo RUN dotnet build DockerServiceDemo.csproj -c Release -o /app FROM build AS publish RUN dotnet publish DockerServiceDemo.csproj -c Release -o /app FROM base AS final WORKDIR /app COPY --from=publish /app . ENTRYPOINT ["dotnet", "DockerServiceDemo.dll"]
.NET Core 2.0ã®åææ§æã§ã¯ãdocker buildã³ãã³ãã䜿çšããŠããã«ã€ã¡ãŒãžããã«ãããããšã¯ã§ããŸããã 1ã¬ãã«äžã®ãã£ã¬ã¯ããªããdocker-composeãã¡ã€ã«ãèµ·åããããã«æ§æãããŠããŸãã æ§ç¯ãæ£åžžã«é²ããããã«ãDockerfileãåæ§ã®å€èгã«ããããšãã§ããŸãã
FROM microsoft/aspnetcore:2.0 AS base WORKDIR /app EXPOSE 80 FROM microsoft/aspnetcore-build:2.0 AS build WORKDIR /src COPY DockerServiceDemo.csproj DockerServiceDemo.csproj RUN dotnet restore DockerServiceDemo.csproj COPY . . WORKDIR /src RUN dotnet build DockerServiceDemo.csproj -c Release -o /app FROM build AS publish RUN dotnet publish DockerServiceDemo.csproj -c Release -o /app FROM base AS final WORKDIR /app COPY --from=publish /app . ENTRYPOINT ["dotnet", "DockerServiceDemo.dll"]
äœåãªDockerServiceDemoãã£ã¬ã¯ããªãåé€ããã ãã§ããã
Visual Studio Codeã䜿çšããå Žåããã¡ã€ã«ãæåã§çæããå¿
èŠããããŸãã VS Codeã«ã¯Dockeræ¡åŒµæ©èœã®åœ¢åŒã®è£å©æ©èœããããŸãããVS Code- Dockerã®æäœããdockerãæäœããæ¹æ³ã«é¢ããããã¥ã¢ã«ãžã®ãªã³ã¯ã远å ããŸãã ã¯ããèšäºã¯è±èªã§ãããåçä»ãã§ã
Three Chords Docker
枯湟åŽåè
ãšã®æ¯æ¥ã®ä»äºã®ããã«ãã»ãã®ããã€ãã®ã³ãã³ããèŠããŠããã ãã§ååã§ãã
æãéèŠãªããŒã ã¯ããã¡ãããã€ã¡ãŒãžãæ§ç¯ããããšã§ãã ãããè¡ãã«ã¯ãbash / CMD / PowerShellã䜿çšããŠDockerfileããããã£ã¬ã¯ããªã«ç§»åããã³ãã³ããå®è¡ããŸãã
docker build -t your_image_name .
ããã§ã-tãªãã·ã§ã³ã®åŸã«ãã€ã¡ãŒãžã®ååãèšå®ãããŸãã æ³šæ-ã³ãã³ãã®æåŸã§ãã¹ããŒã¹ã®åŸã®ã¹ããŒã¹ã ãã®ãããã¯ãçŸåšã®ãã£ã¬ã¯ããªã䜿çšãããŠããããšãæå³ããŸãã ç»åã«ã¯ã¿ã°ïŒçªå·ãŸãã¯ååïŒã§ã¿ã°ãä»ããããšãã§ããŸãã ãããè¡ãã«ã¯ãååã®åŸã«ã³ãã³ãå
¥ããŠã¿ã°ãæå®ããŸãã ã¿ã°ãæå®ãããŠããªãå Žåãããã©ã«ãã§latestãšããååã§èšå®ãããŸãã ã€ã¡ãŒãžããªããžããªã«éä¿¡ããã«ã¯ãã€ã¡ãŒãžåã«ãªããžããªã®ååãå«ãŸããŠããå¿
èŠããããŸãã ãã®ãããªãã®ïŒ
docker build -t docker_account_name/image_name:your_tag .
ããã§ãyour_docker_account_nameã¯ãDockerããã¢ã«ãŠã³ãã®ååã§ãã
ãªããžããªãå«ãŸãªãããŒã«ã«åã®ã¿ã§ã€ã¡ãŒãžãäœæããå Žåã¯ã次ã®ã³ãã³ãã䜿çšããŠãæ§ç¯åŸã«å¥ã®ååã§ã€ã¡ãŒãžãããŒã¯ã§ããŸãã
docker tag image_name docker_account_name/image_name:your_tag
ããã«å€æŽãéä¿¡ããã«ã¯ã次ã®ã³ãã³ããå®è¡ããå¿
èŠããããŸãã
docker push docker_account_name/image_name:your_tag
ããã®åã«ãDockerã¢ã«ãŠã³ãã«ãã°ã€ã³ããå¿
èŠããããŸãã Windowsã§ã¯ãããã¯ã¢ããªã±ãŒã·ã§ã³UIããè¡ãããŸããã* nixã§ã¯ã次ã®ã³ãã³ãã§è¡ãããŸãã
docker login
å®éã3ã€ã®ããŒã ã§ã¯äžååã§ãã ãŸããã³ã³ããã®åäœã確èªã§ããå¿
èŠããããŸãã ã³ã³ãããèµ·åã§ããã³ãã³ãã¯æ¬¡ã®ããã«ãªããŸãã
docker run -it -p 5000:80 image_name
-itãªãã·ã§ã³ã¯æ¬äŒŒTTYãäœæããã³ã³ããã¯ãªã¯ãšã¹ãã«å¿çããŸãã ã³ãã³ããå®è¡ãããšã httpïŒ// localhostïŒ5000 /ã§ãµãŒãã¹ãå©çšå¯èœã«ãªããŸã
-p 5000ïŒ80ã¯ãã³ã³ãããŒã®ããŒã5000ããã¹ãã®ããŒã80ã«é¢é£ä»ããŸãã
ããã«ããã®ãããªã³ãã³ãããããŸãïŒ
docker ps âa
ã³ã³ããã®ãªã¹ãã衚瀺ããŸãã -aã¹ã€ããã远å ããããããçŸåšå®è¡äžã®ã³ã³ããã ãã§ãªãããã¹ãŠã®ã³ã³ããã衚瀺ãããŸãã
docker rm container_name
ãã®ã³ãã³ãã¯ãcontainer_nameãšããååã®ã³ã³ãããŒãåé€ããŸãã rm-åé€ã®ç¥
docker logs container_name
ã³ã³ãããã°ã®è¡šç€º
docker rmi image_name
image_nameãšããååã®ç»åãåé€ããŸã
ãªããŒã¹ãããã·ãµãŒããŒãä»ããã³ã³ãããŒã®èµ·å
å®éã.NET Coreã¢ããªã±ãŒã·ã§ã³èªäœã¯Kestrel WebãµãŒããŒã䜿çšããŠããŸãã ãã®ãµãŒããŒã¯å®çšŒåã«ã¯æšå¥šãããŸããã ãªãã§ïŒ ããã€ãã®èª¬æããããŸãã
IPãšããŒããå
±æããã¢ããªã±ãŒã·ã§ã³ãè€æ°ããå ŽåãKestrelã¯ãã©ãã£ãã¯ã忣ã§ããŸããã ããã«ããªããŒã¹ãããã·ãµãŒããŒã¯è¿œå ã®ã»ãã¥ãªãã£ã¬ã€ã€ãŒãæäŸããè² è·åæ£ãšSSLèšå®ãç°¡çŽ åããæ¢åã®ã€ã³ãã©ã¹ãã©ã¯ãã£ãšã®çµ±åãæ¹åããŸãã ã»ãšãã©ã®éçºè
ã«ãšã£ãŠããªããŒã¹ãããã·ãå¿
èŠãªæãéèŠãªçç±ã¯ã远å ã®ã»ãã¥ãªãã£ã§ãã
æåã«ãå
ã®Dockerfileæ§æã埩å
ããŸãã ãã®åŸãdocker-compose.ymlãã¡ã€ã«ãåŠçãããµãŒãã¹ãåç¬ã§å®è¡ããããšããŸãã ymlãã¡ã€ã«åœ¢åŒã¯ãyamlããšããŠèªã¿åããããYet Another Markup LanguageããŸãã¯ãYAML Ai n't Markup Languageãããã®ç¥èªã§ãã å¥ã®ããŒã¯ã¢ããèšèªããŸãã¯ããŒã¯ã¢ããèšèªã§ã¯ãããŸããã ã©ããããããããã¹ãŠã確å®ã§ã¯ãããŸããã
ããã©ã«ãã®docker-composeãã¡ã€ã«ã¯æ¬¡ã®ããã«ãªããŸãã
version: '3.4' services: dockerservicedemo: image: ${DOCKER_REGISTRY}dockerservicedemo build: context: . dockerfile: DockerServiceDemo/Dockerfile
docker-compose.override.ymlãã¡ã€ã«ã¯ãæ§æã«ããã€ãã®èšå®ã远å ããŸãã
ããŒãžã§ã³ïŒ '3.4'
services: dockerservicedemo: environment: - ASPNETCORE_ENVIRONMENT=Development ports: - "80"
docker-compose buildã䜿çšããŠäœæããããœãªã¥ãŒã·ã§ã³ããã«ãã§ããŸããdocker-composeupã³ãã³ããåŒã³åºããŠãã³ã³ãããŒãèµ·åããŸãã ãã¹ãŠãæ©èœããŸããïŒ ãã®åŸãæ¬¡ã®æé ã«é²ã¿ãŸãã nginx.infoãã¡ã€ã«ãäœæããŸãã æ§æã¯ãããæ¬¡ã®ããã«ãªããŸãã
worker_processes 4; events { worker_connections 1024; } http { sendfile on; upstream app_servers { server dockerservicedemo:80; } server { listen 80; location / { proxy_pass http://app_servers; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } }
ããã§ã¯ãnginxãããŒã80ïŒãªãã¹ã³80;ïŒã§ãªãã¹ã³ããããšã瀺ããŸãã ãããŠãåä¿¡ãããªã¯ãšã¹ãã¯ãdockerservicedemoã³ã³ããå
ã®ãã¹ãã®80çªç®ã®ããŒãã«ãªãã€ã¬ã¯ããããŸãã ããã«ãnginxã«æž¡ãããããŒãäŒããŸãã
nginxã§httpã䜿çšããhttpsãä»ããŠWebãµã€ãã«ã¢ã¯ã»ã¹ã§ããŸãã httpsãªã¯ãšã¹ããhttpãããã·ãééãããšããhttpsããã®å€ãã®æ
å ±ã¯httpã«æž¡ãããŸããã ãŸãããããã·ã䜿çšãããšãå€éšIPã¢ãã¬ã¹ã倱ãããŸãã ãã®æ
å ±ãããããŒã§éä¿¡ããã«ã¯ãASP.NETãããžã§ã¯ãã®ã³ãŒãã倿ŽããStartup.csãã¡ã€ã«ã®Configureã¡ãœããã®å
é ã«æ¬¡ã®ã³ãŒãã远å ããå¿
èŠããããŸãã
app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto });
ã»ãšãã©ã®ãããã·ãµãŒããŒã¯ãX-Forwarded-Forããã³X-Forwarded-ProtoããããŒã䜿çšããŸãã ãããã®ããããŒã¯ãnginxèšå®ã§ç€ºãããããã«ãªããŸããã
doker-composeæ§æã«nginxã€ã¡ãŒãžãšnginx.confãã¡ã€ã«ãå«ããŸãã YAMLã¹ããŒã¹ã®æ³šæäºé
ïŒ
version: '3.4' services: dockerservicedemo: image: ${DOCKER_REGISTRY}dockerservicedemo build: context: . dockerfile: DockerServiceDemo/Dockerfile ports: - 5000:80 proxy: image: nginx:latest volumes: - ./DockerServiceDemo/nginx.conf:/etc/nginx/nginx.conf ports: - 80:80
ããã§ãnginxã€ã¡ãŒãžãšããŠæ§æã«ãããã·ã远å ããŸãã ãã®ç»åã«å€éšèšå®ãã¡ã€ã«ãæ·»ä»ããŸãã ããªã¥ãŒã ãšåŒã°ããã¡ã«ããºã ã䜿çšããŠãã³ã³ãããã¡ã€ã«ã·ã¹ãã ã«ããŠã³ãããŸãã æåŸã«roã远å ãããšããªããžã§ã¯ãã¯èªã¿åãå°çšã§ããŠã³ããããŸãã
ãããã·ã¯ãã³ã³ãããå®è¡ãããŠãããã·ã³ã®å€éš80çªç®ã®ããŒãããªãã¹ã³ãããªã¯ãšã¹ããã³ã³ããã®å
éš80çªç®ã®ããŒãã«æž¡ããŸãã
doker-compose upã³ãã³ããå®è¡ããããšã«ããããªããžããªããnginxã€ã¡ãŒãžãæœåºãããããã·ã³ã³ãããšãšãã«ã³ã³ãããèµ·åããŸãã ããã§httpïŒ// localhostïŒ80 / nginxçµç±ã§ã¢ã¯ã»ã¹ã§ããããã«ãªããŸãã 5000çªç®ã®ããŒãã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã¯ã±ã¹ãã¬ã«ã®äžã§ããã¹ãã³ãããŸãã
Webã¢ããªã±ãŒã·ã§ã³ãžã®ãªã¯ãšã¹ãããªããŒã¹ãããã·ãééããããšã確èªããããã«ããããè¡ãããšãã§ããŸãã Chromeãã©ãŠã¶ã§éçºè
ããŒã«ãéãã[ãããã¯ãŒã¯]ã¿ãã«ç§»åããŸãã ããã§localhostãã¯ãªãã¯ããŠã[ããããŒ]ã¿ããéžæããŸãã

ãããã·ãšHTTPSãä»ããŠã³ã³ãããèµ·åããŸã
ASP.NET Core 2.1ã§ã¯ãHTTPSãµããŒããæ¹åãããŸããã
次ã®ããã«ãŠã§ã¢ã䜿çšãããšãã»ãã¥ãªãã£ã§ä¿è·ãããŠããªãæ¥ç¶ããã»ãã¥ãªãã£ã§ä¿è·ãããæ¥ç¶ã«ãªãã€ã¬ã¯ãã§ãããšããŸãã
app.UseHttpsRedirection();
次ã«ãHTTP Strict Transport Security Protocol-HSTSã䜿çšã§ããŸãã
app.UseHsts();
HSTSã¯HTTP / 2ãããã³ã«ã®æ©èœã§ããããã®ä»æ§ã¯2015幎ã«ãªãªãŒã¹ãããŸããã ãã®æ©èœã¯ææ°ã®ãã©ãŠã¶ãŒã§ãµããŒããããŠãããWebãµã€ããhttpsã®ã¿ã䜿çšããŠããããšãéç¥ããŸãã ãããã£ãŠãããŠã³ã°ã¬ãŒãæ»æã«å¯Ÿããä¿è·ãçºçãããã®éã«æ»æè
ã¯å®å
šã§ãªãhttpãããã³ã«ãžã®ç§»è¡ã䜿çšããããšã§ç¶æ³ãå©çšã§ããŸãã ããšãã°ãTLSãããŠã³ã°ã¬ãŒãããããèšŒææžã眮ãæãããããŸãã
éåžžããã®ã¿ã€ãã®æ»æã¯ãäžéè
æ»æãšçµã¿åãããŠäœ¿çšââãããŸãã HSTSã¯ããŠãŒã¶ãŒãhttpãããã³ã«ã䜿çšããŠãµã€ãã«ã¢ã¯ã»ã¹ããhttpsã«ãªãã€ã¬ã¯ãããç¶æ³ããããªããæããŸããã httpsããµããŒããããµã€ããžã®ãªã³ã¯ãå«ããããããChromeããªããŒããªã¹ãããããŸãã ä»ã®ãã©ãŠã¶ïŒFirefoxãOperaãSafariãEdgeïŒããChromeãªã¹ãã«åºã¥ããŠäœæãããhttpsãµã€ãã®ãªã¹ãããµããŒãããŠããŸãã ãããããã¹ãŠã®ãµã€ãããããã®ãªã¹ãã®ãã¹ãŠã«å«ãŸããŠããããã§ã¯ãããŸããã
Windowsã§Coreã¢ããªã±ãŒã·ã§ã³ãåããŠå®è¡ãããšãéçºè
èšŒææžãäœæããã³ã€ã³ã¹ããŒã«ãããããšã瀺ãã¡ãã»ãŒãžã衚瀺ãããŸãã ãã¿ã³ãã¯ãªãã¯ããŠèšŒææžãã€ã³ã¹ããŒã«ããããšã«ãããä¿¡é Œã§ããããã«ãªããŸãã macOSã®ã³ãã³ãã©ã€ã³ãããæ¬¡ã®ã³ãã³ãã䜿çšããŠèšŒææžã«ä¿¡é Œã远å ã§ããŸãã
dotnet dev-certs https âtrust
dev-certsãŠãŒãã£ãªãã£ãã€ã³ã¹ããŒã«ãããŠããªãå Žåãæ¬¡ã®ã³ãã³ãã§ã€ã³ã¹ããŒã«ã§ããŸãã
dotnet tool install --global dotnet-dev-certs
Linuxã§ä¿¡é Œã§ããèšŒææžã远å ããæ¹æ³ã¯ããã£ã¹ããªãã¥ãŒã·ã§ã³ã«ãã£ãŠç°ãªããŸãã
ãã¹ãç®çã§ãéçºè
ã®èšŒææžã䜿çšããŸãã CAã«ãã£ãŠçœ²åãããèšŒææžã䜿çšããã¢ã¯ã·ã§ã³ãåæ§ã§ãã ãªãã·ã§ã³ã§ãç¡æã®LetsEncryptèšŒææžã䜿çšã§ããŸãã
次ã®ã³ãã³ãã䜿çšããŠãéçºè
èšŒææžããã¡ã€ã«ã«ãšã¯ã¹ããŒãã§ããŸã
dotnet dev-certs https -ep ___.pfx
ãã¡ã€ã«ã¯ãWindowsã§ã¯ïŒ
APPDATAïŒ
/ ASP.NET / Https /ãã£ã¬ã¯ããªã«ããŸãã¯macOS / Linuxã§ã¯/root/.aspnet/https/ã«ã³ããŒããå¿
èŠããããŸãã
ã³ã³ãããèšŒææžãžã®ãã¹ãšãã®ãã¹ã¯ãŒããååŸããã«ã¯ã次ã®å
容ã®ãŠãŒã¶ãŒã·ãŒã¯ã¬ãããäœæããŸãã
{ "Kestrel":{ "Certificates":{ "Default":{ "Path": "/root/.aspnet/https/__.pfx", "Password": "___" } } } }
ãã®ãã¡ã€ã«ã¯æå·åãããŠããªãããŒã¿ãä¿åãããããéçºäžã«ã®ã¿äœ¿çšãããŸãã ãã¡ã€ã«ã¯ããããžã§ã¯ãã¢ã€ã³ã³ã®ã³ã³ããã¹ãã¡ãã¥ãŒãåŒã³åºãããLinuxã®ãŠãŒã¶ãŒã·ãŒã¯ã¬ãããŠãŒãã£ãªãã£ã䜿çšããŠãVisual Studioã§äœæãããŸãã
Windowsã§ã¯ããã¡ã€ã«ã¯ïŒ
APPDATAïŒ
\ Microsoft \ UserSecrets \ <user_secrets_id> \ secrets.jsonãã£ã¬ã¯ããªã«ä¿åãããmacOSããã³Linuxã§ã¯ã/ .microsoft / usersecrets / <user_secrets_id> /secrets.jsonã«ä¿åãããŸã
æ¬çªçšã®èšå®ãä¿åããããã«ãäžéšã®Linuxãã£ã¹ããªãã¥ãŒã·ã§ã³ã¯systemdã䜿çšããå ŽåããããŸãã ããšãã°ã次ã®ããã«ïŒ
[Service] Environment="Kestrel _ Certificates _ Default _Path=/root/.aspnet/https/__.pfx" Environment="Kestrel _ Certificates _ Default _Password=___"
次ã«ããããã·ãšã³ã³ãããŒã®ããã«ãŒæ§æã®äœæ¥ããŒãžã§ã³ãhttpsçµç±ã§ããã«æäŸããã³åæããŸãã
Docker-composeãã¡ã€ã«ïŒ
version: '3.4' services: dockerservicedemo21: image: ${DOCKER_REGISTRY}dockerservicedemo build: context: . dockerfile: DockerServiceDemo/Dockerfile override: version: '3.4' services: dockerservicedemo: environment: - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=https://+:44392;http://+:80 - ASPNETCORE_HTTPS_PORT=44392 ports: - "59404:80" - "44392:44392" volumes: - ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro - ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro proxy: image: nginx:latest volumes: - ./DockerServiceDemo/nginx.conf:/etc/nginx/nginx.conf - ./DockerServiceDemo/cert.crt:/etc/nginx/cert.crt - ./DockerServiceDemo/cert.rsa:/etc/nginx/cert.rsa ports: - "5001:44392"
ããã§ãçè§£ã§ããªãç¬éã«ã€ããŠèª¬æããŸãã ASPNETCORE_URLSã䜿çšãããšãapp.UseUrlã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ã³ãŒãã§ã¢ããªã±ãŒã·ã§ã³ããªãã¹ã³ããããŒããæå®ã§ããªããªããŸãã
ASPNETCORE_HTTPS_PORTã¯ã次ã®ã³ãŒããè¡ãããšãšåæ§ã®ãªãã€ã¬ã¯ããè¡ããŸãã
services.AddHttpsRedirectionïŒoptions => options.HttpsPort = 44392ïŒ
ã€ãŸããhttpãªã¯ãšã¹ãããã®ãã©ãã£ãã¯ã¯httpsãªã¯ãšã¹ãã®ç¹å®ã®ããŒãã«ãªãã€ã¬ã¯ããããŸãã
ããŒãã䜿çšãããšãå€éšã®59404çªç®ã®ããŒãããã®èŠæ±ã80çªç®ã®ã³ã³ãããŒã«ãªãã€ã¬ã¯ãããã44392çªç®ã®å€éšããŒããã44392çªç®ã«ãªãã€ã¬ã¯ããããããšã瀺ãããŸãã çè«çã«ã¯ããªããŒã¹ãããã·ãµãŒããŒãæ§æããŠããããããããã®ãªãã€ã¬ã¯ãã§ããŒããåé€ã§ããŸãã
ããªã¥ãŒã ã䜿çšãããšãpfxèšŒææžãšUserSecretsã¢ããªã±ãŒã·ã§ã³ãå«ããã£ã¬ã¯ããªãããã¹ã¯ãŒããšèšŒææžãžã®ãªã³ã¯ãšãšãã«ããŠã³ããããŸãã
ãããã·ã»ã¯ã·ã§ã³ã¯ã5001çªç®ã®å€éšããŒãããã®èŠæ±ã44392çªç®ã®nginxããŒãã«ãªãã€ã¬ã¯ããããããšã瀺ããŸãã ããã«ãnginxæ§æãã¡ã€ã«ãšãèšŒææžãšèšŒææžããŒãããŠã³ããããŸãã
圌ããåäžã®pfxèšŒææžãäœæããããã«ïŒãã§ã«æã£ãŠããïŒcrtããã³rsaãã¡ã€ã«ãäœæããã«ã¯ãOpenSSLã䜿çšã§ããŸãã ãŸããèšŒææžãæœåºããå¿
èŠããããŸãã
openssl pkcs12 -in ./_.pfx -clcerts -nokeys -out domain.crt
ãããŠãç§å¯éµïŒ
openssl pkcs12 -in ./_.pfx -nocerts -nodes -out domain.rsa
nginxã®æ§æã¯æ¬¡ã®ãšããã§ãã
worker_processes 4; events { worker_connections 1024; } http { sendfile on; upstream app_servers { server dockerservicedemo:44392; } server { listen 44392 ssl; ssl_certificate /etc/nginx/cert.crt; ssl_certificate_key /etc/nginx/cert.rsa; location / { proxy_pass https://app_servers; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } }
ãããã·ãµãŒããŒã¯ããŒã44392ã§ãªãã¹ã³ããŠããŸãã ãã®ããŒãã¯ã5001çªç®ã®ãã¹ãããŒããããªã¯ãšã¹ããåä¿¡ããŸãã æ¬¡ã«ããããã·ã¯ãªã¯ãšã¹ããdockerdemoserviceã³ã³ããã®44392çªç®ã®ããŒãã«ãªãã€ã¬ã¯ãããŸãã
ãããã®äŸãçè§£ããã°ãDockerããã€ã¯ããµãŒãã¹ãnginxãæäœããããã®è¯ãèæ¯ãåŸãããŸãã
ããã¯ããã«ãŒèªã®èšäºã®å®å
šããŒãžã§ã³ã§ããããšãæãåºããŸãã èè
ã¯Alexey Sommerã§ãã