(2024/06/21追記)
本記事のアップデート版を弊社技術ブログに投稿しました。
Tipsの追加に加え、既存Tipsの内容も更新していますので、よろしければご確認ください。
はじめに
皆さん、docker composeを利用しているでしょうか?
複数のdockerコンテナをまとめて立ち上げたり、環境変数を定義できたり便利ですよね。
今回はある程度docker composeを利用している方向けに私が便利、便利そうと感じたdocker composeの機能を挙げてみました。
docker compose cli v2を利用
docker-compose
ではなく docker composeコマンドも利用可能になってます。
Docker Desktopでは v3.4.0から利用可能で、基本的にはコマンドの互換性あります。
Docker image名やコンテナ名のプレフィックスをディレクトリ名から変更する
通常は ${ディレクトリ名}_${サービス名}
でイメージが作成されます。
環境変数COMPOSE_PROJECT_NAME
でプロジェクト名を指定することにより
${プロジェクト名}_${サービス名}
にイメージ名を変更可能です。
個人的なおすすめはdocker-compose.yaml
と同一ディレクトリに .env
ファイルに追加することです。
- 例:
sample_${サービス名}
でイメージを作成したい場合
COMPOSE_PROJECT_NAME=sample
--project ${プロジェクト名}
を指定することによりコマンドライン引数でも指定可能です。
docker compose build --project ${project名}
ヘルスチェックの設定
Dockerfileでも指定できますが、docker-compose.ymlでも指定可能です。
コンテナに対しコマンドを実行し終了コードなどによりヘルスチェックができます。
ヘルスチェックを利用することで依存関係の設定、サービス完了まで待機でサービスが healthy
になるまで待機することが可能です。
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
start_period: 40s
依存関係の設定
以前はコンテナの依存関係しか指定できませんでしたが、docker compose2.1からサービスがhealthyになった後に起動する、正常終了したあとに実行するなど、より高度な依存関係を定義できるようになりました。
使用可能な条件は以下
- service_started: 依存するサービス開始まで待機。(ステータスは問わない)
- service_healthy: 依存するサービスが
healthy
になるまで待機 - service_completed_successfully: 依存するサービスが正常終了するまで待機
version: "2.4"
services:
web:
build: .
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
redis:
image: redis
db:
image: postgres
healthcheck:
test: "exit 0"
サービス完了まで待機
docker compose up
に--wait
オプションを利用することで、ヘルスチェックが設定されたサービスが定常状態になるまで待機することが可能です。
(執筆時点では--wait
オプションはドキュメントに記載されていませんが)
以前はワンショットのサービスには --wait
が効かないバグがありましたがv2.7.0で修正されたようです。
サービスをグループ化
profilesという機能を利用し、複数のサービスをまとめて起動・終了などをすることが可能です。
以前からdepends_on
で依存関係を指定することで依存したサービスをまとめて立ち上げることができていましたが、profilesによって依存関係がないサービスもまとめて立ち上げることが可能になりました。
version: "3.9"
services:
web:
image: web
mock-backend:
image: backend
profiles: ["dev"]
depends_on:
- db
db:
image: mysql
profiles: ["dev"]
phpmyadmin:
image: phpmyadmin
profiles: ["debug"]
depends_on:
- db
docker compose --profile dev up
おわりに
本記事により皆さまのdocker composeライフが少しでも豊かなものになれば幸いです。