きな粉もち.net

.NET関連仕事に携わっています。OSSのソースを読んで気がついたことを中心に呟いたりブログに投稿したりしています。最近はUiPathを使ったRPAも研究中。気軽にフォローやツッコミよろしくおねがいします! Gitはここを使っています https://github.com/kinakomotitti

Visual Studio × Web アプリケーション × Dockerに配置してみる (その2)

その1*1で失敗した原因を調査しつつ、引き続き「DockerでIISを立てて、そのIISにWEBアプリケーションを配置」をしていこうと思います。

そもそも何が悪かったのかわからないので、Dockerfileをもう少しシンプルにして原因の切り分けをしていこうと思います。
今回も参考にするサイトは以下のDockerのPUBLIC REPOSITORYです。
https://hub.docker.com/r/microsoft/iis/

今回は、このサイトの「How to use this image?」に書かれているDockerfileのコードを利用します。
こっちのほうがシンプルで分かりやすそうです。
上記のDockerfileを以下のフォルダに格納します。

C:\DockerWorks\02_IIS\Dockerfile

こうすることで、02_IISの配下のフォルダやファイルだけがContext*2として認識されるため、Dockerfileのビルド開始のファイルコピー処理にかかる時間を短くすることができます。


前回(その1)で失敗した原因もこれだったのではないかなと思います。
さて、Dockerfileの中身を見てみたいと思います。

//microsoft/iisのイメージを取得します。
FROM microsoft/iis

//コンテナ内にフォルダを作成します。
RUN mkdir C:\site

//Powershellのコマンドを使って、新しいサイトを作成します。
//ポートは8000にバインドします。
RUN powershell -NoProfile -Command \
    Import-module IISAdministration; \
    New-IISSite -Name "Site" -PhysicalPath C:\site -BindingInformation "*:8000:"

EXPOSE 8000

//Context配下のcontentフォルダをコンテナ内のsiteフォルダにコピーします。
ADD content/ /site

前回(その1)では、Windows Server のイメージに対して、IISの機能をインストールして・・・
ということからやっていたので、どこでこけているかわかりませんでした。
今回は、IISがすでに設定されている状態のWindows Server のイメージを利用するということなので、シンプルに記述ができています。

さて、Dockerfileに記述した通り、contentフォルダを以下のように作成し、その中に、最初に作成したWebApplicationを発行しておきます。

C:\DockerWorks\02_IIS\content\binフォルダなど・・・

じっこう!

Contextも適切に設定し、Dockerfileもシンプルにしたので、実際に動かしてみたいと思います。
powershellで以下のコマンドを順番に実行していきます。

//イメージの作成(ビルド)
docker build -t iis-site .

//iis-siteイメージの実行(コンテナーの起動)
docker run -d -p 8000:8000 --name my-running-site iis-site

//my-running-siteという名前のコンテナーに割り当てられたIPアドレスの取得
docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" my-running-site

ビルド成功しました!
続けて、コンテナーの実行も成功しました!
しかし、それだけでは終わらない・・・
IPアドレスを取得し、8000番ポートにアクセスしたら、以下のエラーが発生しました。

HTTP500内部サーバーエラー

とりあえず、つながることはつながったので、今回のところはOKということで・・・



次回、原因調査と動かすところまでいき、もろもろまとめようと思います。

*1:kinakomotitti.hatenablog.com

*2:Contextとは、Dockerfileが認識することができる範囲のことで、実体としては、Dockerファイルが存在するフォルダ以下の階層にあるすべてのフォルダ、ファイルになります。作りたいコンテナーで利用するものをまとめたフォルダを作り、その直下にDockerfileを格納する事でうまく認識されるようです。