web-dev-qa-db-ja.com

docker-compose:ネットワークとリンクの違い

私はdockerを学んでいます。これらの2つの用語は私を混乱させます。たとえば、2つのサービスredisおよびweb-appを定義したdocker-composeは次のとおりです。

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サービスにリンクする必要があるのはなぜですか。

ありがとう

30
Trần Kim Dự

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

構成では、リンクには暗黙的な依存関係が作成されるという副作用があります。これをより明示的な 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
44
BMitch