LoginSignup
135

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-12-12

概要

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

最後に

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

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
135