Dockerコンテナへのアクセスをドメインごとに変更する「nginx-proxy」レビュー
Dockerでは一般的に次のようなコマンドを実行します。
$ docker run -d -p 8080:80 wordpress
この場合、ホストマシンへの8080番へのアクセスをコンテナの80番ポートへつなぐという意味になります。そのためURLとしては、
http://ホストのアドレス:8080/
といったポート番号を使ったサーバアクセスになります。しかしこれはコンテナが増えていった場合にあまり格好良くありません。そこで 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番ポートにアクセスするのと同じです。
さらに、
$ 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 のどちらもドメイン名が引けるようになっていなければなりません。
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)