前回までのあらすじ
サンプルのコンテナをダウンロードしてイメージを作成、起動。その後 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 にアクセスしてみます。
こちらは成功、www2.bb.internal にアクセスすると
ということで、前回は見えてしまったものが見えなくなっています。
ついでにもうひとつコンテナを起動してみます。
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
こちらも無事起動できました。
では最後の仕上げ、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
成功です。
参考 URL
Network Shell (netsh)
普段あまり使わないけど知ってると便利な netsh コマンド(前回と一緒)。
Docker で LAMP 環境を作ろう 第 1 回
Docker で LAMP 環境を作ろう 第 2 回
Docker で LAMP 環境を作ろう 第 3 回