リバースプロキシを使ってDockerコンテナへのアクセスをポート番号でなくホスト名で分ける


# 概要

Dockerで複数の開発支援サーバを立てるのがとても楽になりました。なのですが、各開発支援サーバへのアクセスをポート番号で分けていると、だんだんと混乱してきます。そこで考えるのがリバースプロキシで、__nginx__などで比較的簡単に実現できます。

リバースプロキシを簡単に実現出来る__nginx-proxy__を使ったサンプルについてメモしておきます。


# やりたいこと

VirtualBoxでたてたDockerホスト上のコンテナをリバースプロキシの背後で動かすようにします。

具体的には、Jenkinsを扱う際は、

```
http://192.168.99.101:8080/
```

でしたが、

```
http://jenkins.dev/
```

でアクセスできるようにします。


# Docker環境の構成

こんな感じのDocker環境が構成されているものとします。（緑の__Proxy__が今回導入するリバースプロキシ用のコンテナです。）

![スクリーンショット 2015-12-13 3.11.33.png](https://qiita-image-store.s3.amazonaws.com/0/79341/e41ef652-15ef-771a-7e24-afb9b5b0d8ec.png "スクリーンショット 2015-12-13 3.11.33.png")



# docker-compose.ymlに__nginx_proxy__を仕込む

こんな感じで指定します。__environment__の部分に注目です。__VIRTUSL_HOST__で、Dockerコンテナ用のバーチャルホストを指定します。さらに、__VIRTUAL_PORT__で、そのDockerコンテナが公開しているポートを指定します。

```yaml:docker-compose.yml
# nginx-proxy
proxy:
  image: jwilder/nginx-proxy
  ports:
    - "80:80"
  volumes:
    - /var/run/docker.sock:/tmp/docker.sock:ro

# jenkins container
jenkins:
  image: jenkins
  volumes_from:
    - jenkins_data
  #ports:
  #  - "8080:8080"
  environment:
    - VIRTUAL_HOST=jenkins.dev
    - VIRTUAL_PORT=8080

・・・
```


# バーチャルホストとDockerホストのIPアドレスを対応づける

先ほどのバーチャルホストとDockerホストのIPアドレスを対応付けます。手軽に__/etc/hosts__にバーチャルホストを登録します。

VirtualBoxのホストOSでの設定は以下の通りです。

```:/etc/hosts
...
192.168.99.101	jenkins.dev
...
```

なお、ホストPC以外からアクセスさせたい場合は、アクセスしたいPCごとに、/etc/hostsを設定してやります。バーチャルホストと対応づけるのは、Dockerホストを提供するホストPCのIPアドレスです。上記のネットワーク構成であれば、こんな感じにします。

```:/etc/hosts
...
192.168.1.140	jenkins.dev
...
```

この場合は素直にDNSに登録するのが無難です。

あと、VirtualBoxのネットワーク設定でNAT側のポートフォワード設定が必要です。ホストの8080番ポートをゲスト(Dockerホスト)の80番ポートへ転送する設定です。

![スクリーンショット 2015-12-13 2.24.11.png](https://qiita-image-store.s3.amazonaws.com/0/79341/f1df016a-6a64-f5ef-ba21-0b025c937aa9.png "スクリーンショット 2015-12-13 2.24.11.png")


> Windowsの場合
> C:¥Windows¥System32¥drivers¥etc¥hosts にあります。
> __「Power Users」__に読み取り権限が必要です。（もしかすると「読み取りと実行」かも）


# Dockerコンテナを再構築する

再起動でなく__再構築__です。

```
$ docker-compose stop jenkins

$ docker-compose rm -f jenkins

$ docker-compose up -d jenkins
```

nginx_proxyコンテナの設定ファイルはこんな感じになります。

```
$ docker ps |grep proxy
44da50d027a8        jwilder/nginx-proxy           "/app/docker-entrypoi"   15 hours ago        Up 8 minutes        0.0.0.0:80->80/tcp, 443/tcp                                                 dev_proxy_1
```

```
$ docker exec -it dev_proxy_1 bash
root@44da50d027a8:/app#
```

```/etc/nginx/conf.d/default
...

upstream jenkins.dev {
			# dev_jenkins_1
			server 172.17.0.12:8080;
}
server {
	server_name jenkins.dev;
	listen 80 ;
	access_log /var/log/nginx/access.log vhost;
	location / {
		proxy_pass http://jenkins.dev;
	}
}

...
```


# リバースプロキシ経由でアクセスする

ブラウザで`http://jenkins.dev/`にアクセスします。

![スクリーンショット 2015-12-13 3.08.32.png](https://qiita-image-store.s3.amazonaws.com/0/79341/43c7afb1-8061-0111-3aa9-033284172bcd.png "スクリーンショット 2015-12-13 3.08.32.png")





# 最後に
便利なものを提供してくれる方に本当に感謝です。


# 参考
- [jwilder/nginx-proxy](https://github.com/jwilder/nginx-proxy)
- [Dockerコンテナへのアクセスをドメインごとに変更する「nginx-proxy」レビュー](http://knowledge.sakura.ad.jp/tech/3142/)
- [Windows10マシンにDocker Toolbox を入れて個人用の開発環境を作る](http://qiita.com/osuo/items/99a2b7413ce75f8217be)