こんにちは、クラウドインテグレーション2部 技術1課 宮形 です。
私はサーバーワークスへは昨年2021年12月に中途入社しまして、はや4か月がたとうとしています。
実務では主に VPC、EC2、RDS、WorkSpaces といったインフラ部分の構築を担当してきましたが、そろそろ新しい領域チャレンジということで、Dockerコンテナ技術 にトライしてみようと思います。
アプリケーション開発の経験無い、インフラエンジニア視点での文章となります。専門の方がみてお見苦しい表現があるかもしれません。ご了承ください。
Dockerコンテナとは
仮想化技術のひとつとなりますが、すでに弊社先輩方のBLOGで解説されておりますので そちらを紹介とさせていただきます。
Windows コンテナに挑戦
Docker コンテナといえばLinuxであり、Apache とか Nginx を動かすというイメージでした。
実は Windows 固有アプリケーションもコンテナで動かすことが出来るのです。代表的な用途としては「IIS」だと思います。
調べてみましたが過去BLOGで Windows コンテナは取り扱いされていないようでしたので、私の学習を兼ねての題材とさせていただくことにしました。
参考情報
Microosft の公式マニュアルを参考にしております。
Windows オペレーティング システム コンテナーの準備 | Microsoft Docs
インターネットで Windows コンテナを調べると、下記3つの方式がヒットしました。1. 2. は Windows上で仮想化された Linux を動かし、その上で Docker コンテナを動かす方式となりますので、 Windows 固有アプリケーションの要件には選択できません。本BLOGは 3. の Windowsネイティブで Docker コンテナを動かす方式となります。
- Docker Desktop でコンテナを動かす
- WSL 上で Docker コンテナを動かす
- Windows Server 上で Dockerコンテナ機能をインストールしてコンテナを動かす
ゴール
弊社はAWS専業クラウドインテグレーターですので、やはり AWS でコンテナを動かしたいです。最終的には AWS のマネージドサービスである ECS でコンテナ化された Windowsアプリケーションを動かすことをゴールとします。
何回かにわけて掲載しようと思い、今回BLOGでは EC2 の Windows Server 上でコンテナをビルドして動かすところまでとします。
検証開始
コンテナを動かす EC2 Windows サーバー を準備
通常の Windows Server を利用します。私は AWS の EC2 を利用しました。利用したAMIは下記になります。
AMI ID | AMI 名 |
---|---|
ami-0f10983cd1e2ce868 | SupportedImages Windows_Server-2019-Japanese-Full-Base-2022.02.12-c591e9cf-10e9-4aea-84a0-1db739c7cade |
Windows コンテナのセットアップ
上記「参考情報」の手順を参考に、Windows コンテナをインストールします。特に難しいことはなく、PowerShell からインストールコマンドを実行していきます。最後にOS再起動を行なえば、セットアップ完了となり利用可能となります。
PS> Install-Module -Name DockerMsftProvider -Repository PSGallery -Force PS> Install-Package -Name docker -ProviderName DockerMsftProvider PS> Restart-Computer -Force
Windows サービスの一覧に「Docker Engine」が追加されました。
where.exe docker を実行すると C:\Program Files\Docker フォルダにインストールされていることがわかります。
PS > where.exe docker C:\Program Files\Docker\docker.exe
エクスプローラーで覗いてみると、EXEファイルアイコンがクジラのコンテナになっていました!可愛いですね~
まず動かしてみる
docker コマンドで環境を作ります。この辺は Linux と同じのようです。 docker pull コマンドにて Microsoft のレジストリ上にあるIISのイメージをローカルにダウンロードします。私は Windows Server 2019 で動かしているので、対応したタグ名「windowsservercore-ltsc2019」を指定しています。
PS> docker pull mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019
私が行ったときは、約10分ほどかかりました。
docker image lsコマンドでローカルイメージ一覧を確認します。Linuxベースの Docker コンテナご経験者だと、ファイルサイズの大きさに驚くと思います。Dockerコンテナのメリットであるポータビリティが損なわれる可能性もあるので、この点は Windows コンテナの弱点ともいえそうですね。
PS> docker image ls
早速 docker run で動かしてみます。IISのデフォルトポートは TCP80 ですが、私は -p 8080:80 と指定して TCP8080でのリッスンへ変換して起動しています。 動作確認しているサイトが 従来IISなのかコンテナのIISなのか区別したかった為ですので、必要なければ省略可能です。
PS> docker run -it -p 8080:80 mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019
Windows Server で Webブラウザを開始し、http://localhost:8080/ へアクセスします。無事 IISデフォルトページが表示されました。
WindowsベースのコンテナでIISを動かすことに成功しました。ただし、まだデフォルトHTMLページしかないので、これでは実務で使えません。自分で準備したHTMLコンテンツを動かすコンテナを作成(ビルド)してみます。
オリジナルHTMLコンテンツをWindowsコンテナのIISで動かす
Docker Hub に掲載されているサンプルを参考にします。
任意のフォルダ(本例では c:\dockertest) に Dockerfile というテキストファイルを作成し、下記のように記載します。
FROM mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019 RUN powershell -NoProfile -Command Remove-Item -Recurse C:\inetpub\wwwroot\* WORKDIR /inetpub/wwwroot COPY content/ .
Dockerfileはコンテナをビルドする時の動作を定義します。この概念はLinuxベースのコンテナと同じです。 ファイル中身をみてみると、デフォルトの C:\inetpub\wwwroot\ 配下を全削除した後に、自身が用意する content フォルダの中を Copy しているようです。
同フォルダ配下に content というサブフォルダを作成。このサブフォルダに IIS の wwwroot 配下に配置するコンテンツのHTMLファイルを配置します。私は sample.html というファイルを1つ配置しました。
PowerShell にて任意のフォルダ(本例では c:\dockertest) へ cd で移動し、docker build コマンドを実行します。
PS> cd C:\dockertest PS> docker build -t myga-iis-test .
問題なくビルドが成功しました。
今ほどビルドしたコンテナを ls コマンドで確認します。
PS> docker image ls
docker run でコンテナを起動します。
PS> docker run -it -p 8080:80 myga-iis-test
Windows Server で Webブラウザを開始し、http://localhost:8080/sample.html へアクセスします。オリジナルHTMLコンテンツが表示されました!成功です!今回BLOGでの検証は、ここまでとしたいと思います。
まとめ
やってみると、おもったよりは簡単に Dockerコンテナで Windows IIS を動かすことが出来ました。 次回は、AWS のマネージドサービスである ECS を本番環境にみたてて Windows コンテナ動かすところを検証し、その次では IIS のアクセスログや管理方法など従来 Windows Serverで行っていた運用との違いをみてみたいと思います。
Windows コンテナは Linuxベースと比べると事例は少ないと予想しますが、出来るかぎりユースケースやメリット・デメリットを記載し、皆様のシステム検討の参考になるよう心掛けたいと思います。