Docker の nginx-proxy と Docker Compose

以前の記事ではすべて docker コマンドから一つ一つコンテナを実行していましたが、今回は Docker Compose を使って構築したいと思います。

Docker Compose そのものの使い方は公式ドキュメントや他のページが詳しいので、この記事では nginx-proxy で使う際に必要なことを書いておきます。

構成例

以前と同じく “nginx-proxy” のコンテナをリバースプロキシにし、3つのHTML表示用の “nginx” コンテナを Web サーバーとして実行させます。アクセスした際の挙動は全く同じになります。

今回は “nginx-proxy” のコンテナ1つと “nginx” のコンテナ 1 つを 1 つのグループとして、残りの “nginx” のコンテナ2つを別のグループとして分けることとし、それぞれ ‘docker-compose.yml’ を記述します。

ネットワークの作成

説明のために予め出してしまいますが、 Docker Compose を使う際は Dockerネットワーク機能というものを使う設定にする必要があります。

使うためには作っておく必要がありますが、 “proxy_net” を Docker ネットワーク名だとすると、 docker network create proxy_net で作成できます。 Docker Compose を使用する場合には、作成した Docker ネットワークを通じて “nginx-proxy” にプロキシ構築を依頼するようにする必要があります。

‘docker-compose.yml’ を書く

使用する Docker ネットワークの準備ができたので、 Docker Compose のためのファイルを記述していきます。まずは “nginx-proxy” のコンテナ 1 つと Web サーバーのコンテナが 1 つ入っているグループから。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
version: '2'

services:
proxy:
image: jwilder/nginx-proxy
container_name: proxy
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
networks:
- proxy_net

primary:
image: nginx
container_name: primary
environment:
- VIRTUAL_HOST=hoge-domain.com
networks:
- proxy_net

networks:
proxy_net:
external:
name: proxy_net

キモになるのが networks という要素です。下 4 行に使用する Docker ネットワークを宣言しており、それぞれのコンテナ( proxyprimary )の中にも記述があります。 external というのは外部で作成した Docker ネットワークを指しています。外部で作られた Docker ネットワーク名を改めて書くこともできます。

ここでは外部で定義された proxy_net という名前の Docker ネットワークを、同名の proxy_net という名前で使用しています。外部と内部で違う名前にもできますし、今回のように同名なら external: true と書くこともできます。

‘docker-compose.yml’ 内でも新しい Docker ネットワーク名を作成させることができますが、 ‘docker-compose.yml’ から生成される際につけられる名前の関係上、外部に通じる Docker ネットワークを使用する際は、今のところは外部で作成したものを指定するのがよさそうです。

Docker Compose を使わなかった場合では -e VIRTUAL_HOST=hoge-domain.com というオプションをコマンドに加えましたが、‘docker-compose.yml’ に記述する際は environment という、環境変数を指定する要素に書きます。

次に Web サーバーのコンテナが 2 つ入った方の記述です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
version: '2'

services:
secondary:
image: nginx
container_name: secondary
environment:
- VIRTUAL_HOST=foo.hoge-domain.com
networks:
- proxy_net

tertiary:
image: nginx
container_name: tertiary
environment:
- VIRTUAL_HOST=bar.hoge-domain.com
networks:
- proxy_net

networks:
proxy_net:
external:
name: proxy_net

こちらも networksenviroment を書いておくことを忘れずに。

それぞれの ‘docker-compose.yml’ のあるディレクトリで docker-compose up -d とやると、前回と同様の構造の Web ページが動きます。 Docker ネットワークの指定に気をつければ、これ以上の ‘docker-compose.yml’ があっても正しくリバースプロキシが動いてくれるはずです。( Docker ネットワークのバグ云々の話もちらっと見かけたので、今後は推奨方法が変わるかもしれせん)

参照記事