Docker で Compose V2 などをキャッチアップした

docker-compose up ではなく docker compose up を使うように推奨されていることは知っていたが、ちゃんとキャッチアップしてなかったのでした。また、その過程で Compose V2 以外にも新たに知ったことがあったのでここに記す。

docker-compose との違い

大雑把には以下が異なる。

  • docker-compose は docker とは別のスタンドアローンバイナリだったが、docker compose は docker cli plugin として提供される
  • docker compose は Compose Spec に準拠するようになった

Compose Spec

Composeファイルの標準仕様で、プラットフォームやクラウドに依存しない仕様として策定されている模様。

Compose Spec V2 では従来から主に以下が変更/追加されている。

  1. Composeファイルは docker-compose.yml から compose.yaml になった
  2. トップレベルの version は非推奨になった
  3. 設定ファイルのマウントを行う configs が追加された
  4. 秘匿情報のマウントを行う secrets が追加された
  5. 設定の拡張を行う extends が追加された

1. 仕様ファイルは docker-compose.yml から compose.yaml になった

そのまま。後方互換性のため docker-compose.yml も使えるが、今後標準は compose.yaml となる。なお、Compose Spec では compose.yml も使えるが、拡張子は yaml のほうが好ましいとのこと。

2. トップレベルの version は非推奨になった

今までは、トップレベルの version でComposeファイルを検証していたが、これが今後非推奨となるので記述しなくなる模様。

3. 設定ファイルのマウントを行う configs が追加された

今までは、volumes で行っていたが、今後は設定ファイルの類は configs を使用する。docker compose を使っている限りだと volumes と特に大差はないようだが、プラットフォームごとに実装方法を変えられるように独立した模様。

compose.yaml:

services:
  db:
    image: mysql:8
    configs:
      - source: mysql-config
        target: /etc/mysql/conf.d/my.cnf
    ...

configs:
  mysql-config:
    file: ./my.cnf

4. 秘匿情報のマウントを行う secrets が追加された

秘匿情報のマウントが行える secrets が追加された。configs とは実装が異なる可能性があるので、独立している模様。

compose.yaml:

services:
  app:
    image: golang:1.20.1
    secrets:
      - source: app-secrets
        target: /app/.env
    ...

secrets:
  app-secrets:
    file: ./app-secrets.env

5. 設定の拡張を行う extends が追加された

他のserviceの設定をマージ/拡張できるようになる extends が追加された。同一ファイルのみならず、別ファイルも参照できる模様。

compose.common.yaml:

services:
  common:
    init: true
    environment:
      TZ: utc

compose.yaml:

services:
  app:
    image: golang:1.20.1
    extends:
      file: compose.common.yaml
      service: common
    ...

  db:
    image: mysql:8
    extends:
      file: compose.common.yaml
      service: common
    ...

Compose V2 以外のアレコレ

mysqladmin ping を使って、DBコンテナのMySQLに接続できる状態になってから、アプリケーションコンテナを起動する

depends_on を使えば、コンテナ間の依存関係を定義できるので、DBコンテナが起動してからアプリケーションコンテナを起動するのができたし、今までもこれを使ってた。

compose.yaml:

services:
  app:
    image: golang:1.20.1
    depends_on:
      - db
    ...

  db:
    image: mysql:8
    ...

しかし、これだとdbコンテナが起動したあとに対象コンテナを起動するという指定にすぎないので、dbコンテナが起動しているがMySQLにはまだ接続できない状態には対処できない。その場合はdbコンテナの healthcheckmysqladmin ping で疎通確認し、依存先コンテナの depends_oncondition: service_healthy を指定すればできる。

compose.yaml:

services:
  app:
    image: golang:1.20.1
    depends_on:
      db:
        condition: service_healthy
    ...

  db:
    image: mysql:8
    healthcheck:
      test: ["CMD", "mysqladmin" ,"ping", "-h", "0.0.0.0"]
      interval: 1s
      timeout: 1s
      retries: 30
      start_period: 1s
    ...

docker compose で作成されるコンテナ名などのプレフィックスを変更する

docker compose で作成されるコンテナ名などのプレフィックスは、Composeファイルのトップレベルの name によって指定できる。また、COMPOSE_PROJECT_NAME環境変数でこの指定はオーバーライドできる。

compose.yaml:

name: docker-compose-v2
services:
  ...
$ docker compose up
[+] Running 4/3
 ⠿ Network docker-compose-v2_default  Created                                                                                                                                     0.0s
 ⠿ Volume "docker-compose-v2_db"      Created                                                                                                                                     0.0s
 ⠿ Container docker-compose-v2-db-1   Created                                                                                                                                     0.1s
 ⠿ Container docker-compose-v2-app-1  Created                                                                                                                                     0.1s
...
$ COMPOSE_PROJECT_NAME=other-name docker compose up
[+] Running 4/3
 ⠿ Network other-name_default  Created                                                                                                                                            0.0s
 ⠿ Volume "other-name_db"      Created                                                                                                                                            0.0s
 ⠿ Container other-name-db-1   Created                                                                                                                                            0.1s
 ⠿ Container other-name-app-1  Created                                                                                                                                            0.1s
...

なお、Composeファイルでは環境変数で設定値の指定ができるが、nameでは使用できない模様。

compose.yaml:

name: ${BASE_NAME}-docker-compose-v2
services:
  ...
$ BASE_NAME=hoge docker compose up
[+] Running 4/4
 ⠿ Network base_name-docker-compose-v2_default  Created                                                                                                                           0.1s
 ⠿ Volume "base_name-docker-compose-v2_db"      Created                                                                                                                           0.0s
 ⠿ Container base_name-docker-compose-v2-db-1   Created                                                                                                                           0.1s
 ⠿ Container base_name-docker-compose-v2-app-1  Created                                                                                                                           0.6s
...

環境

  • OS: macOS Ventura 13.2
  • Docker Desktop: 4.16.2
  • Docker Engine: 20.10.22
  • Docker Compose: 2.15.1

参考

Compose V2

その他

サンプルコード

この記事で使用したサンプルコードは以下にある。

github.com/mrk21/sandbox/docker-compose-v2