Help us understand the problem. What is going on with this article?

docker-compose depends_onとlinksの違い

More than 3 years have passed since last update.

depends_onとlinksの違い

docker-compose.ymlを書いて、railsを使用したwebアプリケーションコンテナをmongoDBコンテナと接続しようとしたら、depends_onlinksの2通りの書き方があることが判明。何が違うのか、調べてみました。

version 1での違い

depends_on

depends_onはコンテナの作成順序と依存関係を決めるものだそうで。

links

linksdepends_onの機能に加えて、[エイリアス名](または[サービス名])を使用してコンテナにアクセスすることができます。例として、以下railsとmongoの2つを使用したdocker-composeファイルを用意しました。

docker-compose.yml
  db:
    image: mongo
    ports:
      - "27017:27017"
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    ports:
      - "3000:3000"
    links:
      - db
      - db:database

linksを使えば、webコンテナからdb:27017またはdatabase:27017を使用してmongoコンテナにアクセスすることができます。dockerコンテナはIPアドレスを固定するのが面倒なのでエイリアスで接続できるのは便利ですね。ちなみにdbが[サービス名]で、databaseが名付けた[エイリアス名]です。

version2での違い

docker-compose.ymlでversion:'2'を指定すれば、以上の違いはなくなるそうです。version 1の場合は他のコンテナから[サービス名]を使って接続することができませんでしたが、version2ではcomposeファイルに書かれた全てのサービス間に自動的にリンクを張る仕様になったため、linksとわざわざ書く必要がなくなったそうです。depends_onで繋げたとしても、[サービス名]や[エイリアス名]で接続できます。

サービスの完成する順番が前後する問題

docker-composeではサービスが依存関係に従って、うまい具合に順番に立ち上がってくれるのが便利ですよね。しかし、たまにリンク先が後に立ち上がってリンクがうまく繋がらないことがあります。なぜでしょうか。

以下のredisとpostgresを使ったwebアプリケーションのdocker-compose.ymlの例を見てます。

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

ここではwebの指定下にdepends_onがあり、コンテナを立ち上げる順番を決めています。この場合、docker-compose upをすることで①web,②「dbとredis」①「dbとredis」②「web」の順番でコンテナが起動し、接続されます。

しかし、コンテナが起動する順番は指定すれど、出来上がるまでは待ってくれないのがdepends_onの特徴のようで、例えば接続したいデータベースが準備できていないのに先にwebアプリが立ち上がるという問題も可能性としては考えられます。

コンテナの立ち上げる順番に関する問題のトラブルシューティングに関してはこの公式ドキュメントによくまとまってます。

参照元:stackoverflow.com

参照元:Docker-compose.yml: from V1 to V2

sivertigo
IT勉強中です。
future
ITを武器とした課題解決型のコンサルティングサービスを提供します
http://future-architect.github.io/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした