Docker Filesで Windows Server Coreコンテナを作成してApache/PHPを動かす

## 背景
Windows Server上でApache動かすのはそう多くないかもしれないけれど、なかなか記事もないので書いてみます。
ちなみにDocker for Windowsの使い方については前回の記事に書いてます。

[Docker Filesで Windows Server Coreコンテナを作成してDocker for Windowsを始める](https://qiita.com/tobi50/items/e05c3210c84147f3355f)


## 必要なものを揃えてDockerfilesを書く

さて、Dockerfilesを書いていきます。

### 必要なファイルをダウンロードしてコンテナに配置する
まずは元となるイメージと、必要なファイルをダウンロードするようにします。

``` Dockerfile
FROM microsoft/windowsservercore

# VC++とPHPとApacheのダウンロード
ADD https://download.microsoft.com/download/C/A/F/CAF5E118-4803-4D68-B6B5-A1772903D119/VSU4/vcredist_x64.exe /
ADD https://windows.php.net/downloads/releases/php-5.6.38-Win32-VC11-x64.zip /
ADD https://home.apache.org/~steffenal/VC11/binaries/httpd-2.4.37-win64-VC11.zip /
```

### あらかじめダウンロードしたファイルをコンテナに配置する
ただ、上記の方法だと、Dockerfilesを修正するたびにダウンロードが走ってしまい、色々試すには不向きなので、あらかじめ必要なファイルをダウンロードしておき、以下のようにDockerfilesのフォルダへ格納しておきましょう。
ついでにphp.iniやhttpd.confなどの設定ファイルも入れておくと便利です。

```
C:/winapachephp/
　├ Dockerfile
　├ vcredist_x64.exe
　├ php-5.6.38-Win32-VC11-x64.zip
　├ httpd-2.4.37-win64-VC11.zip
　├ php/
　│　└ php.ini
  └ Apache24/
　 　├ conf/
　 　│　└ httpd.conf
     └ htdocs
　 　 　└ phpinfo.php
```

### Apache/PHPの設定ファイルを準備
httpd.confにはPHP周りの情報を入れておきます。
php.iniは取り急ぎphp.ini-productionをphp.iniにリネームしてそのままで使います。

``` apache:/Apache24/htdocs/httpd.conf
# DirectoryIndexにindex.phpを設定します
#（書き換え前）DirectoryIndex index.html ⇒ （書き換え後）DirectoryIndex index.html index.php
DirectoryIndex index.html index.php

# エラー回避のため、ServerNameを設定します。
ServerName 127.0.0.1:80

# PHPモジュールへのパスを設定します
LoadModule php5_module "c:/php/php5apache2_4.dll"

# .phpのハンドラを設定します"
AddHandler application/x-httpd-php .php

# php.ini へのパスを設定します
PHPIniDir "C:/php"
```

ついでにPHPが実行出来ていることを確認するため、下記のphpinfo.phpを追加しておきます。

``` php:/Apache24/htdocs/phpinfo.php
<?php echo phpinfo();
```

### Dockerfilesを書く
では、これに合わせてDockerfilesを追記していきましょう。
設定ファイルを変える度に後続タスクのキャッシュが使えなくなって再生成するのも大変なので、設定ファイルはなるべく最後に配置するようにすると良さそうです。

``` Dockerfile
FROM microsoft/windowsservercore

# VC++とPHPとApacheのダウンロード
# ADD https://download.microsoft.com/download/C/A/F/CAF5E118-4803-4D68-B6B5-A1772903D119/VSU4/vcredist_x64.exe /
# ADD https://windows.php.net/downloads/releases/php-5.6.38-Win32-VC11-x64.zip /
# ADD https://home.apache.org/~steffenal/VC11/binaries/httpd-2.4.37-win64-VC11.zip /

# VC++配置
ADD vcredist_x64.exe /

# VC++をインストール
RUN start /w C:/vcredist_x64.exe /q /norestart
RUN del 'C:\vcredist_x64.exe' -f


# PHP 配置
ADD php-5.6.38-Win32-VC11-x64.zip /

# PHPの解凍
RUN powershell -command \
    Expand-Archive -Path c:/php-5.6.38-Win32-VC11-x64.zip -DestinationPath c:/php/ ; \
    Remove-Item c:/php-5.6.38-Win32-VC11-x64.zip -Force

# PHPのPathを通す
RUN setx path "%PATH%;c:\php"
RUN setx pathext "%PATHEXT%;.php"


# Apache配置
ADD httpd-2.4.37-win64-VC11.zip /

# Apacheの解凍（zipを解凍すると親フォルダが余計に出来るので、中のフォルダを移動させる）
RUN powershell -command \
    Expand-Archive -Path c:/httpd-2.4.37-win64-VC11.zip -DestinationPath c:/Apache24_unzip ; \
    Move-Item -Path C:/Apache24_unzip/Apache24 -Destination C:/Apache24 ; \
    Remove-Item c:/httpd-2.4.37-win64-VC11.zip -Force ; \
    Remove-Item C:/Apache24_unzip -Recurse -Force

# httpdのPathを通す
RUN setx path "%PATH%;C:\Apache24\bin"

# PHP.iniの配置
ADD php /php/

# httpd.confの配置
ADD Apache24 'C:/Apache24/'

# httpdのサービス追加と起動
RUN httpd -k install
RUN httpd -k restart

```


## コンテナイメージを作成し、コンテナを作って起動する
では、早速コンテナイメージを作成してみましょう。

``` powershell
# コンテナイメージを作成する
PS C:\winapachephp> docker build -t win/apachephp .

# コンテナを作成して起動する
PS C:\winapachephp> docker run --name apachephp -it win/apachephp powershell
```

この時点で既にコンテナにアクセスできるようになっています。
起動後にコンテナのpowershellが起動していると思いますので、そのまま`ipconfig`をしてIPアドレスを取得し、ブラウザでアクセスしてみましょう。phpinfo.phpにもアクセス出来たら成功です。

## その後の更新（2019/1/2）
どうやらWindows Server 2019のイメージがある様子。

``` powershell
docker pull mcr.microsoft.com/windows/servercore:ltsc2019
```

Windows Server 2019 Now Available
https://blogs.technet.microsoft.com/virtualization/2018/11/13/windows-server-2019-now-available/

Windows Server 2019 の Docker Image と MCR への移行
https://blog.shibayan.jp/entry/20181116/1542361140