フューチャー技術ブログ

個人的docker composeおすすめtips 9選

本記事は「珠玉のアドベントカレンダー記事をリバイバル公開します」企画のために、以前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相当)
  • コンパイル後の言語
  • package.jsonの変更などイメージの再ビルドが必要な場合
Sync + Restart
(sync+restart)
ファイル変更を反映し、コンテナをリスタートする
(Sync + docker compose restart相当)
  • データベースのconfig変更
  • nginx.confの更新

記載方法は以下のようになります。

compose.yaml
services:
web:
build: .
command: npm start
develop:
watch:
- action: sync
path: ./web
target: /src/web
ignore:
- node_modules/
- action: rebuild
path: package.json

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
WARN[0000] Found multiple config files with supported names: /tmp/compose-sample/compose.yaml, /tmp/compose-sample/compose.yml, /tmp/compose-sample/docker-compose.yml, /tmp/compose-sample/docker-compose.yaml
WARN[0000] Using /tmp/compose-sample/compose.yaml

デフォルトのファイル名以外を利用したい場合、また別階層のファイルを指定したい場合には、-f オプションで指定可能です。

Docker image名やコンテナ名のプレフィックスをディレクトリ名から変更する

通常は ${ディレクトリ名}_${サービス名}でイメージが作成されます。
compose.yaml のトップレベルに name: を記載することで変更でき、${name}_${サービス名}にイメージ名を変更可能です。

compose.yaml
name: sample
services:
...(省略)...

また、以下の方法でも変更可能です。

環境変数COMPOSE_PROJECT_NAMEでプロジェクト名を指定することにより${プロジェクト名}_${サービス名}にイメージ名を変更可能です。

  • 例: sample_${サービス名}でイメージを作成したい場合
.env
COMPOSE_PROJECT_NAME=sample

--project ${プロジェクト名}を指定することによりコマンドライン引数でも指定可能です。

docker compose build --project ${project名}

ヘルスチェックの設定

Dockerfileでも指定できますが、docker-compose.ymlでも指定可能です。

コンテナに対しコマンドを実行し終了コードなどによりヘルスチェックができます。

ヘルスチェックを利用することで依存関係の設定、サービス完了まで待機でサービスが healthyになるまで待機することが可能です。

compose.yaml
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: 依存するサービスが正常終了するまで待機
compose.yaml
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で修正されたようです。

また、待機タイムアウトを設定したい場合には --wait-timeout (秒数) で利用可能です。

サービスをグループ化

profilesという機能を利用し、複数のサービスをまとめて起動・終了などをすることが可能です。

以前からdepends_onで依存関係を指定することで依存したサービスをまとめて立ち上げることができていましたが、profilesによって依存関係がないサービスもまとめて立ち上げることが可能になりました。

compose.yaml
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

versionの廃止

compose.yaml のトップレベルのversionの記載が不要になりました。
記載するとエラーが出るようになっています。

$ docker compose up
WARN[0000] /tmp/compose-sample/compose.yaml: `version` is obsolete
[+] Running 1/0
...(省略)...
警告が出るcompose.yamlサンプル
compose.yaml
version: "3" # この部分が不要
services:
cpsyml:
image: hello-world:latest

おわりに

本記事により皆さまのdocker composeライフが少しでも豊かなものになれば幸いです。

よろしければ、他の「珠玉のアドベントカレンダー記事をリバイバル公開します」の記事もご覧ください。