以前の記事ではすべて 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 | version: '2' |
キモになるのが networks
という要素です。下 4 行に使用する Docker ネットワークを宣言しており、それぞれのコンテナ( proxy
と primary
)の中にも記述があります。 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 | version: '2' |
こちらも networks
と enviroment
を書いておくことを忘れずに。
それぞれの ‘docker-compose.yml’ のあるディレクトリで docker-compose up -d
とやると、前回と同様の構造の Web ページが動きます。 Docker ネットワークの指定に気をつければ、これ以上の ‘docker-compose.yml’ があっても正しくリバースプロキシが動いてくれるはずです。( Docker ネットワークのバグ云々の話もちらっと見かけたので、今後は推奨方法が変わるかもしれせん)