docker
docker-compose

docker-compose depends_onとlinksの違い

More than 1 year has 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