Docker で LAMP 環境を作ろう　第 4 回

## 前回までのあらすじ
サンプルのコンテナをダウンロードしてイメージを作成、起動。その後 hosts ファイルへの記述追加と netsh コマンドを使って、構築したコンテナにドメイン名でアクセスできるようにしました。
ただし

```
192.168.***.*** www.bulletin-board.internal
192.168.***.*** www2.bulletin-board.internal
```
のように、同じ IP アドレスに別名をつけても、`http://www2.bulletin-board.internal` で同じページが表示されてしまい、これでは目的が達せられないよね、というところで終わっています。
今回は、この点を何とかしてみましょう。

## 複数の IP アドレスを用意する

私の環境は Windows10 なので、タスクバー右端のネットワークのアイコンを右クリックして [ネットワークとインターネットの設定を開く] を選んで、順次 [ネットワークと共有センター] → [イーサネット] → [プロパティ] → [インターネット プロトコル バージョン4(TCP/PIv4) ] → [プロパティ] → [詳細設定(V)] と進み、 [追加] から適当な IP アドレスを追加してやればいいのですが、
・なかなか深いところにある
・複数の IP アドレスを一気に入力できない
ことから、なかなか面倒です。
こんなときは、前回もお世話になっている Windows PowerShell を管理者権限で開き、

```
netsh interface ip add address name="イーサネット" addr=192.168.xxx.xxx mask=255.255.255.0
```
等とすることで追加できます。
「イーサネット」の部分は「ローカル エリア接続」の人もいるかもしれません。
うまく追加できないときは ipconfig で確認してみてください。

さて、こんな感じで、私の環境では 192.168.xxx.1 ～ 5 まで追加しました。

## hosts とプロキシ設定の変更

さて、次は作った IP アドレスにドメインを紐づけます。
前回は www.bulletin-board.internal としましたが、長いので www.bb.internal にしちゃいます。

```
192.168.***.1 www.bb.internal
192.168.***.2 www2.bb.internal
```
前回セットしたプロキシもいったん削除し、新たに付け替えます。

```
PS C:\Windows\system32> netsh interface portproxy delete v4tov4 listenport=80 listenaddr=www.bulletin-board.internal
PS C:\Windows\system32> netsh interface portproxy add v4tov4 listenport=80 listenaddr=www.bb.internal connectport=8000 connectaddress=127.0.0.1
PS C:\Windows\system32> netsh interface portproxy show all
ipv4 をリッスンする:         ipv4 に接続する:

Address         Port        Address         Port
--------------- ----------  --------------- ----------
www.bb.internal 80          127.0.0.1       8000

PS C:\Windows\system32> ping www.bb.internal

www.bb.internal [192.168.xxx.1]に ping を送信しています 32 バイトのデータ:
192.168.xxx.1 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.xxx.1 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.xxx.1 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.xxx.1 からの応答: バイト数 =32 時間 <1ms TTL=128

192.168.xxx.1 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 0ms、最大 = 0ms、平均 = 0ms
```
正しく設定できているようです。

## 動作検証

まずは www.bb.internal にアクセスしてみます。
![bb8080.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1553328/f51135c3-2c60-2c60-bf85-453fcb8dced8.png)
こちらは成功、www2.bb.internal にアクセスすると
![bb2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1553328/cf713509-72ad-0d75-fee4-ea49d967cafc.png)
ということで、前回は見えてしまったものが見えなくなっています。
ついでにもうひとつコンテナを起動してみます。
D:\vm\node-bulletin-board\bulletin-board-app をコピーして D:\vm\nbb\bba を作成、起動します。
ただしこのままでは見た目の区別がつかないので、ちょっとだけ変更します。
site.css の 12 行目を変更して背景色を変更、

```
    background-color: rgb(98, 145, 41);
```
ついでに index.html の h1 も変えておきます。

```
    <h1>Welcome to the Bulletin Board2</h1>
```
この状態で起動し、http://localhost:8001/ にアクセスします。

```
$ docker build --tag bulletinboard:1.1 .
[+] Building 2.2s (11/11) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                                                        0.0s
 => => transferring dockerfile: 164B                                                                                                                                                        0.0s
 => [internal] load .dockerignore                                                                                                                                                           0.0s
 => => transferring context: 2B                                                                                                                                                             0.0s
 => [internal] load metadata for docker.io/library/node:current-slim                                                                                                                        1.9s
 => [auth] library/node:pull token for registry-1.docker.io                                                                                                                                 0.0s
 => [1/5] FROM docker.io/library/node:current-slim@sha256:8f8a97163bed5b292bcd7a92a96849ef7a4c1fc2b105b5579dff258307de25fe                                                                  0.0s
 => [internal] load build context                                                                                                                                                           0.0s
 => => transferring context: 655B                                                                                                                                                           0.0s
 => CACHED [2/5] WORKDIR /usr/src/app                                                                                                                                                       0.0s
 => CACHED [3/5] COPY package.json .                                                                                                                                                        0.0s
 => CACHED [4/5] RUN npm install                                                                                                                                                            0.0s
 => [5/5] COPY . .                                                                                                                                                                          0.1s
 => exporting to image                                                                                                                                                                      0.1s
 => => exporting layers                                                                                                                                                                     0.0s
 => => writing image sha256:777db44bd53c96fa547d958a6680af6a816a81b23f3b27fab3d4c1c43fc6216d                                                                                                0.0s
 => => naming to docker.io/library/bulletinboard:1.1                                                                                                                                        0.0s

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them

$ docker run --publish 8001:8080 --detach --name bb1 bulletinboard:1.1
fea5584bcdc5265510e98b3c7e47f4935efafc647badd025a3eac4a0f10a24a3
```
こちらも無事起動できました。

![bb8001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1553328/89b6851e-9fc2-c08b-0b8f-926b9e6d7941.png)

では最後の仕上げ、www2.bb.internal に localhost:8001 を割り当ててアクセスしてみます。

```
PS C:\Windows\system32> netsh interface portproxy add v4tov4 listenport=80 listenaddr=www2.bb.internal connectport=8001 connectaddress=127.0.0.1

PS C:\Windows\system32> netsh interface portproxy show all

ipv4 をリッスンする:         ipv4 に接続する:


Address         Port        Address         Port
--------------- ----------  --------------- ----------
www.bb.internal 80          127.0.0.1       8000
www2.bb.internal 80          127.0.0.1       8001
```
![bb21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1553328/8753579d-addf-2d01-7340-1b38be89b7b2.png)

成功です。

## 参考 URL

[Network Shell (netsh)](https://docs.microsoft.com/ja-jp/windows-server/networking/technologies/netsh/netsh)
普段あまり使わないけど知ってると便利な netsh コマンド（前回と一緒）。

[Docker で LAMP 環境を作ろう　第 1 回](https://qiita.com/shindomasayuki/items/4a7fea6dad00e0be84bc)
[Docker で LAMP 環境を作ろう　第 2 回](https://qiita.com/shindomasayuki/items/a786c43dc506bdbc4c13)
[Docker で LAMP 環境を作ろう　第 3 回](https://qiita.com/shindomasayuki/items/b99b13625558df12cb72)