WindowsコンテナでのWebサイト・CGIの構築

windows-containerのアイキャッチ画像 Windows

WindowsにおけるDockerコンテナには、主に以下の2通りがあります。
・Windows (Server) コンテナ:Windows系OSのコンテナを起動できる。
・Docker (Desktop) for Windows:Linux/UNIX系OSのコンテナを起動できる。
前者はWindows Serverでのみ使用可能です。

ここでは、Windowsコンテナを使用して、マイクロサービス向けWebサイト・CGIの構築方法を解説します。
山括弧<…>で囲まれている箇所は、ご自身の環境に合わせて書き換える必要があります。

Windowsコンテナのインストール

Windowsコンテナをインストール・有効化します。
こちらを参考に実施下さい。

Webサイト・CGIの構築

1. 前提

ホストOS上では以下のようなフォルダ・ファイル構成とします。
コンテナは「Webアプリケーション用」と「DB用」の2つ作成します。


2. Dockerファイルの用意

Dockerファイルを用意します。
以下はDockerファイルの内容の例です。COPYやRUNはDockerイメージ作成時に実行されます。

#==============================
# Webアプリケーション用Dockerfile
#==============================

# Microsoftが提供しているDockerイメージ「microsoft/iis」をベースとして使う
FROM microsoft/iis

# 管理者(任意)
LABEL maintainer="<メールアドレス(e.g. hoge@gmail.com)"

# ホストOSの「toolsフォルダ」と「archivesフォルダ内のzipファイル」を、Dockerコンテナ内の「C:/setupフォルダ」以下にコピーする。(※zip化はしなくてもよい。ここでは説明上そうしている)
COPY /tools /archives/*.zip C:/setup/

#(例えば、tools/run.ps1を用意しておくと)Dockerイメージ作成時にrun.ps1により任意のコマンドを実行できる。
RUN powershell.exe -noprofile -executionpolicy RemoteSigned -command "C:/setup/run.ps1"
#==============================
# DB用Dockerfile (※ここではSQL Server)
#==============================

# 3rd Partyが提供しているDockerイメージ「kkbruce/mssql-server-windows-express:windowsservercore-1809」をベースとして使う
FROM kkbruce/mssql-server-windows-express:windowsservercore-1809

# 管理者(任意)
LABEL maintainer="<メールアドレス(e.g. hoge@gmail.com)"

# ホストOSの「toolsフォルダ」と「archivesフォルダ内のzipファイル」を、Dockerコンテナ内の「C:/setupフォルダ」以下にコピーする。(※zip化はしなくてもよい。ここでは説明上そうしている)
COPY /tools /archives/*.zip C:/setup/

#(例えば、tools/run.ps1を用意しておくと、以下のように記載することで)Dockerイメージ作成時にrun.ps1が実行される。これにより、Dockerイメージ内の環境を事前に整えることができる。
RUN powershell.exe -noprofile -executionpolicy RemoteSigned -command "C:/setup/run.ps1"

3. Webアプリケーション用 run.ps1の用意

run.ps1 に以下を実行するプログラムを記述します。
こちらの「Webサイト・CGIの構築 > 前提」のように、ドキュメントルートとCGIルートを作成
②上記「archivesフォルダ内のzipファイル」を展開し、①のドキュメントルート、CGIルート、CGIモジュールにそれぞれ配置
こちらの「Webサイト・CGIの構築」のPowershellコマンドを順に実行

※IIS URL Rewriteのインストール方法はこちらをご覧下さい。

4. Dockerイメージの作成

ホストOSのPowershellにて、以下を実行します。

# Webアプリケーション用Dockerイメージの作成
docker build -t "<イメージ名(e.g. hoge_app)>" -f "C:\hoge\docker\app\Dockerfile" .
# DB用Dockerイメージの作成
docker build -t "<イメージ名(e.g. hoge_db)>" -f "C:\hoge\docker\db\Dockerfile" .

Powershellで「docker images」を実行し、Dockerイメージ「hoge_app」と「hoge_db」が存在していることを確認します。

5. ODBCドライバーのインストール

こちらからSQL Server用ODBCドライバー(msodbcsql.msi)をダウンロードします。

Webアプリケーション用Dockerイメージであるhoge_appを起動します。

docker run -d hoge_app --name hoge_app --entrypoint powershell

ホストOSからDockerコンテナhoge_appにODBCドライバーをコピーします。

docker cp <ホストOSにあるmsodbcsql.msiのフルパス> hoge_app:/setup/msodbcsql.msi

Dockerコンテナhoge_appにアタッチします。(hoge_app内に入ります)

docker attach hoge_app

hoge_app内で以下を実行してインストールします。

msiexec.exe /quiet /passive /qn /i C:\setup\msodbcsql.msi  IACCEPTMSODBCSQLLICENSETERMS=YES

以下を実行することで、正常にインストールされているかを確認することができます。

$HKLM = 2147483650
$reg = [WMIClass]"ROOT\DEFAULT:StdRegProv"
$Key = "SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers"
$reg.EnumValues($HKLM, $Key) | % { $_.sNames | % {$_ + "`t" + $reg.getStringValue($HKLM, $Key, $_).sValue } }
# "ODBC Driver * for SQL Server   Installed"が表示されればOKです。

6. Dockerコンテナの起動

Webアプリケーション用のDockerコンテナを起動します。
以下のように起動すると、ホストOSのブラウザから「http://localhsot:8888/api/functions」とアクセスすると、Dockerコンテナ内へは「http://localhost:80/api/functions」とアクセスします。

docker run -d -p <ホストOSのポート番号(e.g. 8888)>:<Dockerコンテナのポート番号(e.g. 80)> hoge_app --name hoge_app --entrypoint powershell


DB用のDockerコンテナを起動します。

docker run -d -p <ホストOSのポート番号(e.g. 1433)>:<Dockerコンテナのポート番号(e.g. 1433)> -e sa_password=<saの任意のパスワード(e.g. root)> -e ACCEPT_EULA=Y --name hoge_db


ホストOSからDockerコンテナのIPアドレスは以下で確認することができます。

docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <コンテナ名(e.g. hoge_db)>

ホストOSの SQL Server Management Studioなどから、サーバー名「<上記で確認したIP>」もしくは「<上記で確認したIP>\SQLEXPRESS」、SQL Server認証でユーザー「sa」・パスワード「root」でアクセスすることができます。
同じように、Dockerコンテナhoge_appから、Dockerコンテナhoge_dbに対して上記IPを指定することでアクセスすることができます。

コメント

タイトルとURLをコピーしました