Docker の nginx-proxy と DNS レコード設定

今年の 11 月中にサーバーを替える予定ですが、それに合わせて WordPress のブログを刷新しようと考え、 8 月中はずっとテーマを作っていました。

それが終わったので今度はサーバー構築に使おうとしているDockerを触って検証している段階ですが、その中でのメモを備忘録として残しておきます。意外と Docker には横断的な情報が少ないように感じます。

準備など

今回はセオリー通り、 1 つの “nginx” コンテナをリバースプロキシ専用に使います。 Docker の実行環境そのものを載せる OS として CentOS 7.2 を使っていますが、 CoreOS のような軽量 OS でも十分だと思います。

まず、 Docker のインストールは Docker 公式の “Installation on CentOS” の手順に沿って行います。(簡単)

次に “nginx-proxy” という Docker イメージをそのまま Docker コンテナとして動かしてしまいます。構成のイメージとしては VirtualHostをお手軽に実現できるDockerコンテナnginx-proxyの起動方法が詳しいと思います。(説明も詳しい)

構成例

今回実装したい構成は以下の通り。リバースプロキシ用 Docker コンテナが1つと、バックエンドサーバー用の Docker コンテナが3つあります。割当 IP アドレスを "123.45.67.89″ 、独自ドメインを “hoge-domain.com” と仮定します。サブドメインとして “foo.hoge-domain.com” と “bar.hoge-domain.com” も使います。

手順

“nginx-proxy” Docker イメージに従い、下のリストのようにコマンドを実行していきます。もしデフォルトホスト名を指定したい場合は、1行目に -e DEFAULT_HOST=hoge-domain.com のオプションを加えてください。(ルールが無いどんなドメインでのアクセスも “hoge-domain.com” のページが表示される)

1
2
3
4
5
docker run -d -p 80:80 \
-v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
docker run -d -e VIRTUAL_HOST=hoge-domain.com --name first nginx
docker run -d -e VIRTUAL_HOST=foo.hoge-domain.com --name second nginx
docker run -d -e VIRTUAL_HOST=bar.hoge-domain.com --name third nginx

一見 Docker コンテナを作成・実行しているだけのように思えますが、最初の “nginx-proxy” の機能により、プロキシの設定も自動で行われます。(手元の環境では少しだけ時間がかかった)

動作の確認する際はそれぞれの “nginx” の Docker コンテナ内の内容を少し変えた方がわかりやすいですが、ここでは説明は省いています。 Dockerfile を使って新しい Docker イメージを作成したり、 Docker コンテナにアクセスしてコマンドで操作するなどの方法が楽なようです。

外部への公開

ポートを開けたうえで外部からブラウザで独自ドメイン名を使ってアクセスしても、何もしていなければページは見られないと思います。

このとき、 DNS レコードの登録が必要になります。ドメインを契約したサイトなどで DNS レコードの設定ページを開き、今回の構成では下の情報を記述します。

Name Type Value
(empty) A 123.45.67.89
foo CNAME hoge-domain.com
bar CNAME hoge-domain.com

設定してから少し時間を置く必要がありましたが、これで “hoge-domain.com” 、 “foo.hoge-domain.com” 、 “bar.hoge-domain.com” という名前でアクセスできるようになります。