nginx
docker
docker-compose
docker-machine
nginx-proxy

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

More than 1 year has passed since last update.

概要

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

docker-compose.ymlにnginx_proxyを仕込む

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

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

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

最後に

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

参考