概要
Dockerで複数の開発支援サーバを立てるのがとても楽になりました。なのですが、各開発支援サーバへのアクセスをポート番号で分けていると、だんだんと混乱してきます。そこで考えるのがリバースプロキシで、__nginx__などで比較的簡単に実現できます。
リバースプロキシを簡単に実現出来る__nginx-proxy__を使ったサンプルについてメモしておきます。
やりたいこと
VirtualBoxでたてたDockerホスト上のコンテナをリバースプロキシの背後で動かすようにします。
具体的には、Jenkinsを扱う際は、
http://192.168.99.101:8080/
でしたが、
http://jenkins.dev/
でアクセスできるようにします。
Docker環境の構成
こんな感じのDocker環境が構成されているものとします。(緑の__Proxy__が今回導入するリバースプロキシ用のコンテナです。)
docker-compose.ymlに__nginx_proxy__を仕込む
こんな感じで指定します。__environment__の部分に注目です。__VIRTUSL_HOST__で、Dockerコンテナ用のバーチャルホストを指定します。さらに、__VIRTUAL_PORT__で、そのDockerコンテナが公開しているポートを指定します。
# 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での設定は以下の通りです。
...
192.168.99.101 jenkins.dev
...
なお、ホストPC以外からアクセスさせたい場合は、アクセスしたいPCごとに、/etc/hostsを設定してやります。バーチャルホストと対応づけるのは、Dockerホストを提供するホストPCのIPアドレスです。上記のネットワーク構成であれば、こんな感じにします。
...
192.168.1.140 jenkins.dev
...
この場合は素直にDNSに登録するのが無難です。
あと、VirtualBoxのネットワーク設定でNAT側のポートフォワード設定が必要です。ホストの8080番ポートをゲスト(Dockerホスト)の80番ポートへ転送する設定です。
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#
...
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/
にアクセスします。
最後に
便利なものを提供してくれる方に本当に感謝です。