web-dev-qa-db-ja.com

Docker_compose.ymlにおけるリンクとdepends_onの違い

Docker Composeの compose-file documentation によると、

  • depends_on - サービス間の依存関係を表現する.
  • links - 他のサービスのコンテナへのリンク、およびdepends_on と同じ方法でサービス間の依存関係の表現

私は他のコンテナにリンクする目的を理解していないので、2つのオプションの違いはまだ私にとってはかなり難しいようです。

例があればもっと簡単になるでしょうが、見つけられません。

私は、コンテナーBをコンテナーAにリンクすると、コンテナーBはコンテナーAのシェル内で「ping可能」になることに気付きました。

私はコンテナAのbashの中でping Bを実行し、このような結果を得ました(参考のために、インターネットからの画像)

enter image description here

211
itsjef

linksオプションが廃止された後、投稿は更新が必要です。

基本的に、linksはもはや必要ありません。その主な目的は、環境変数を追加することによって別の人がコンテナにアクセスできるようにするためです。networkには暗黙のうちに含まれます。コンテナが同じネットワークに配置されている場合、それらはコンテナ名と他のエイリアスをホストとして使用して互いに到達可能です。

docker runの場合、--linkも非推奨であり、カスタムネットワークに置き換える必要があります。

docker network create mynet
docker run -d --net mynet --name container1 my_image
docker run -it --net mynet --name container1 another_image

depends_onは開始順序(そして暗黙のうちに画像を引き出す順序)を表します。これはlinksの良い副作用でした。

36
Siyu

この答えはdocker-compose version 2 に対するもので、 version 3 でも動作します。

depends_onを使用してもデータにアクセスできます。

Docker docs Docker ComposeとDjango を見ると、データベースにアクセスすることができます。

version: '2'
services:
  db:
    image: postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

Linksとdepends_onの違いは何ですか?

リンク:

たとえば、データベース用のコンテナを作成すると、次のようになります。

docker run -d --name=test-mysql --env="MYSQL_ROOT_PASSWORD=mypassword" -P mysql

docker inspect d54cf8a0fb98 |grep HostPort

そしてあなたは見つけるかもしれません

"HostPort": "32777"

つまり、データベースをlocalhostポート32777(コンテナー内の3306)から接続できますが、このポートはコンテナーを再起動または削除するたびに変わります。そのため、リンクを使用して、常にデータベースに接続し、それがどのポートであるかを知る必要がないようにすることができます。

web:
  links:
   - db

depends_on:

Giorgio FerrarisからNiceブログを見つけました Docker-compose.yml:V1からV2へ

Docker-composeがV2ファイルを実行すると、ファイルで定義されているすべてのコンテナ間でネットワークが自動的に構築され、すべてのコンテナはdocker-compose.ymlファイルで定義されている名前を使用して他のコンテナをただちに参照できます。

そして

だから私たちはもうリンクを必要としません。 dbコンテナとWebサーバコンテナ間のネットワーク通信を開始するためにリンクが使用されましたが、これはすでにdocker-composeによって行われています

更新

depends_on

サービス間の依存関係を表現する。これには2つの効果があります。

  • docker-compose upは依存関係の順序でサービスを開始します。次の例では、dbおよびredisはwebの前に起動されます。
  • docker-compose up SERVICEは自動的にSERVICEの依存関係を含みます。次の例では、docker-compose up webもdbとredisを作成して起動します。

簡単な例:

version: '2'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

注意:depends_onはWebを起動する前にdbとredisが "ready"になるのを待ちません - 起動されるまでのみです。サービスの準備が完了するのを待つ必要がある場合は、この問題およびそれを解決するための戦略の詳細について、起動順序の制御を参照してください。

165
Windsooon

[2016年9月更新]:この回答はdocker compose file v1を対象としています(以下のサンプルcomposeファイルに示すとおり)。 v2については、@ Windowssooonによる他の回答を参照してください。

[オリジナルの回答]:

それはドキュメンテーションではっきりしています。 depends_on は依存関係とコンテナ作成の順序を決定し、 links はこれらだけでなく

リンクされたサービスのコンテナは、エイリアスと同じホスト名、またはエイリアスが指定されていない場合はサービス名で到達可能になります。

たとえば、次のdocker-compose.ymlファイルを想定します。

web:
  image: example/my_web_app:latest
  links:
    - db
    - cache

db:
  image: postgres:latest

cache:
  image: redis:latest

linksの場合、ポート5432がwebイメージで公開されていると仮定すると、db内のコードはdb:5432を使用してデータベースにアクセスできます。 depends_onを使用した場合、これは不可能ですが、コンテナーの起動順序は正しいでしょう。

44
Xiongbing Jin