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

## コンテナにドメイン名でアクセスしよう！

前回までの Docker Desktop の導入と動作検証では、ほとんど作業らしい作業をせずに掲示板が動かすことができました。

でも、「ドメインが localhost 固定で、アクセス先のコンテナはポート番号で指定する」では実働に耐える開発環境にはなりません。前回のコンテナなら「 `http://www.bulletin-board.internal` 」みたいな感じでアクセスしたいわけです。
というわけで、今回はコンテナの起動オプションについて掘り下げてみます。

## ドメイン名でアクセスできるコンテナの起動の仕方

まずは、いつも頼りにしている Docker-docs-ja で、それらしい記事がないか探してみると、
**[Docker Desktop for Windows のネットワーク構築機能](https://docs.docker.jp/docker-for-windows/networking.html)**
に行きつきました。
前回までと同様、簡単に解決するのかと思いきや

**「Windows には docker0 ブリッジがありません」
「コンテナごとに IP アドレスを割り当てられません」**

という、衝撃的な見出しが並びます。
続く「利用例と回避方法」を見ても、単に localhost に対するポート・フォワーディングについて書かれているだけで、なんの解決にもなりません。
実際「docker desktop ipアドレス指定」などで検索してみると死屍累々です。うまくいった、という話が全然出てきません。
仕方ないので方針変更です。

## ドメイン名でアクセスできる環境構築

そもそも前回の起動オプション

```
$ docker run --publish 8000:8080 --detach --name bb bulletinboard:1.0
```
は「localhost:8000 へのアクセスをコンテナの 8080 に渡しなさい」という意味でした。
ならば Docker に頼らず `www.bulletin-board.internal:80` へのアクセスが `localhost:8000` に渡されるようにしてやればよさそうです。

ではさっそくやってみましょう。

hosts に

```
192.168.***.*** www.bulletin-board.internal
```
を追記します（IP アドレスは自身の環境に合わせてください）。

次に Windows PowerShell などを起動し、下記のコマンドを実行します。

```
PS C:> netsh interface portproxy add v4tov4 listenport=80 listenaddr=192.168.***.*** connectport=8000 connectaddress=127.0.0.1
```
念のため確認

```
PS C:> netsh interface portproxy show all

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

Address         Port        Address         Port
--------------- ----------  --------------- ----------
192.168.***.***  80          127.0.0.1       8000
```
うまく設定できているようです。
実際にブラウザでアクセスしてみると
`http://192.168.***.***:80`
`http://192.168.***.***`
`http://www.bulletin-board.internal:80`
`http://www.bulletin-board.internal`
いずれも localhost:8000 と同じ表示になります。

これにて**「ドメイン名でアクセスできる環境構築」** は完了、と行きたいところですが、これではダメなことに気づきました。
今回は１コンテナへのポート・フォワーディングなので、netsh で `192.168.***.***:80 -> 127.0.0.1:8000` と設定できましたが、実際の開発環境は複数のコンテナを起動して、それぞれに名前をつけて連動させることを想定しています。
各ドメインに別 IP アドレスを割り振ってやればこの方法でも行けそうですが、なんか面倒です。
単一の IP アドレスに

```
192.168.***.*** www.bulletin-board.internal
192.168.***.*** www2.bulletin-board.internal
192.168.***.*** www3.bulletin-board.internal
192.168.***.*** api.bulletin-board.internal
192.168.***.*** db.bulletin-board.internal
```
みたいな感じで複数ホスト名を割り当てたい。

[Netsh interface portproxy コマンド](https://docs.microsoft.com/ja-jp/windows-server/networking/technologies/netsh/netsh-interface-portproxy)

を見ると、ホスト名でも指定できそうなのでやってみます。
先の設定を削除して

```
PS C:> netsh interface portproxy delete v4tov4 listenport=80 listenaddr=192.168.***.***
PS C:> netsh interface portproxy show all
PS C:>
```

ホスト名で再指定

```
PS C:> netsh interface portproxy add v4tov4 listenport=80 listenaddr=www.bulletin-board.internal connectport=8000 connectaddress=127.0.0.1

PS C:> netsh interface portproxy show all

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

Address         Port        Address         Port
--------------- ----------  --------------- ----------
www.bulletin-board.internal 80          127.0.0.1       8000
PS C:>
```
Address 部分が長くて見出しと値がそろっていませんが、設定できているようです。
`http://www.bulletin-board.internal` もちゃんと見えています。

最後にもう一つ、hosts に同じ IP アドレスで別ホストを追加してみます。

```
192.168.***.*** www.bulletin-board.internal
192.168.***.*** www2.bulletin-board.internal
```
これで `http://www2.bulletin-board.internal` にアクセスしたときに「アクセスできません」なら万事 OK なんですが。

 なんと、先ほど同じページが表示されます。同一 IP アドレスではダメなのでしょうか？
うむむ。
次回に続く。

##参考 URL

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

[Windows/Linuxでポートフォワーディングする方法](https://kagasu.hatenablog.com/entry/2018/01/29/184205)

[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)