helloworlds

not a noun, it's a verb

【docker】2つのdocker-composeを同一ネットワークにする

今回は、dockerでコンテナ同士を連携させる方法について書いていく。

※ docker-composeのインストールなどは過去の記事を参考にしてください!

【localstack】AWSサービスをローカル環境へ - helloworlds

連携させる手段として、docker-composeというツールを用います。 既にご存知の方は多々いるかと思います。

公式の概要などはこちらにあるので一読してみてもいいかもしれません!

docker-compose.ymlというファイルへ複数DockerImageI(サービス)を定義することによって、 1つのCommandでコンテナが立ち上げるようになっています。

公式のDockerImageを利用すれば、あっという間に環境を整えることが可能です。 また、portsやvolumesなどといった設定値も合わせて定義することが可能です。

便利なので、docker-compose.yml自体を複数使用して開発することがあるかと思います。 docker-compose.ymlを複数立ち上げて、そのサービス間での通信を必要とするケースがあるかもしれません。

この記事は、ローカルで開発する際、2つのdocker-compose.ymlを立ち上げて 同一ネットワークに設定し、相互間を持たせてみたいと思います。

準備

まず、なんでも良いので2つのdocker-compose.ymlを作成します。 いちいち作成するのが面倒で、もし既存のdocker-compose.ymlを使用しているプロジェクトがあるなら そちらを使用してもいいかもしれません。

  • docker-compose.yml (1)
version: '3'

services:
  localstack:
・
・ なにか適当に設定を記述
・
  • docker-compose.yml (2)
version: '3'

services:
  nginx:
      image: nginx
・
・ なにか適当に設定を記述
・

新しいネットワークを作成する

今回、2つのdocker-composeを繋ぐためのネットワークを作成します。

その前に現在のネットワークを確認してみましょう。

$ docker network ls

NETWORK ID, NAME, DRIVER, SCOPEの列が出てきたかと思います。 心当たりのないネットワークは、コンテナを立ち上げた際に自動で生成させたネットワークです。

さて、ネットワークを作成します。 任意のネットワークをつけましょう。 オプションのdriverを指定しないと、bridgeになります。 もう1つ、overlayを指定できます(Docker エンジンが動作する複数のホスト上に渡す)。 overlayは、いくつか条件を満たさなければならないため、今回はbridgeで問題ないです。 詳細は公式を確認!

$ docker network create --driver bridge <network_name>

作成したら、もう一度docker network lsをしてみて作成されていたら大丈夫です。

ネットワークの確認

作成したネットワークの詳細を確認しいきます。 上記で作成した名前を、network_nameに指定します。

$ docker network inspect <network_name>

すると、以下みたいなのが出力されるかと思います。

[
    {
        "Name": "network_name",
        "Id": "e4c82b4f54286624dac00444d9b183353fdc15ced6df873dd86sdd99a4cd62ee",
        "Created": "2018-05-28T03:07:27.101555731Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.26.0.0/16",
                    "Gateway": "172.26.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

Containersの項目にはまだ何も指定がないことが確認できます。

docker-composeファイルにnetworksの指定を追記する

ネットワークの作成ができたので、次はそれぞれ2つのdocker-compose.ymlファイルに networks定義を追記していきます。

  • docker-compose.yml (1)
version: '3'

services:
  localstack:
・
・ なにか適当に設定を記述
・
      networks:
         - network_name
networks:
  network_name:
    external: true
  • docker-compose.yml (2)
version: '3'

services:
  nginx:
      image: nginx
・
・ なにか適当に設定を記述
・
    networks:
      - network_name
networks:
  network_name:
    external: true

やっと立ち上げてみる

それぞれ、docker-compose.ymlがあるディレクトリで以下を実行。

$ docker-compose up

そして、localhost:<任意のport> ブラウザでアクセス!

問題なく表示されていれば完了です!

※ もしportがわからなくなっちゃったみたいな人は、docker psして PORTSの項目を確認してみましょう。

もしかすると、指定したportと違うportが開いている!ということがあるかもしれません。 そういうときは、docker-compose.yml内の各サービスにnetworks名の定義を設定をすると任意のportで大丈夫みたいです。

Tips

コード内でコンテナ名が使用できる

私は、node.jsをnginxを使用して動かしていたのですが、 nodeのコード側で同一docker-compose.ymlにないコンテナに対して、 コンテナ名でアクセスできることがわかりました!

例えば、APIなんかの開発で別docker-compose.ymlを叩きたいときなど、

http://<任意コンテナ名>:4572 とかでアクセスできます。

Kitematic

DockerのGUIであるKitematicを使用することで、 なんのコンテナでどこのportが使用されているか簡単の確認することができます。 まだ使用していない人は、1度くらい見てみてもいいかもしれませんね!

以上