MS公式Dockerイメージを使って.NET Core開発を行う(Mac)

.NET Coreのいくつかの開発環境・ランタイム環境のDockerイメージ(Dockerfile)はMicrosoft公式としてDocker Hubで公開されています。

microsoft/dotnet - 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へのリンク)にアクセスします(下図)。

f:id:daigo-knowlbo:20161107002646p:plain

これは Dockerfile となっています(https://github.com/dotnet/dotnet-docker/blob/master/1.0.0-preview2.1/debian/sdk/Dockerfile)。
↑(2017.2.16追記)上記リンクは死んでるみたい・・・適当な別バージョンで実施してくださいm( )m

f:id:daigo-knowlbo:20161107003125p:plain

これをそのまま「/Users/daigo/docker/Dockerfile」として保存します。

Dockerイメージのビルド

ターミナルで以下のコマンドを実行します。先程作成したDockerfileを元にして、Dockerイメージをビルドします(ここではイメージ名を dotnet100pv21 としています)。

docker build -t dotnet100pv21 .

イメージのダウンロードとビルドに数分程度かかると思います。
処理が完了したら以下のコマンドを実行してみましょう。dotnet100pv21という名称のイメージが作成されていることが確認できます。

docker images

f:id:daigo-knowlbo:20161107003648p:plain

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番ポート にマッピング”します。

正常に実行されると、以下のようにコンテナ側のターミナルが表示されます。
f:id:daigo-knowlbo:20161107005605p:plain

.NET Core Webアプリ(雛形)を作成

コンテナ側ターミナル上で引き続き.NET Core Webアプリを作成したいと思います。
事前にホスト側ディレクトリにマッピングした /Home/Projects にプロジェクトを作成したいと思います。
/Home/Projectsディレクトリに移動し、まずは dotnet –info コマンドで.NET Coreの状態を確認します。

cd /Home/Projects
dotnet --info

f:id:daigo-knowlbo:20161107010020p:plain Debian上で1.0.0-preview2-1-003155の.NET Coreが動作している事が確認できます。

続けて以下のコマンドでWebアプリの雛形を作成します(新規プロジェクト作成。プロジェクトタイプはWebアプリで、という意味)。

dotnet new -t Web

f:id:daigo-knowlbo:20161107010238p:plain

ホスト側からアクセス可能にする為”微調整”

これからコンテナ側でビルド&実行する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アプリにアクセス

ではホスト側であるMacSafariを起動し「http://localhost:5000」にアクセスしてみましょう。

f:id:daigo-knowlbo:20161107011709p:plain

動いた!

アクセスするURLをlocalhostとしていますが、Dockerでローカルの5000番ポートをコンテナの5000番ポートにマップしている為、これはコンテナで動作しているWebアプリケーションの実行結果となります。

見事にプロジェクトソースはホスト側ファイルシステムに保存し、開発&実行環境はポイポイ使い捨ても可能なDockerコンテナに持っていくことが出来ました!

※「本格開発」となるとソース管理でGitかましてとかなるけど、本投稿はそこまで追求しないです。

※さあ、連休中に連続投稿したので、平日はブログ更新お休みかな・・・