概要
私は最近サーバーの構築方法としてDockerのコンテナを利用しています。
今回、Dockerを利用して複数のコンテナを動かす際に、コンテナ間の連携でつまづいてしまったので、そのことについて書いていきます。
Dockerの利用
私はサーバーの構築に、それぞれのアプリケーションを別々のサーバーで動かすよりもリソースの削減ができ、たくさんのサーバーを管理する必要もなくなるということで、Dockerを利用しています。
例えば、何かのWebアプリケーションを公開したい場合には、直接Dockerのコマンドを利用するよりも管理しやすいDocker Composeを利用して、コンテナとしてWebアプリケーションを動かしています。
ネットワークの分離による問題
主に直接Dockerを利用せず、Docker Composeを介してDockerを利用しているのですが、この利用で問題が発生しました。
どのような問題かというと、別々のdocker-compose.ymlファイルを元に実行したコンテナ間で通信を行いたい場合にうまくいかないという問題です。
これは、例えばデータベースサーバーとなるコンテナを別に作成した後に、そこと通信を行うコンテナで通信ができないということであり、とても不便です。
調べてみると、これはDocker Composeでコンテナを作成する際にDockerのネットワークを新たに作成してそこに接続しており、別々のネットワークであるため通信ができないというのが原因のようです。つまり、docker-compose.ymlで作成したコンテナごとにネットワークが分離されているということです。
問題の解消
このようなネットワークの分離による問題の解決方法として、Docker Composeでは、ネットワークの設定ができるようになっています。つまり、あらかじめネットワークを作成しておいて、それをコンテナが利用するようにすれば良いということです。
今回私が問題を解決させた方法を次に紹介します。
まず最初に、コンテナ間で共有するDockerのネットワークを作成します。ここではshare-networkという名前でネットワークを作成しました。
docker network create share-network
次にネットワークを共有したい、それぞれのdocker-compose.ymlファイルに次の内容を追加します。
version: '3'
services:
app:
image: ***
networks:
- default
- share-network
networks:
share-network:
external: true
追加となる部分は、networksの部分です。一番最後の行のexternal: trueはDocker Composeが自動で作成するネットワークではなく、既存のネットワークがあることを示しています。また、- defaultや- share-networkは、コンテナが接続するネットワークを示しており、defaultはDocker Composeが各docker-compose.yml毎に作成するデフォルトのネットワークになります。defaultはなくても動きますが、一応ここでは記述しておきます。
このような記述の後に、Docker Composeでコンテナを実行し直せば、設定が反映され、通信が可能となります。
さいごに
Dockerは、たまにハマりどころがあり、苦労することもありますが、使いこなすことができればとても便利と感じています。
同じような悩みを抱えている人の参考になれば幸いです。