web-dev-qa-db-ja.com

docker composeでリンクとスケーリングはどのように連携しますか?

Docker composeについての私の理解は次のとおりです。

  • サービスを「スケーリング」して、一度に複数のコンテナーで実行できます。
  • サービスAをサービスBにリンクすると、サービスAはサービスBを実行しているコンテナーにアクセスできます。

私の理解は正しいですか?そうであれば、サービスを実行している複数のコンテナーがある場合、リンクはどこに接続しますか?

34
Gaelan

まず最初に、デフォルトで、コンテナを他のコンテナとリンクするかどうかに関係なく、すべてのコンテナが同じホストで実行されている他のコンテナから(コンテナIPを使用して)可視であることを明確にします。この動作は、Dockerデーモンのicc=trueフラグを使用して変更できます。

Docker-composeを使用したリンクに関しては、リンク付きのコンテナーが作成されるときに生成されます。例で見てみましょう。このdocker-compose.ymlを使用する

web:
  build: .
  command: python app.py
  ports:
   - "5000:5000"
  volumes:
   - .:/code
  links:
   - redis
redis:
  image: redis

docker-compose up -dを実行すると、web_1コンテナがredis_1のコンテナにリンクされます。

        (...)
        "Links": [
        "/compose_redis_1:/compose_web_1/compose_redis_1",
        "/compose_redis_1:/compose_web_1/redis",
        "/compose_redis_1:/compose_web_1/redis_1"
    ], (...)

次に、docker-compose scale redis=2を使用してredisサービスをスケーリングします。それを実行した後(および新しいコンテナredis_2を作成した後)、web_1のリンクは変更されません。

        (...)
        "Links": [
        "/compose_redis_1:/compose_web_1/compose_redis_1",
        "/compose_redis_1:/compose_web_1/redis",
        "/compose_redis_1:/compose_web_1/redis_1"
    ], (...)

作成されたこれらのリンクを表示するには、web_1を停止、削除、実行する必要があります。

docker-compose stop web
docker-compose rm web
docker-compose run -d web
docker inspect compose_web_run_2
(...)        "Links": [
        "/compose_redis_1:/compose_web_run_2/compose_redis_1",
        "/compose_redis_2:/compose_web_run_2/compose_redis_2",
        "/compose_redis_1:/compose_web_run_2/redis",
        "/compose_redis_1:/compose_web_run_2/redis_1",
        "/compose_redis_2:/compose_web_run_2/redis_2"
    ],(...)

そして/etc/hostsコンテナのweb_1

172.17.0.24 7be2dabea910
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.21 compose_redis_1 8a1297a5b3e4
172.17.0.23 compose_redis_2 069dd46836aa
172.17.0.21 redis 8a1297a5b3e4 compose_redis_1
172.17.0.21 redis_1 8a1297a5b3e4 compose_redis_1
172.17.0.23 redis_2 069dd46836aa compose_redis_2

新しいリンクを生成するには、コンテナーを停止、削除、および再実行する必要があります。

30