本記事は「珠玉のアドベントカレンダー記事をリバイバル公開します」企画のために、以前Qiitaに投稿した記事を一部ブラッシュアップしたものになります。
はじめに
みなさん、docker composeを利用しているでしょうか?
複数のdockerコンテナをまとめて立ち上げたり、環境変数を定義できたり便利ですよね。
この記事ではある程度docker composeを利用している方向けに私が便利、便利そうと感じたdocker composeの機能を挙げてみました。
docker compose cli v2を利用
docker-compose
ではなく docker composeコマンドも利用可能になっています。
Docker Desktopでは v3.4.0から利用可能で、基本的にはコマンドの互換性あります。
ファイル監視による自動更新
docker compose 2.20.0からCompose Watchの機能が利用できるようになりました。
ホットリロードのような機能で以下の3つのモードが用意されています。
モード (compose.yamlでの記載) |
ファイル更新時の挙動 | 利用例 |
---|---|---|
Sync (sync) |
ホスト側のファイル変更がコンテナ側に反映される |
|
Rebuild (rebuild) |
イメージをビルドしコンテナを入れ替える (docker comopse up –build相当) |
|
Sync + Restart (sync+restart) |
ファイル変更を反映し、コンテナをリスタートする (Sync + docker compose restart相当) |
|
記載方法は以下のようになります。
services: |
docker composeファイル名
docker composeではv2から compose.yaml
が推奨されるように変更になっています。
現在ワークディレクトリの以下のファイルがデフォルトで利用可能です。
- compose.yaml
- compose.yml
- docker-compose.yml
- docker-compose.yaml
複数ファイルが存在した場合優先されるのは上記の順で適用されるようです。
Warnログが出力され、適用されたファイルを確認できます(composeはyamlが優先、docker-composeはymlが優先になってます)。
docker compose up |
デフォルトのファイル名以外を利用したい場合、また別階層のファイルを指定したい場合には、-f
オプションで指定可能です。
Docker image名やコンテナ名のプレフィックスをディレクトリ名から変更する
通常は ${ディレクトリ名}_${サービス名}
でイメージが作成されます。compose.yaml
のトップレベルに name:
を記載することで変更でき、${name}_${サービス名}
にイメージ名を変更可能です。
name: sample |
また、以下の方法でも変更可能です。
環境変数COMPOSE_PROJECT_NAME
でプロジェクト名を指定することにより${プロジェクト名}_${サービス名}
にイメージ名を変更可能です。
- 例:
sample_${サービス名}
でイメージを作成したい場合
COMPOSE_PROJECT_NAME=sample |
--project ${プロジェクト名}
を指定することによりコマンドライン引数でも指定可能です。
docker compose build --project ${project名} |
ヘルスチェックの設定
Dockerfileでも指定できますが、docker-compose.ymlでも指定可能です。
コンテナに対しコマンドを実行し終了コードなどによりヘルスチェックができます。
ヘルスチェックを利用することで依存関係の設定、サービス完了まで待機でサービスが healthy
になるまで待機することが可能です。
healthcheck: |
依存関係の設定
以前はコンテナの依存関係しか指定できませんでしたが、docker compose2.1からサービスがhealthyになった後に起動する、正常終了したあとに実行するなど、より高度な依存関係を定義できるようになりました。
使用可能な条件は以下:
- service_started: 依存するサービス開始まで待機。(ステータスは問わない)
- service_healthy: 依存するサービスが
healthy
になるまで待機 - service_completed_successfully: 依存するサービスが正常終了するまで待機
services: |
サービス完了まで待機
docker compose up
に--wait
オプションを利用することで、ヘルスチェックが設定されたサービスが定常状態になるまで待機することが可能です(執筆時点では--wait
オプションはドキュメントに記載されていません)。
以前はワンショットのサービスには --wait
が効かないバグがありましたがv2.7.0で修正されたようです。
また、待機タイムアウトを設定したい場合には --wait-timeout (秒数)
で利用可能です。
サービスをグループ化
profilesという機能を利用し、複数のサービスをまとめて起動・終了などをすることが可能です。
以前からdepends_on
で依存関係を指定することで依存したサービスをまとめて立ち上げることができていましたが、profilesによって依存関係がないサービスもまとめて立ち上げることが可能になりました。
services: |
docker compose --profile dev up |
versionの廃止
compose.yaml
のトップレベルのversionの記載が不要になりました。
記載するとエラーが出るようになっています。
docker compose up |
警告が出るcompose.yamlサンプル
version: "3" # この部分が不要 |
おわりに
本記事により皆さまのdocker composeライフが少しでも豊かなものになれば幸いです。
よろしければ、他の「珠玉のアドベントカレンダー記事をリバイバル公開します」の記事もご覧ください。