MS公式Dockerイメージを使って.NET Core開発を行う(Mac)
.NET Coreのいくつかの開発環境・ランタイム環境のDockerイメージ(Dockerfile)はMicrosoft公式としてDocker Hubで公開されています。
ターゲットOSは Linux のものと Windows Server 2016 Nano Server がありますが、ここでは Mac(OSx)をホストとして Linux サーバー .NET Core開発環境を作成したいと思います。
では、上記URL内の「1.0.0-preview2.1-sdk」を利用したいと思います。
下準備
Macのターミナルを開き「/Users/daigo/docker」ディレクトリをベースに進めていきたいと思います。
また、Dockerコンテナには、プログラムソースの作成・保存場所として、ホスト側(Mac)の「/Users/daigo/docker/projects/」ディレクトリを共有する事とします。
Dockerfileを作成
「1.0.0-preview2.1-sdk」の対象URL(GitHubへのリンク)にアクセスします(下図)。
これは Dockerfile となっています(https://github.com/dotnet/dotnet-docker/blob/master/1.0.0-preview2.1/debian/sdk/Dockerfile)。
↑(2017.2.16追記)上記リンクは死んでるみたい・・・適当な別バージョンで実施してくださいm( )m
これをそのまま「/Users/daigo/docker/Dockerfile」として保存します。
Dockerイメージのビルド
ターミナルで以下のコマンドを実行します。先程作成したDockerfileを元にして、Dockerイメージをビルドします(ここではイメージ名を dotnet100pv21 としています)。
docker build -t dotnet100pv21 .
イメージのダウンロードとビルドに数分程度かかると思います。
処理が完了したら以下のコマンドを実行してみましょう。dotnet100pv21という名称のイメージが作成されていることが確認できます。
docker images
Dockerコンテナの起動
ではコンテナを起動します。
ターミナルで以下のコマンドを実行します。
docker run -i -t -v /Users/daigo/Docker/Projects:/Home/Projects -p 5000:5000 dotnet100pv21
主要なコマンドオプションの意味は以下の通りです。
「-v」オプション:”ホスト側(Mac)の /Users/daigo/Docker/Projectsディレクトリ を コンテナ側の /Home/Projectsディレクトリ として公開(マッピング)”します。
「-p」オプション:”ホスト側(Mac)の 5000番ポート を コンテナ側の 5000番ポート にマッピング”します。
正常に実行されると、以下のようにコンテナ側のターミナルが表示されます。
.NET Core Webアプリ(雛形)を作成
コンテナ側ターミナル上で引き続き.NET Core Webアプリを作成したいと思います。
事前にホスト側ディレクトリにマッピングした /Home/Projects にプロジェクトを作成したいと思います。
/Home/Projectsディレクトリに移動し、まずは dotnet –info コマンドで.NET Coreの状態を確認します。
cd /Home/Projects dotnet --info
Debian上で1.0.0-preview2-1-003155の.NET Coreが動作している事が確認できます。
続けて以下のコマンドでWebアプリの雛形を作成します(新規プロジェクト作成。プロジェクトタイプはWebアプリで、という意味)。
dotnet new -t Web
ホスト側からアクセス可能にする為”微調整”
これからコンテナ側でビルド&実行するWebアプリケーションを、ホスト側(つまり外部マシン)からアクセス可能とする修正を行います。
dotnet new -t Web で自動生成されたソース中の「Program.cs」ファイルに「.UseUrls(“http://0.0.0.0:5000”)」の1行を追記します。
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Hosting; namespace WebApplication { public class Program { public static void Main(string[] args) { var host = new WebHostBuilder() .UseKestrel() .UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() .UseStartup<Startup>() .UseUrls("http://0.0.0.0:5000") // 追記!!! .Build(); host.Run(); } } }
dotnet restore / run
dotnet restore と dotnet run コマンドを実行します。
dotnet restore dotnet run
restoreは、このアプリケーションに必要な依存関係ファイルを、プロジェクト内にリストアします。
runは、このアプリケーションをビルド&実行します(ビルドだけ行う場合は dotnet build とします)。
ホスト側(Mac)からコンテナ側の.NET Core Webアプリにアクセス
ではホスト側であるMacのSafariを起動し「http://localhost:5000」にアクセスしてみましょう。
動いた!
アクセスするURLをlocalhostとしていますが、Dockerでローカルの5000番ポートをコンテナの5000番ポートにマップしている為、これはコンテナで動作しているWebアプリケーションの実行結果となります。
見事にプロジェクトソースはホスト側ファイルシステムに保存し、開発&実行環境はポイポイ使い捨ても可能なDockerコンテナに持っていくことが出来ました!
※「本格開発」となるとソース管理でGitかましてとかなるけど、本投稿はそこまで追求しないです。
※さあ、連休中に連続投稿したので、平日はブログ更新お休みかな・・・