「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-戻る
--[[Visual Studio]]
--[[Docker for Windows]]
--[[Hyper-V コンテナ]]
--[[ASP.NET Core]]
---[[ASP.NET Coreの開発]]
---[[ASP.NET Coreのデプロイ]]

* 目次 [#i04718e7]
#contents

*概要 [#z33068ce]
-[[Hyper-V コンテナ]](若しくはMicrosoft Azure Containers)~
'+ [[Docker for Windows]]を使用して、[[ASP.NET Core]]のデバッグ実行が可能。

-[[ASP.NET Coreの開発]]や[[ASP.NET Coreのデプロイ]]を考えていてココに行き着いた。

*手順1 [#ed1a49b7]
以下の手順で検証・評価した。

**環境 [#f9c27a4b]
-Win 10 Pro
-Hyper-Vの有効化
-.NET Core 2.0
-VS 2017 Community

**プロジェクトの作成 [#m5187e0f]
[[ASP.NET Core MVC]]アプリケーションの作成
-[[Docker>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker]]サポートなし
-認証なし

**プロジェクトの設定 [#tf9569f1]
-プロジェクトを作成した後にプロジェクトを右クリックして[[Docker>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker]]サポートを追加

#ref(1.png,left,nowrap,手順1,60%)

-[[Hyper-V コンテナ]]上で動作するOS(Windows or Linux)を選択(ここではLinuxを選択)。

#ref(2.png,left,nowrap,手順2,60%)

**インストレーション [#d15a687c]
-[[Docker for Windows]]のインストール(ダウンロードに少々時間がかかる)

#ref(3.png,left,nowrap,手順3,60%)

-[[Docker for Windows]]のインストール・ウィザード~
([[Docker>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker]] ≒ Linuxコンテナなので下のCheck Boxは外しておく)


#ref(4.png,left,nowrap,手順4,60%)

-[[Docker for Windows]]のインストール完了

#ref(5.png,left,nowrap,手順5,60%)

**デバッグ実行の準備 [#n341b221]
-デバッグのドロップダウン・リストから[[Docker>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker]]を選択した状態でデバッグ実行しようとすると、以下のエラー・メッセージが表示されるが、~
[[Docker CE for Windows(Docker Community Edition for Windows)>Docker for Windows]]はインストール済みであるので、PCの再起動を行ってみる。

#ref(6.png,left,nowrap,手順6,60%)

-再起動後、[[Hyper-V]]上にLinux VMを確認できる(MobyLinuxVM)。

#ref(7.png,left,nowrap,手順7)

-再度デバッグ実行を行うと、以下のエラー・メッセージが表示される。

#ref(8.png,left,nowrap,手順8,60%)

-エラー・メッセージが以下のように変更される([[Docker>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker]]が実行されていないとのこと)。

#ref(9.png,left,nowrap,手順9,60%)

-暫く経つと、以下のダイアログが表示された。~
OKを押下して再起動する(再起動に少々時間がかかる)。

#ref(10.png,left,nowrap,手順10,60%)

-再起動を行うと、以下のダイアログボックスが表示される~
(なお、ココでサインアップ・サインインはしなくてもイイ)。

#ref(11.png,left,nowrap,手順11,60%)

-この時点で、以下のdockerコマンドをcmdから実行すると、~
dockerコマンドが適切に実行され結果が返り、[[Docker>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker]](のクライアント)が実行されていることを確認する。
 > docker version
 > docker run hello-world

-デバッグ実行を開始すると、以下のcmdが起動し「何か」がダウンロードされ、
#ref(12.png,left,nowrap,手順12,60%)

>※ 後々、「from microsoft/aspnetcore」でググって、~
コンパイル済みのASP.NET Coreアプリケーションを実行するための~
公式のDocker Imageをダウンロードしていたことが解った。~
https://hub.docker.com/r/microsoft/aspnetcore/

-次いで、以下のエラー・メッセージが表示されるので、

#ref(13.png,left,nowrap,手順13,60%)

-メッセージ通り、[[Docker for Windows]]の設定で、ボリューム共有を有効にする。~
[[Docker for Windows]]の画面はタスクトレイ (Task tray) から起動する。
#ref(14.png,left,nowrap,手順14,60%)

-管理者アカウントのCredentialの入力を求められるので入力を行う。

-設定完了後、再度デバッグ実行を行うと、以下のダイアログが表示されるので、~
[アクセスを許可する]ボタンを押下し、VPNKitと言う組込みVPNツールのリスニング・ポートを開放する。

#ref(15.png,left,nowrap,手順15,60%)

-これにより、アプリケーションが[[Hyper-V コンテナ]]内の[[Docker>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker]](Linuxコンテナ)で起動し、デバッグが開始される。

**ブレークポイントを設定してデバッグ実行する。 [#vf5605d5]
-ここまでの手順で、ソリューションに「docker-compose」が追加されているのを確認する。

-この「docker-compose」が、スタートアップ・プロジェクトに設定されていることを確認する。

-デバッグ実行を開始する(ドロップダウン・リストに「Docker」が選択されていることを確認する)。

-ブレークポイントを設定して実行すると、~
以下のように、適切にデバッグ実行されていることを確認できる。

#ref(16.png,left,nowrap,手順16,60%)

-本当にLinux上で動いているか心配なので、念のため、以下で確認する。

#ref(17.png,left,nowrap,手順17,60%)

*手順2 [#b6ded901]
より実践的な開発環境を構成する。

-[[Docker>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker]]側は、
--Webサーバ:[[Kestrel>ASP.NET CoreのWebサーバ#c9a915ba]]で動作する。
--DB:ホスト側のDBで動作させたい。

-後者のDBへのアクセスが可能かどうかDBMSアプリケーションを使用して確認する。~
(DBMSアプリケーションとしては、[[ASP.NET Core]]対応されたOpen棟梁テンプレートを使用する。)

**設定ファイル読み込み方法の変更 [#ba0a8f8a]
-早速エラーが発生。DBアクセス以前に設定ファイルへのアクセスができない。

#ref(18.png,left,nowrap,手順18,60%)

-以下のように調査すると、プロジェクト内のファイルがカレント・ディレクトリ(/app)にデプロイされることが解る。

#ref(19.png,left,nowrap,手順19,60%)

-従って、

--プロジェクト内にファイルを配置し、~
(「リンクとして追加」の設定はNG、「出力ディレクトリにコピー」の設定は不要)~
これを読み取る方向性で対応するか、

--旧Azure PaaS時と同様に、埋め込まれたリソースで対応できる。~
設定の仕方は、以下の「Azure Web Apps」で動作させる方法が参考になる。

---Open 棟梁の使い方(実践編)第6回 - OSSコンソーシアム~
https://www.osscons.jp/joywo3d7c-537/#_537

**SQL Serverへの接続 [#c4bc07f4]
ホスト側のDBで動作させようとしたが、ハマりどころが多かったのでメモ。

***接続文字列 [#ra8d82e2]
-ホストのIPアドレスは、10.0.75.1になる。
-Windows認証ではなく、SQL Server認証の接続文字列を使用する。

***Windows ファイアウォール [#ife7d378]
-必要時応じて設定する。
-OFFにして通ったら絞るのがイイ。

***SQL Server 構成マネージャー [#x62264bc]
Expressの場合は、SQL Server 構成マネージャーの設定も必要にある。

***参考 [#u033342c]
-[[つながらない! - SQL Server Express>つながらない!#d663cac3]]
-networking - How to connect to docker host from container on Windows 10 (Docker for Windows) - Stack Overflow~
https://stackoverflow.com/questions/40746453/how-to-connect-to-docker-host-from-container-on-windows-10-docker-for-windows?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

***変更点のスクショ [#qf813bc4]
以下は、[[ASP.NET Core MVC]]のOpen棟梁テンプレートの変更点のスクショです。
#ref(20.png,left,nowrap,手順20,60%)

*手順3 [#kecabd32]

**概要 [#rdf702b5]
-Webサーバを、[[Kestrel>ASP.NET CoreのWebサーバ#c9a915ba]]から[[nginx>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?nginx]]に変更する。
- Docker Hubから、[[ASP.NET Core]] + [[nginx>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?nginx]]の~
イメージ・ファイルを取得する(「nginx:latest」と「aspnetcore:latest」)。
-上記の2つのコンテナを作成を・管理する場合、docker-composeを利用する。

**初期設定 [#y5817faa]
[[手順1>#ed1a49b7]]と同じ。

**[[Kitematic>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Kitematic]]のインストール [#j09d8d0f]
-[[Kitematic>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Kitematic]]はGUIの[[Docker>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker]]管理ツール。

-Windows環境からは、以下のように[[Docker for Windows]]の~
タスクトレイ (Task tray) の Context Menu からダウンロードする。
#ref(21.png,left,nowrap,手順21,60%)
#ref(22.png,left,nowrap,手順22,60%)

-インストールはzip解凍でOK。

-解凍フォルダのexeを起動する。

**Update-Package [#z1c08310]
Update-Packageを実行する。

**ポートを固定する。 [#u9fb8311]
Program.csに以下の行を追加する。

 public static IWebHost BuildWebHost(string[] args) =>
     WebHost.CreateDefaultBuilder(args)
         .UseStartup<Startup>()
         .UseUrls("http://*:5000/") // ← ココを追加
         .Build();

**Dockerfileファイルの作成 [#qc6a4421]
Dockerfileファイル(Dockerfile)の作成

-[[ASP.NET Core]]~
***[[ASP.NET Core]] [#p52600f8]
既定のファイルを修正
 FROM microsoft/aspnetcore:latest 
 #WORKDIR /app
 #COPY publish .
 #ENV ASPNETCORE_URLS http://+:5000
 #EXPOSE 5000
 #ENTRYPOINT ["dotnet", "xxxx.dll"]
-2.0 ---> latestと変更
-以下の[[Kestrel>ASP.NET CoreのWebサーバ#c9a915ba]]のポートの設定を追加
 ENV ASPNETCORE_URLS http://+:5000
 EXPOSE 5000

-[[nginx>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?nginx]]
 FROM microsoft/aspnetcore:latest AS base
 WORKDIR /app
 ENV ASPNETCORE_URLS http://+:5000
 EXPOSE 5000
 
 FROM microsoft/aspnetcore-build:latest AS build
 WORKDIR /src
 COPY WebApplication1.sln ./
 COPY WebApplication1/WebApplication1.csproj WebApplication1/
 RUN dotnet restore -nowarn:msb3202,nu1503
 COPY . .
 WORKDIR /src/WebApplication1
 RUN dotnet build -c Release -o /app
 
 FROM build AS publish
 RUN dotnet publish -c Release -o /app
 
 FROM base AS final
 WORKDIR /app
 COPY --from=publish /app .
 ENTRYPOINT ["dotnet", "WebApplication1.dll"]

***[[nginx>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?nginx]] [#z2d69a4c]
 FROM nginx:latest
 COPY default.conf /etc/nginx/conf.d/default.conf

**設定ファイルの追加 [#lc233d2b]
**nginx設定ファイルの追加 [#lc233d2b]
nginxフォルダにdefault.confを作成する。

-[[既定値>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?nginx%E3%81%A7ASP.NET%20Core%E3%82%92%E3%83%9B%E3%82%B9%E3%83%88%E3%81%99%E3%82%8B#nb5838f0]]
 server {
     listen        80;
     server_name   example.com *.example.com;
     server_name localhost;
     location / {
         proxy_pass         http://localhost:5000;
         proxy_http_version 1.1;
         proxy_set_header   Upgrade $http_upgrade;
         proxy_set_header   Connection keep-alive;
         proxy_set_header   Host $http_host;
         proxy_cache_bypass $http_upgrade;
     }
 }

-・・・
-
 server{
      listen 80;
      server_name xxx.xxx.xxx.xxx;
      location / {
          proxy_pass http://sampleapp:5001;
          proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
          proxy_redirect off;
          proxy_buffering off;
          proxy_set_header Host xxx.xxx.xxx.xxx;
          proxy_set_header X-RealIP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      }
  }
     listen 80;
     server_name 192.168.50.10;
     location / {
         proxy_pass http://sampleapp:5000;
         proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
         proxy_redirect off;
         proxy_buffering off;
         proxy_set_header Host 192.168.50.10;
         proxy_set_header X-RealIP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     }
 }

**Docker Composeファイルの作成 [#n1298d50]
Docker Composeファイル(docker-compose.yml)の作成

-例1
 version: '3'
 services:
   proxy:
     image: proxy
   webapplication1:
     image: webapplication1
     build:
       context: .
       dockerfile: /WebApplication1/Dockerfile

***例1 [#nfeb9f38]
 version: '3'
 services:
   nginx-proxy:
     image: nginx-proxy
     build:
       context: ./nginx
       dockerfile: Dockerfile
     ports:
       - "8888:80"
     links:
       - sampleapp
   sampleapp:
     image: sampleapp
       - webapplication1
   webapplication1:
     image: webapplication1
     build:
       context: ./SampleApp
       context: ./WebApplication1
       dockerfile: Dockerfile

-例2
***例2 [#e8608eb1]
 version: '3'
 services:
   proxy:
   nginx-proxy:
     image: nginx:latest
     ports:
       - "8888:80"
     links:
       - "sampleapp"
       - "webapplication1"
     volumes:
       - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
       - ./sampleapp/publish/wwwroot:/usr/share/nginx/html/wwwroot
   sampleapp:
     image: sampleapp
       - ./xxxx/publish/wwwroot:/usr/share/nginx/html/wwwroot
   webapplication1:
     image: webapplication1
     build:
       context:  ./SampleApp
       context: ./WebApplication1
       dockerfile: Dockerfile

-補足
--特に、設定が必要なければbuildはサボってimageをそのまま利用可能。
--buildをする場合、contextとdockerfileを指定する。
--dockerfileには様々な設定が可能。
--volumesでホストのディレクトリをマウントするで、~
***補足 [#vb26db57]
-dockerfileには様々な設定が可能。

--dockerfileを使用する場合、~
buildにcontextとdockerfileを指定する。

--dockerfileが必要ない場合、~
buildはサボってimageをそのまま利用することも可能。

-volumesでホストのディレクトリをマウントするで、~
再デプロイせずにローカルファイルの変更を反映できる。

*手順4 [#kecabd32]
[[手順3>#kecabd32]]に3つ目の、PostgreSQLのコンテナを追加してみる。

*余談 [#hd149d34]

**PDBのタイプ [#o8d9c85e]
[[Docker>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker]]側でライブラリのデバッグをする場合、ライブラリのPDBが、~
「完全(full)」ではなくて、「ポータブル(portable)」である必要がある。

*参考 [#x2d9b382]

-c# - Remote debugging asp.net core on linux server - Stack Overflow~
https://stackoverflow.com/questions/42483122/remote-debugging-asp-net-core-on-linux-server

-Windows 10 に Docker for Windows をインストール|No IT No Life - おすぎやん サーバの設計・構築~
https://server-network-info.blogspot.jp/2017/09/windows-10-docker-for-windows.html

**Microsoft Docs [#t0c26e72]
-Visual Studio Tools for Docker と ASP.NET Core~
https://docs.microsoft.com/ja-jp/aspnet/core/host-and-deploy/docker/visual-studio-tools-for-docker

-Visual Studio Tools for Docker (Windows 上の Visual Studio) を使用~
https://docs.microsoft.com/ja-jp/dotnet/standard/containerized-lifecycle-architecture/design-develop-containerized-apps/visual-studio-tools-for-docker
--ローカルの Docker コンテナーでアプリをデバッグする~
https://docs.microsoft.com/ja-jp/azure/vs-azure-tools-docker-edit-and-refresh
--リモート Docker ホストへの ASP.NET Core Linux Docker コンテナーのデプロイ~
https://docs.microsoft.com/ja-jp/azure/vs-azure-tools-docker-hosting-web-apps-in-docker

**きよくらの備忘録 [#k372b16f]
-Docker for Windowsを使用したASP.NET Core のデバッグ実行~
http://kiyokura.hateblo.jp/entry/2016/10/19/225243

**ONE-RUN [#o9a46b3d]
-Docker for Windowsをインストールする~
https://st40.xyz/one-run/article/314/
-Dockerでよく利用するコマンドまとめ~
https://st40.xyz/one-run/article/317/
-Dockerでnginx + ASP.NET Core 2.0のWebサーバ環境を構築する~
https://st40.xyz/one-run/article/318/

**銀の光と碧い空 [#b34aa8fb]
-Visual Studio Tools for Docker が ASP.NET CoreのDockerデバッグ実行している仕組みを追ってみた~
http://tech.tanaka733.net/entry/research-docker-debug-in-visual-studio-tools-for-docker

-Visual Studio から AzureやWindows以外のdocker containerで走るASP.NET Core をリモートデバッグする~
http://tech.tanaka733.net/entry/remote-debug-aspnetcore-on-docker-from-visual-studio

-VisualStudio 2017 RC3 から .NET Core on RHEL にリモートデバッグする~
http://tech.tanaka733.net/entry/remote-debug-dotnetcore-on-rhel-from-vs2017rc3

-.NET Core がLinuxでどのように動いているか、~
またわれわれはどのようにデバッグするのか~
Issue #8 · uzulla/y8-2017-spring-talks~
https://github.com/uzulla/y8-2017-spring-talks/issues/8

--https://www.youtube.com/watch?v=omgHW1Rcl18&index=8&list=PLqyYlv12JxkTzXvHqCLk0LmlQXSYzKXIu
--https://onedrive.live.com/view.aspx?resid=B266A6B27EC808AC!260058&ithint=file%2cpptx&app=PowerPoint&authkey=!ALbzXlWLJJkbbwA

----
Tags: [[:.NET開発]], [[:.NET Core]], [[:Hyper-V]], [[:仮想化]]

192.168.50.10


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS