Dockerコンテナへのアクセスをドメインごとに変更する「nginx-proxy」レビュー

Dockerでは一般的に次のようなコマンドを実行します。

$ docker run -d -p 8080:80 wordpress

この場合、ホストマシンへの8080番へのアクセスをコンテナの80番ポートへつなぐという意味になります。そのためURLとしては、

http://ホストのアドレス:8080/

といったポート番号を使ったサーバアクセスになります。しかしこれはコンテナが増えていった場合にあまり格好良くありません。そこで nginx-proxy を使ってドメインを割り当てたアクセスを行うようにしましょう。

jwilder/nginx-proxy

用意するもの

  • Linuxサーバ(今回はさくらのクラウドでUbuntu 14.04 LTSを使ってます)
  • Docker(今回は1.0.1を使っています)

nginx-proxyの実行

まず nginx-proxy を起動します。これはDockerイメージで配布されています。

$ docker run -d -p 80:80 --name nginx -v /tmp/nginx:/etc/nginx/conf.d -t nginx

これは見ての通り、ホストの80番ポートへのアクセスをそのまま受け取る仕組みになっています。

docker-genのインストール

次に docker-gen をインストールします。これはDockerのコンテナ設定を生成するライブラリです。

$ mkdir -p /tmp/templates && cd /tmp/templates
$ curl -o nginx.tmpl https://raw.githubusercontent.com/jwilder/docker-gen/master/templates/nginx.tmpl
$ docker run -d --name nginx-gen --volumes-from nginx \
   -v /var/run/docker.sock:/tmp/docker.sock \
   -v /tmp/templates:/etc/docker-gen/templates \
   -t jwilder/docker-gen:0.3.4 -notify-sighup nginx -watch \
   --only-published /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf

docker-gen はDockerのソケットファイルを監視しており、起動するタイミングや逆にkillされるタイミングで設定を変更します。

WordPressを立ち上げてみる

では実際に試してみたいと思います。利用時のコツとしては、 -e VIRTUAL_HOST=ドメイン名 をつけて実行します。

$ sudo docker run -e VIRTUAL_HOST=dev2.moongift.jp --name wordpress1 -d -p 8080:80 moongift/wordpress

例えばこのコマンドで dev2.moongift.jp にアクセスするとWordPressが立ち上がっています。これは8080番ポートにアクセスするのと同じです。

WordPressを立ち上げた例。dev2.〜でアクセスしています
WordPressを立ち上げた例。dev2.〜でアクセスしています

さらに、

$ sudo docker run -e VIRTUAL_HOST=dev3.moongift.jp --name wordpress2 -d -p 8081:80 moongift/wordpress

のように作ると、 dev3.moongift.jp というアドレスで別なWordPressが立ち上がります。もちろん dev2.moongift.jp / dev3.moongift.jp のどちらもドメイン名が引けるようになっていなければなりません。

別なWordPressを立ち上げ。バーチャルホストでアクセスできます
別なWordPressを立ち上げ。バーチャルホストでアクセスできます

nginx-proxy を使えばVirtual HostベースでアクセスできるようになるのでDockerで作成したコンテナへのアクセスが容易になります。使い方としても VIRTUAL_HOST を指定すれば良いだけです。Herokuのようなサービスも容易に実現できます。これまでのポート番号ごとのアクセスに比べて格段に使い勝手が良くなります。

nginx-proxy の場合、ドメイン名を自由に変えられるので、 dev1.moongift.jp だけでなく dev1.moongift.com や example.example.com のように自由にアドレスを指定できます。Dockerをサービスの中で使っていく際に役立つことでしょう。

さらにはTLSにも対応していますので、ドメインごとに証明書を指定したり、サブドメイン対応の証明書を使ってすべてのコンテナをセキュアに通信させることも可能です。ぜひお試しください。

[jwilder/nginx-proxy](https://github.com/jwilder/nginx-proxy)