#depends_onとlinksの違い
docker-compose.ymlを書いて、railsを使用したwebアプリケーションコンテナをmongoDBコンテナと接続しようとしたら、depends_on
とlinks
の2通りの書き方があることが判明。何が違うのか、調べてみました。
##version 1での違い
####depends_on
depends_on
はコンテナの作成順序と依存関係を決めるものだそうで。
####links
links
はdepends_on
の機能に加えて、[エイリアス名](または[サービス名])を使用してコンテナにアクセスすることができます。例として、以下railsとmongoの2つを使用したdocker-composeファイルを用意しました。
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の例を見てます。
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アプリが立ち上がるという問題も可能性としては考えられます。
コンテナの立ち上げる順番に関する問題のトラブルシューティングに関してはこの公式ドキュメントによくまとまってます。