docker_compose.ymlのリンクとdepends_onの違い


292

Docker Composeのcompose-fileドキュメントによると:

  • depends_on -サービス間の依存関係を表現します。
  • links-別のサービスのコンテナーにリンクし、depends_onと同じ方法でサービス間の依存関係表現します

他のコンテナにリンクする目的がわからないので、2つのオプションの違いはまだかなり難しいようです。

例があればはるかに簡単ですが、何も見つかりません。

コンテナBをコンテナAにリンクすると、コンテナBはコンテナAのシェル内で「ping可能」になります。

私はping BコンテナAの内部を走りbash、このような結果を得ました(参照用、インターネットからの画像)

ここに画像の説明を入力してください


6
--linkフラグは、今ドッカーの廃止予定のレガシー機能であり、ドキュメントは「それは最終的に除去することができる」示唆ドッカー:レガシーコンテナへのリンクをDockerネットワーク機能またはdocker composeメソッドは使用しないことをお勧めします。これは、この機能について学ぶここの誰にとっても役立つと考えました。
スター、

回答:


122

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ます。


13
一般的なStackOverflow、なぜ実際に最高の1ポイントの回答を見つけるために147および43ポイントの回答の下にスクロールする必要があるのですか?
u8it

3
@ u8itそれは時間とインターネットの性質です。
マイケルコール

docker-composeで同じことをするには?docker composeを使用すると、すべてのサービスが同じネットワークに既にあり、何も追加する必要がないと思います。いずれかのコンテナが準備完了状態ではないコンテナに接続しようとすると、コンテナ間のリンクは引き続き機能しません。
makkasi

docker -composeバージョン3のドキュメントで推奨されなくなったリンクに関する情報を確認できません:docs.docker.com/compose/compose-file/#links。私たちは共有ネットワークとdepends_onを持っているので、あまりにも便利なオプションは表示されませんが、ドキュメントを正しく読んでいれば非推奨ではありません(それらはDockerコンテナの--linkフラグにのみ言及しています)。
rideronthestorm

注:同じネットワーク内のコンテナー(実際にはサービス)には、コンテナー名ではなくサービス名でアクセスできます。公式ドキュメント:docs.docker.com/compose/networking/#links
GarryOne

194

この回答はdocker-compose バージョン2用でバージョン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

リンクとdepends_onの違いは何ですか?

リンク:

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

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

docker inspect d54cf8a0fb98 |grep HostPort

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

"HostPort": "32777"

つまり、ローカルホストのポート32777(コンテナでは3306)からデータベースに接続できますが、このポートはコンテナを再起動または削除するたびに変更されます。したがって、リンクを使用して、常にデータベースに接続し、どのポートであるかを知る必要がないことを確認できます。

web:
  links:
   - db

depends_on:

Giorgio Ferraris 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 SERVICESERVICEの依存関係が自動的に含まれます。次の例では、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が「準備完了」になるのを待たず、それらが開始されるまで待機します。サービスの準備が整うまで待つ必要がある場合は、この問題の詳細と解決のための戦略について、起動順序の制御を参照してください。


回答を更新して、その回答が構成ファイルv1を対象としたものであることを明確にしました。
Xiongbing Jin 2016

1
これはバージョン3でも有効ですか?
fabiomaia 2017年

はい、https://docs.docker.com/compose/compose-file/compose-versioning/
ご覧になれ

「これは、localhostポート32777(コンテナー内の3306)からデータベースに接続できることを意味しますが、このポートはコンテナーを再起動または削除するたびに変更されます」docker-compose-fileでポートバインディングを指定しないと、 。そして、この質問は具体的にはdocker-composeに関するものであるため、docker runここでの例は完全に無関係であり、それがコンテナーがどのように実行されるかではないように感じます。何が欠けていますか?
Andrew Savinykh 2017年

はい、ポートを指定すれば正しいです。私のdocker run 例では、ポート番号をハードコードするのではなく、depends_onまたはリンクを使用する必要がある理由を指摘します。指定しないと、ポート番号が毎回変わるためです。これにより、depends_onやリンクについての理解が深まると思います。
ウィンドスーン2017年

50

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

[元の答え]:

それはドキュメントでかなり明確です。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コード内をweb使用してデータベースにアクセスできるようになりdb:5432、ポート5432を内に露出されていると仮定すると、db画像を表示します。depends_on使用した場合、これは不可能ですが、コンテナの起動順序は正しいでしょう。


例を挙げてもらえますか?なぜならその部分はまだはっきりしないからです。多分それをより具体的にするかもしれない他の構成ファイルのオプションがあります。さらに詳細を入力してください。ありがとう!
itsjef 2016年

どうもありがとうございました!わかった。最後の質問です。私が使用する必要がありますので、私の特定のケースでは、私は、私のレールのアプリを展開していますlinksdepends_onまたはいずれかそれらのokですか?私の現在のdocker-compose.yml使用法depends_onと物事はうまく機能しているようです。:)
itsjef 2016年

あなたは、を介して他の容器に直接アクセスする必要がない場合はname:port、その後でdepends_onokです。
Xiongbing Jin 2016

9
名前:ポートを使用して、公開使用時にリンクがなくても動作します:
アミットゴールドスタイン

7
「depends_onが使用された場合、これは不可能ですが、コンテナの起動順序は正しいでしょう。」これは正しくありません。これは、depends_onを使用するだけで機能します。データベースのホスト名を使用dbして、引き続きにアクセスできますweb
pros.Dusan 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.