目的
docker-compose で起動したコンテナは共通の Network 上にあるのでお互いに通信が可能だが、起動したいコンテナの数が増えてくると、1枚の docker-compose が肥大してしまう。
管理のために docker-compose を分けたいが、お互いに通信はできるようにしたい。
また、各コンテナには固定IPアドレスを付与したい。
共有する Docker ネットワークを作成する
ここでは shared-nw と名付けています。
固定IPアドレスを付与させるため、subnet も合わせて定義させています。
※docker-compose.yml のバージョンが3以上になると、gateway は定義できなかったように思います(未確認)。
$ docker network create shared-nw --subnet=172.30.0.0/16 --gateway=172.30.0.254
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
53bd0dc361fe shared-nw bridge local
docker-compose.yml 内で共有ネットワークを使用するように宣言する
1つ目
- コンテナ(services:)を定義する箇所で networks > shared-nw > ipv4_address と固定IPアドレスを付与します。
- networks: を services: と同階層に定義し、使用するネットワーク(shared-nw) を宣言します。また、external: true とすることで、この docker-compose.yml 内ではなく、外部で定義されているネットワークを探すように指定します。
(省略)
services:
{サービス名}:
networks:
shared-nw:
ipv4_address: 172.30.0.2
(省略)
networks:
shared-nw:
external: true
2つ目
1つ目と同様に宣言していきます。
固定IPアドレスに1つ目とは違うアドレスを設定しています。
(省略)
services:
{サービス名}:
networks:
shared-nw:
ipv4_address: 172.30.1.2
(省略)
networks:
shared-nw:
external: true
両方の docker-compose を起動した上で通信確認してみます。
inet addr:172.30.1.2 のコンテナから、172.30.0.2 のコンテナに対して PING が通ることが確認できました。
$ docker exec spark-master101 ifconfig | grep "inet addr"
inet addr:172.30.1.2 Bcast:172.30.255.255 Mask:255.255.0.0
inet addr:127.0.0.1 Mask:255.0.0.0
$ docker exec spark-master101 ping 172.30.0.2
PING 172.30.0.2 (172.30.0.2): 56 data bytes
64 bytes from 172.30.0.2: seq=0 ttl=64 time=0.168 ms
64 bytes from 172.30.0.2: seq=1 ttl=64 time=0.111 ms
64 bytes from 172.30.0.2: seq=2 ttl=64 time=0.099 ms
結論
予め Docker network を作成しておく必要はありますが、docker-compose を分けて作成
しておけるメリットがあるので、ローカルで個人で管理する分には問題なさそうです。