最小の ASP.NET 5 アプリを Docker で動かす

はじめに

yo のジェネレーターを使って ASP.NET 5 プロジェクトを作成したら、 次のような Dockerfile も含まれていた。

FROM microsoft/aspnet:1.0.0-beta7

COPY project.json /app/
WORKDIR /app
RUN ["dnu", "restore"]
COPY . /app


EXPOSE 5000
ENTRYPOINT ["dnx", "-p", "project.json", "kestrel"]

せっかくなんで、Docker で動くか試してみよう。

Docker Toolbox をインストール

Mac OS X で Docker を使うために、Docker Toolbox をインストールする。

www.docker.com

Docker Toolbox は次のツールが含まれていた。

  • Docker Client
  • Docker Machine
  • Docker Compose (Mac only)
  • Docker Kitematic
  • VirtualBox

余談だけど、Docker Toolbox がインストールした VirtualBox が新しくて、 Vagrant が実行できなくなった。vagrant upgrade もできなくてツライ。

Docker Quickstart Terminal を起動

Launchpad から Docker Quickstart Terminal を起動。


                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/


docker is configured to use the default machine with IP 192.168.99.100
For help getting started, check out the docs at https://docs.docker.com

192.168.99.100 はコンテナにアクセスするときに使う IP アドレスだった。 これに気づかずに、ずっと localhost でアクセスしようとしていた。 そりゃ繋がらないはずだ。

コンテナイメージを作成

Dockerfile があるディレクトリに移動し、タグとバージョンを指定して、コンテナイメージを作成する。

docker build -t tnakamura/helloaspnet:1.0 .

-t オプションを使ってタグとバージョンをつけておかないと、どちらも になってしまって、 docker のサブコマンドで毎回イメージ ID を指定するハメになる(体験済み)。

コンテナを実行

docker run コマンドでコンテナを起動。

docker run -it -p 5000:5000 --name helloaspnet tnakamura/helloaspnet:1.0

-i オプションをつけると、コンテナで実行したコマンドの標準入出力に接続して、 対話的に操作できるようになる。

-t オプションはコンテナに擬似 TTY 端末を割り当てるもので、 コマンドライン操作を行うプロセスを使用するときは必須。

これら2つはほぼすべての場合に指定しておいたほうがいいみたい。 付け忘れると端末が入力を受け付けてくれなくなって、タブを閉じるしかなくなった(体験済み)。

あと、-p はポートフォワーディング、--name はコンテナに名前をつけるやつね。

Safari でアクセスしてみる

192.168.99.100:5000 にアクセスしてみたのがこちら。

f:id:griefworker:20151025203034p:plain

上手くいったけど、スクリーンショットじゃ分かりにくいかな。 ホントに Docker で動いてるからね。

まとめ

最小の ASP.NET 5 アプリではあるけど、Docker のコンテナで動かすことができた。

今回作ったコンテナが、Docker コンテナのデプロイをサポートしている PaaS でそのまま動かせるのだとしたら胸熱だな。

Google Container Engine、Elastic Beanstalk、Azure Container Services、Heroku。 Heroku は確か、 Heroku が用意したコンテナイメージから作る必要があったっけ。

そのうちデプロイも試してみよう。