54

ドッカーを学んでいます。これらの2つの用語が私を混乱させているようです。たとえば、2 つのサービスredisとを定義した docker-compose を次に示しますweb-app

services:
  redis:
    container_name: redis
    image: redis:latest
    ports:
      - "6379:6379"
    networks:
      - lognet

  app:
    container_name: web-app
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    volumes:
      - ".:/webapp"
    links:
      - redis
    networks:
      - lognet

networks:
  lognet:
    driver: bridge

このdocker-composeファイルは、lognet という名前のブリッジ ネットワークを定義し、すべてのサービスがこのネットワークに接続します。私が理解しているように、このアクションにより、これらのサービスは他のサービスを見ることができます。では、上記のケースでアプリ サービスがまだ redis サービスにリンクする必要があるのはなぜですか。

ありがとう

4

1 に答える 1

83

リンクはネットワークに置き換えられました。Docker は、それらを使用を避けるべきレガシー機能として説明しています。リンクを安全に削除すると、2 つのコンテナーがサービス名 (または container_name) で相互に参照できるようになります。

Compose では、リンクには暗黙の依存関係を作成するという副作用があります。これをより明示的なdepends_onセクションに置き換える必要があります。これにより、アプリが redis の起動なしまたは起動前に実行されないようにします。

余談ですが、これがホスト上にその名前で存在する唯一のコンテナーであり、docker cli から名前で参照する必要があることが確実でない限り、私は container_name をハードコーディングするのは好きではありません。コンテナ名がない場合、docker-compose はあまり直感的ではない名前を付けますが、ネットワーク上の redis のエイリアスも付けます。これは、まさにコンテナ間のネットワークに必要なものです。したがって、これらの提案の最終結果は次のとおりです。

version: '2'
# do not forget the version line, this file syntax is invalid without it

services:
  redis:
    image: redis:latest
    ports:
      - "6379:6379"
    networks:
      - lognet

  app:
    container_name: web-app
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    volumes:
      - ".:/webapp"
    depends_on:
      - redis
    networks:
      - lognet

networks:
  lognet:
    driver: bridge
于 2016-12-23T02:57:07.550 に答える