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

-戻る
--[[Visual Studio]]
--[[Docker for Windows]]
--[[ASP.NET Core]]
---[[ASP.NET Coreのデプロイ]]

* 目次 [#i04718e7]
#contents

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

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

-運用環境へのデプロイについては、専任のエンジニアに相談する必要があるものと思われれる。

**前提環境 [#ke8e67e9]
-Win 10 Pro
-Hyper-Vの有効化
-[[Docker for Windows]]

-.NET Core 2.0
-VS 2017 Community
-VS 2017 Community~
(VS 2019以降は[[Visual Studio Kubernetes Tools>Visual Studio Kubernetes Tools#t12636eb]]を参照)

**インストール [#b8b286e6]
-[[Docker for Windows]]
-Visual Studio Tools for Docker~
https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vs-containers-tools-extensions

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

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

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

-プロジェクトを作成した後にプロジェクトを右クリックして[[Docker>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker]]サポートを追加~
([[VS2019 では、「コンテナー オーケストレーター」を選択。>#z92ecb75]])
#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/
  コンパイル済みの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]

***設定の確認 [#j40599c4]
-ここまでの手順で、ソリューションに「docker-compose」が追加されているのを確認する。

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

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

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

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

-本当にLinux上で動いているか心配なので、念のため、確認する。~
※ [[確認方法>WSL上での.NET Core開発#j5258403]]
#ref(17.png,left,nowrap,手順17,60%)

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

*手順2 [#b6ded901]

-より実践的な開発環境を構成したい。
--Webサーバ:[[Docker>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker]]側の[[Kestrel>ASP.NET CoreのWebサーバ#c9a915ba]]で動作する。
--DB:ホスト側のDBで動作する。

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

※ 平たく言って、Open棟梁テンプレートをDockerで動かす。

**設定ファイル読み込み方法の変更 [#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になる。

--[[Docker Desktop 2.2.0 から 10.0.75.1 は使用できなくなっている。>Docker for Windowsのネットワーク設定#o0ae51ae]]

-Windows認証ではなく、SQL Server認証の接続文字列を使用する。

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

***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]

**概要 [#cfec2a63]

***オーケストレーション [#z633182b]
[[Docker Compose>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%82%BA]]を使用して、コンテナ・オーケストレーションを行う。

-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>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%82%BA]]を利用する。

***構成 [#ha6f3197]
-ホスト(VPNKit?の8888)
-- -> [[nginx-proxy>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?nginx]]コンテナ(nginxの80)
-- ->[[ASP.NET Core]]コンテナ([[Kestrel>ASP.NET CoreのWebサーバ#c9a915ba]]の5000)とブリッジする。
-- -> [[nginx-proxy>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?nginx]]コンテナ (nginxの80)
-- ->[[ASP.NET Core]]コンテナ ([[Kestrel>ASP.NET CoreのWebサーバ#c9a915ba]]の5000)とブリッジする。

-各コンテナは、それぞれ独立したIPアドレスを持っており、[[dockerコマンド>#pba54619]]で調べることができる。

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

**コンテナの管理 [#vc2dbc49]
複数のコンテナを扱うので、そろそろ管理コマンド・ツールを理解する。

***[[dockerコマンド>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker#jbff7b71]] [#pba54619]

-docker image
--docker image ls
--docker image rm image xxxxxxxxxxxx

-docker ps
-docker inspect id xxxxxxxxxxxx

-, etc.

***[[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を実行する。

**[[Kestrel>ASP.NET CoreのWebサーバ#c9a915ba]]のポートを固定する。 [#u9fb8311]
Program.csに以下の行を追加する。

 public static IWebHost BuildWebHost(string[] args) =>
     WebHost.CreateDefaultBuilder(args)
         .UseStartup<Startup>()
         .UseUrls("http://0.0.0.0:5000/") // ← ココを追加 localhost や 127.0.0.1 だとダメ。
         .Build();

**Dockerfileファイルの編集 [#qc6a4421]
Dockerfileファイル(Dockerfile)の編集
**Dockerファイルの編集 [#qc6a4421]
Dockerファイル(Dockerfile)の編集

***[[ASP.NET Core]]コンテナ [#p52600f8]
既定のDockerfileファイルを修正
既定のDockerファイル(Dockerfile)を修正

-変更前
 FROM microsoft/aspnetcore:2.0 AS base
 WORKDIR /app
 EXPOSE 80
 
 FROM microsoft/aspnetcore-build:2.0 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"]

-変更後
--aspnetcore:2.0 ---> latestと変更
--EXPOSE 80 ---> 5000と変更

--aspnetcore:2.0 ---> latestと変更~
(試しに変更しただけなので変更しなくても良い)

--EXPOSE 80 ---> 5000と変更~
これは、結局、[[Docker Composeファイル>#n1298d50]]が優先される。
 FROM microsoft/aspnetcore:latest AS base
 WORKDIR /app
 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]
nginxフォルダにDockerfileファイルを作成する。~
nginxフォルダにDockerfileファイル(Dockerfile)を作成する。~
※ nginxフォルダは、[[Docker Composeファイル(docker-compose.yml)>#n1298d50]]と同じ階層に作成。

 FROM nginx:latest
 COPY default.conf /etc/nginx/conf.d/default.conf

**nginx設定ファイルの追加 [#lc233d2b]
nginxフォルダにdefault.confを作成する。~
※ nginxフォルダは、[[Docker Composeファイル(docker-compose.yml)>#n1298d50]]と同じ階層に作成。

***[[既定値>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]] [#nfb2946c]
 server {
     listen        80;
     server_name   example.com *.example.com;
     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;
     }
 }

***変更後 [#ye6e194e]
 server {
     listen        80;
     server_name   localhost;
     location / {
         proxy_pass         http://xxx.xxx.xxx.xxx: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;
     }
 }

※ xxx.xxx.xxx.xxxには、

-以下コマンドを使用して、~
[[ASP.NET Core]]コンテナのIPAddressとして取得する。
-- docker ps
-- docker inspect id xxxxxxxxxxxx

-若しくは、[[Docker Composeファイル>#n1298d50]]のlinksに記載したサービス名を指定する。
 links:
   - webapplication1

**[[Docker Compose>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%82%BA]]ファイルの編集 [#n1298d50]
[[Docker Compose>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%82%BA]]ファイル(docker-compose.yml)の編集

***既定値 [#r8abf02d]
 version: '3'
 services:
   webapplication1:
     image: webapplication1
     build:
       context: .
       dockerfile: /WebApplication1/Dockerfile

***変更後 [#nd78a5b1]
 version: '3'
 services:
   nginx-proxy:
     image: nginx-proxy
     build:
       context: ./nginx
       dockerfile: Dockerfile
     ports:
       - "8888:80"
     links:
       - webapplication1
   webapplication1:
     image: webapplication1
     build:
       context: ./WebApplication1
       dockerfile: Dockerfile
     ports:
       - "5000:5000"

**補足 [#vb26db57]

***Dockerfile [#q9b54d6b]
Dockerfileには様々な設定が可能。
***Dockerファイル [#q9b54d6b]
Dockerファイル(Dockerfile)には様々な設定が可能。

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

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

***Docker Composeファイル [#ea137492]

-ports
--ポートを公開(expose)する。
---「ホスト : コンテナ」で、ホストとポートを指定する。
---コンテナのポートのみ指定(ホスト側のポートはランダム)。
--公式のイメージでは、記載がなくてもデフォルト・ポートが公開(expose)される。

-links
--コンテナ内の/etc/hostsに指定したサービス名が追加される。
--サービス名とリンク・エイリアス(サービス : エイリアス)の指定も可能。

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

*手順4 [#qf76ac18]

**概要 [#r8a42090]
[[手順3>#kecabd32]]に

-SessionストアのKVS(Redis)と
-DataストアのDBMS(PostgreSQL)の

コンテナを追加してみる。

***永続化 [#ge1c3b76]
-永続化の方法には、

--ホストのディレクトリにマウントする方法
--データコンテナを使う方法
--起動時に都度、初期化する方法

>がある。

-それぞれ、その用途から、

--KVS(Redis)には、「ホストのディレクトリにマウントする方法」~
(1つの負荷分散クラスタのSessionストアとして利用するため)

--DBMS(PostgreSQL)には、「起動時に都度、初期化する方法」~
(ココでは、主に、テスト自動化での利用を検討しているため)

>を採用する。

***構成図 [#z8dda8b8]

#ref(structure.png,left,nowrap,構成図,60%)

**初期設定 [#f3e67222]
[[手順3>#kecabd32]]と同じ。

**Redis [#p89016d2]

***構築 [#r661dc28]
-redisフォルダにredis設定ファイルを追加~
※ redisフォルダは、[[Docker Composeファイル(docker-compose.yml)>#n1298d50]]と同じ階層に作成。
--redis.confを作成し、外部から接続可能に設定する。
 bind 0.0.0.0

-[[Docker Composeファイル(docker-compose.yml)>#n1298d50]]へ追記~
以下のセクションを追加する。
--redis:
 redis:
   image: redis
   volumes:
     - ./redis/data:/data
     - ./redis/redis.conf:/usr/local/etc/redis/redis.conf
   command: redis-server --appendonly yes
   ports:
     - "6379:6379"
   restart: always

---/dataをマウントすると良い
---appendonly yesがないとデータが作られない
--webapplication1:~
linksにサービス名を記載する。
 links:
   - redis

***接続確認 [#g1f2fc48]
[[WSL>Windows Subsystem for Linux]]から、redis-cliをインストールして確認する。

-"Ubuntu 18.04 LTS on Windows 10"の場合、~
以下の準備が必要だった。
 sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu $(lsb_release -sc) universe"

-インストール
 sudo apt-get install redis-tools

-動作確認
 $ redis-cli -h 127.0.0.1
 127.0.0.1:6379> set mystr1 "abc"
 OK
 127.0.0.1:6379> get mystr1
 "abc"
 127.0.0.1:6379>

***データ・アクセスの実装 [#da7c922d]
***分散キャッシュの実装 [#da7c922d]
※ [[コッチ>ASP.NET Coreの分散キャッシュ]]のほうが新しい。

-NuGet~
(既定でMicrosoft.AspNetCore.Allに含まれる)
--Microsoft.AspNetCore.Session
--Microsoft.Extensions.Caching.Redis.Core

-以下を実装する。
--Startup.cs
 using System;
 using Microsoft.AspNetCore.Builder;
 using Microsoft.AspNetCore.Hosting;
 using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.AspNetCore.Http;
 
 namespace WebApplication1
 {
     public class Startup
     {
         public Startup(IConfiguration configuration)
         {
             Configuration = configuration;
         }
 
         public IConfiguration Configuration { get; }
 
         // This method gets called by the runtime. Use this method to add services to the container.
         public void ConfigureServices(IServiceCollection services)
         {
             // Redisを設定
             services.AddDistributedRedisCache(option =>
             {
                 option.Configuration = "redis";
                 option.InstanceName = "redis";
             });
 
             // Sessionを使用する。
             services.AddSession(options =>
             {
                 // Set a short timeout for easy testing.
                 options.IdleTimeout = TimeSpan.FromSeconds(10);
                 options.Cookie.HttpOnly = true;
             });
 
             services.AddMvc();
         }
 
         // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
         public void Configure(IApplicationBuilder app, IHostingEnvironment env)
         {
             if (env.IsDevelopment())
             {
                 app.UseBrowserLink();
                 app.UseDeveloperExceptionPage();
             }
             else
             {
                 app.UseExceptionHandler("/Home/Error");
             }
 
             app.UseStaticFiles();
 
             // Sessionを使用する。
             app.UseSession();
 
             app.UseMvc(routes =>
             {
                 routes.MapRoute(
                     name: "default",
                     template: "{controller=Home}/{action=Index}/{id?}");
             });
         }
     }
 }

--HomeController.cs
 public IActionResult Index()
 {
     HttpContext.Session.SetString("TestId", DateTime.Now.ToString());
     return View();
 }
 
 public IActionResult About()
 {
     ViewData["Message"] = "Your application description page. " + HttpContext.Session.GetString("TestId");
     return View();
 }

-参考
--ASP.NET CoreのCache・SessionにRedisを使う - kikki's tech note~
http://kikki.hatenablog.com/entry/2016/11/16/090000
--ASP.NET Core のセッションとアプリケーションの状態 | Microsoft Docs~
https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/app-state

***テスト [#ae11f373]
-画面
#ref(23.png,left,nowrap,手順23,60%)

-redis-cli
 127.0.0.1:6379> keys *
 1) "redis69ed5ead-0115-372b-8ef7-665bc769e747"
 2) "mystr1"

**PostgreSQL [#h0bca956]

***構築 [#n65a2ca2]
-postgresフォルダにpostgres設定ファイルを追加~
※ postgresフォルダは、[[Docker Composeファイル(docker-compose.yml)>#n1298d50]]と同じ階層に作成。
--初期化用SQLを ./postgres/init/init.sh に作成
 psql -U postgres << "EOSQL"
 
 CREATE DATABASE postgres;
 \c postgres;
 
 --------------------
 -- TABLE: Shippers 
 --------------------
 CREATE TABLE Shippers(
     ShipperID      integer    NOT NULL,
     CompanyName    VARCHAR(40)    NOT NULL,
     Phone          VARCHAR(24),
     CONSTRAINT PK_Shippers PRIMARY KEY (ShipperID)
 );
 
 --------------------
 -- Sequence: ShipperID
 --------------------
 CREATE SEQUENCE TS_ShipperID;
 
 --------------------
 -- INSERT
 --------------------
 INSERT INTO Shippers (ShipperID, CompanyName, Phone) VALUES(nextval('TS_ShipperID'), 'Speedy Express', '(503) 555-9831');
 INSERT INTO Shippers (ShipperID, CompanyName, Phone) VALUES(nextval('TS_ShipperID'), 'United Package', '(503) 555-3199');
 INSERT INTO Shippers (ShipperID, CompanyName, Phone) VALUES(nextval('TS_ShipperID'), 'Federal Shipping', '(503) 555-9930');
 
 EOSQL

-[[Docker Composeファイル(docker-compose.yml)>#n1298d50]]へ追記~
以下のセクションを追加する。
--postgres:
    image: postgres
    volumes:
      #- ./postgres/data:/var/lib/postgresql/data
      - ./postgres/init:/docker-entrypoint-initdb.d
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=seigi@123
    ports:
        - "5432:5432"
    restart: always

--webapplication1:~
linksにサービス名を記載する。
 links:
   - redis
   - postgres

***接続確認 [#n84b925c]
[[WSL>Windows Subsystem for Linux]]から、postgresql-clientをインストールして確認する。

-インストール
 sudo apt-get install postgresql-client

-動作確認
 $ psql -h 127.0.0.1 -d postgres -U postgres -c "select * from shippers"
 Password for user postgres:
  shipperid |   companyname    |     phone
 -----------+------------------+----------------
          1 | Speedy Express   | (503) 555-9831
          2 | United Package   | (503) 555-3199
          3 | Federal Shipping | (503) 555-9930
 (3 rows)

***データ・アクセスの実装 [#m6acfe6d]
-NuGet:Npgsql

-以下を実装する。
--HomeController.cs
 public IActionResult About()
 {
     string count = "";
     using (var con = new NpgsqlConnection("HOST=postgres;DATABASE=postgres;USER ID=postgres;PASSWORD=seigi@123;"))
     {
         con.Open();
         var cmd = new NpgsqlCommand(@"select count(*) from shippers", con);
         count = cmd.ExecuteScalar().ToString();
     }
     ViewData["Message"] = "Your application description page. " + count + "件";
     return View();
 }

***テスト [#pf7f6274]
-画面
#ref(24.png,left,nowrap,手順24,60%)

*手順5 [#ld629849]
VS2019で素のプロジェクト・テンプレートを生成して[[Docker Compose>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%82%BA]]をやってみた。
VS2019で素のプロジェクト・テンプレートを~
生成して[[Docker Compose>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%82%BA]]をやってみた。~
([[手順4>#qf76ac18]]までは、VS2017で実行している)

**検証 [#c3089756]
-手順25
#ref(25.png,left,nowrap,手順25,60%)

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

-手順27
#ref(27.png,left,nowrap,手順27)

-手順28
#ref(28.png,left,nowrap,手順28)

**結果 [#z92ecb75]
VS2019 では、「コンテナー オーケストレーター」が追加されている。

-VS2017では「Dockerサポート」で[[Docker Compose>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%82%BA]]が構成されていたが、

-VS2019の「Dockerサポート」ではDocker Fileが追加されるダケになった。

-VS2017 の既定の [[Docker Compose>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%82%BA]] を VS2019 で使用する場合は、~
「コンテナー オーケストレーター」の [[Docker Compose>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%82%BA]] を選択する必要がある。

*手順6 [#ff5fbe1b]
*手順6 [#naa08cfd]
こちらでは、Dockerファイルを分析する。

**Dockerファイル [#z505f716]

***Dockerファイルとは? [#md71d65b]
[[コチラ>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB]]。

***生成されたDockerファイル [#oc593cc5]
[[コチラ>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB#cb5688f8]]。

**Docker Composeファイル [#m3952eb0]

***Docker Composeとは? [#d088bb4a]
[[コチラ>#n1298d50]]。

***生成されたDocker Composeファイル [#k88497a0]
-docker-compose.yml
 version: '3.4'
 
 services:
   webapplication1:
     image: ${DOCKER_REGISTRY-}webapplication1
     build:
       context: .
       dockerfile: WebApplication1/Dockerfile

-docker-compose.override.yml~
カスタマイズはコチラに入れろの意味らしい。
 version: '3.4'
 
 services:
   webapplication1:
     environment:
       - ASPNETCORE_ENVIRONMENT=Development
       - ASPNETCORE_URLS=https://+:443;http://+:80
     ports:
       - "80"
       - "443"
     volumes:
       - ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro
       - ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro

--environment:~
環境変数の値を設定する。
---ASPNETCORE_ENVIRONMENT:最近、既定で使われて無い感ある。
---ASPNETCORE_URLS=https:使い所が不明感ある。

--ports:
---コンテナ・ポートの指定
---ホスト・ポートはランダムに指定される。

--volumes:~
不明(要調査)

**単体使いを研究する。 [#r606f9ad]

***Dockerファイル単体使い [#p6c84a90]
-生成されたプロジェクトにDockerサポートを追加する。

-テストの意味合いも含め、コンテナ・ポートを5000に変更する。

--Dockerfile~
EXPOSE 80 → EXPOSE 5000 に変更する。
 FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
 WORKDIR /app
 EXPOSE 5000
 EXPOSE 443

--Program.cs~
UseUrlsメソッドでエンドポイントを変更する。
 webBuilder.UseStartup<Startup>()
   .UseUrls("http://0.0.0.0:5000/");

-以下を実行してビルドする。

--ソリューションのルート・フォルダに移動して、
 >cd ...\WebApplication1

--以下のコマンドでDockerfileでビルドする。
 >docker build -f WebApplication1/DockerFile -t dotnetapp-dev .

--ビルドの結果(コンテナ・イメージ)を確認する。
 >docker images
 REPOSITORY                             TAG                 IMAGE ID            CREATED             SIZE
 dotnetapp-dev                          latest              beccad7e863b        14 minutes ago      212MB

-コンテナの実行と動作確認

--以下のコマンドでコンテナを実行する。~
コンテナ・ポート(5000)を、ホスト・ポート(8888)にマッピング
 >docker run --rm -p 8888:5000 dotnetapp-dev

--以下のURLでコンテナにアクセスする。~
http://localhost:8888

-参考
--DockerでASP.NET CoreのWebアプリケーションを実行する方法 | .NETコラム~
https://www.fenet.jp/dotnet/column/environment/2005/

***Docker Compose単体使い [#t45fd10b]
-生成されたプロジェクトに「コンテナー オーケストレーター」の [[Docker Compose>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%82%BA]] を選択して追加。

-docker-compose.yml と docker-compose.override.yml が生成されるのでマージする。~
(マージすると言いつつ、以下の部分を修正してある。)

--環境変数は削除する(使用しないので)
--ビルドは削除する([[前段>#p6c84a90]]で生成されたイメージを使用するので)。
--コンテナ・ポート(5000)を、ホスト・ポート(8888)にマッピング
 version: '3.4'
 
 services:
   webapplication1:
     image: dotnetapp-dev:latest
     ports:
       - "8888:5000"
       - "443"
     volumes:
       - ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro
       - ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro

-コンテナの実行と動作確認

--以下のコマンドでコンテナを実行する。
 docker-compose up -d

--以下のURLでコンテナにアクセスする。~
http://localhost:8888

*手順7 [#ff5fbe1b]
-平たく言って、
--[[手順2>#b6ded901]]のOpen棟梁テンプレートを、
--[[手順4>#qf76ac18]]の[[Docker Compose>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%82%BA]]で動かす。

-...そう思ったけど、面倒なのでやってない(出来るという情報はキャッチしている)。

-後日、[[コチラ>Visual Studio Kubernetes Tools#q66040c9]] の [[Docker Compose>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%82%BA]] → [[Kubernetes>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Kubernetes]]の流れの中で、実施する運びとなった。

*続き [#z6030346]
**[[Visual Studio Kubernetes Tools]] [#ce541e61]
**[[Visual Studio Code Docker extension]] [#m8181b06]

*サンプル [#uf55eafa]
-daisukenishino2/EvaluateAspNetCoreOnDocker:~
DockerでASP.NET Coreを評価する。(Evaluate ASP.Net Core on Docker.)~
https://github.com/daisukenishino2/EvaluateAspNetCoreOnDocker

**github.com [#r10984bd]

***MVC_Sample [#qf71fb01]
https://github.com/daisukenishino2/EvaluateAspNetCoreOnDocker/tree/master/MVC_Sample

-[[手順2>#b6ded901]]のサンプル

***WebApplication1 [#y696a445]
https://github.com/daisukenishino2/EvaluateAspNetCoreOnDocker/tree/master/WebApplication1

-[[手順3>#kecabd32]]、[[手順4>#qf76ac18]]のサンプル

**git clone後に[[Docker Compose>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%82%BA]]で動かす方法。 [#e09b7e2d]

***スタートアップ・プロジェクトに指定 [#p7f6ac2d]
「docker-compose」をスタートアップ・プロジェクトに指定する。
#ref(SetCompose2StartUpPj.png,left,nowrap,手順1,80%)

***「Docker Compose」をデバッグ実行 [#b065f652]
次いで、デバッグで、「Docker Compose」を指定して、実行する。

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

*参考 [#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

-Docker Compose と ASP.NET Core を使用した複数コンテナーのチュートリアル - Visual Studio~
https://docs.microsoft.com/ja-jp/visualstudio/containers/tutorial-multicontainer

-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

**データストア・コンテナ関連 [#pdf5ab9b]
[[コチラ>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%82%BA#yf5e8328]]に移動。

-docker-composeで開発用のredisとmysqlを構築する - まがりの日記~
http://oomatomo.hatenablog.com/entry/docker-machine-redis-mysql

-コンテナーとして実行するデータベース サーバーの使用 | Microsoft Docs~
https://docs.microsoft.com/ja-jp/dotnet/standard/microservices-architecture/multi-container-microservice-net-applications/database-server-container

***Redis [#z2086367]
外部から接続する場合、redis.confを修正する必要がある模様。

-redisサーバー構築メモ - @Konboi memo~
http://oomatomo.hatenablog.com/entry/docker-machine-redis-mysql

***PostgreSQL [#h3b4fa8e]
-永続化
--docker-composeでデータベースコンテナを立てるときのTips~
https://muunyblue.github.io/9f067d8d6df2d4b8c64fb4c084d6c208.html
--データはどう管理するべきなのか with Docker~
https://qiita.com/kikuchi_kentaro/items/4565292affaf2e521e0f

-初期化
--Docker Hub 公式 PostgreSQL イメージを用いて、~
データベースクラスタ作成済みコンテナイメージを作成する - Thanks Driven Life~
http://gongo.hatenablog.com/entry/2015/08/04/232650
--Docker PostgreSQL公式イメージを使用してDBに初期データを流し込む - Qiita~
https://qiita.com/furu8ma/items/c7e33ae34ef0216843b8

**OSSコンソーシアム [#v9daa4af]

***Blog [#h63300a1]
-ASP.NET CoreのLinux開発環境についての考察(WSL or Docker)~
https://www.osscons.jp/jotmuz8dq-537/

-Open棟梁 @ ASP.NET CoreをDockerで動作確認しました。~
https://www.osscons.jp/joerypz9u-537/

-複数のDockerコンテナを使ったASP.NET Core検証環境を構築してみました。~
https://www.osscons.jp/joq3nj6gs-537/

***Wiki [#d0aa0c82]
-マイクロソフト系技術情報 Wiki
--[[Docker for Windows]]
--[[Visual Studio Kubernetes Tools]]
--[[Visual Studio Code Docker extension]]
--[[Azure Container Instances (ACI)]]

-開発基盤部会 Wiki
--[[Docker>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker]]
--[[Dockerコマンド>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89]]
--[[Dockerファイル>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB]]
--[[Dockerレジストリ>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker%E3%83%AC%E3%82%B8%E3%82%B9%E3%83%88%E3%83%AA]]
--[[Dockerコンポーズ>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%82%BA]]

***Blog [#h63300a1]
-ASP.NET CoreのLinux開発環境についての考察(WSL or Docker)~
https://www.osscons.jp/jotmuz8dq-537/

-Open棟梁 @ ASP.NET CoreをDockerで動作確認しました。~
https://www.osscons.jp/joerypz9u-537/

-複数のDockerコンテナを使ったASP.NET Core検証環境を構築してみました。~
https://www.osscons.jp/joq3nj6gs-537/

----
Tags: [[:.NET開発]], [[:.NET Core]], [[:Hyper-V]], [[:仮想化]]
Tags: [[:.NET開発]], [[:.NET Core]], [[:Hyper-V]], [[:仮想化]], [[:コンテナ]], [[:IaC]]


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