Docker Compose V2(Version 2) GA のまとめ


![dockerdesktop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/4090df2d-4948-2d02-abe2-34a22055b201.png)


# 概要

2022年4月26日、Docker Compose Version 2 (以下「Compose V2」と省略）が GA（一般提供開始）になったと [Docker Blog で発表](https://www.docker.com/blog/announcing-compose-v2-general-availability/) がありました。

## Docker Desktop を利用中の場合

既に macOS および Windows 、Linux (beta版) のDocker Desktop では Compose V2 が初めから入っています。また `docker-compose` コマンド（中身は環境確認のスクリプトであり、バイナリではありません）は、既に実体としての Compose V2 機能の `docker compose` を呼び出すか、Comose V1 の `docker-compose-v1` を呼び出しています。

## Linux 版 Docker Engine を利用中の場合

Linuxでは v20.10.13 以降、現在 current バージョンの v20.10.14 をセットアップすると、Docker CLI に Compose V2 が（ Docker CLI プラグイン）として組み込み済みであり、 `docker compose` コマンドがすぐに使えます。以前のバージョンでも compose-plugin をセットアップすると、Compose V2 が利用できます。

## 今後 Compose V1 は非推奨、EOL まで猶予は1年(2023年6月以降)の予定

今後は Compose V2 が Docker の操作体系だけでなく、ドキュメント含めて標準となります。Compose V1 は Deprecated（非推奨）となり、現時点では、EOLまでの猶予期間が1年あるものの、移行のために準備が必要です。

# Compose V2 が GA になった意味

Compose V2 は 2021年6月にリリースされた Docker Desktop 3.4 から提供開始となりました。この時から、`docker-compose` コマンドに加え、  `docker compose` サブコマンドがサポートされるようになり、開発が続いていました。

Compose V2 が `docker compose` のサブコマンドになると、従来、Docker Engine とは別に Docker Compose をセットアップしていた作業が不要となります。また、Compose V1 の場合は、Python スクリプトで記述されていため、Python の環境を pip 経由で入れるか、あるいは、各 OS 向けのバイナリのセットアップが必要でした。

Compose V2 が一般提供開始（General Availability）と宣言されたため、従来の `docker-compose` による Compose V1 は「Deprecated」（廃止される可能性があるため、非推奨）の位置付けとなり、

- V1 は、今後の新規機能の追加停止
- 重大なセキュリティや致命的なバグに対する修正のみ提供（2022年10月まで）
- 2023年 ~~4月EOL（予定）~~ 6月以降予定

といったロードマップが予定されています（ [GitHub でフィードバックを受け付け中](https://github.com/docker/roadmap/issues/257
) であり、私たちの反応次第で変わる可能性が示唆されています）。

既に `docker compose` コマンドを使えば、自動的に Compose V2 を使う状態です。

`docker-compose` コマンドを使っている場合、Docker Desktop であればユーザーインターフェース上の設定で、V1 を使うか、V2 を使うかを選択できます。

EOL になった後は、`docker-compose` のエイリアスは維持されますが、Docker Desktop のユーザーインターフェスから V2 有効化・無効化の選択ができなくなります（必ず V2 を使うようになります）。

# Compose V1 と Compose V2 の違い

大きな違いは、見た目のコマンドです。 Compose V1 は `docker-compose` ですが、 Compose V2 は `docker compose` です。現在の Docker Compose は、両方のバージョンが共存できます。

```:Compose V1
$ docker-compose version
docker-compose version 1.29.2, build 5becea4c
docker-py version: 5.0.0
CPython version: 3.9.0
OpenSSL version: OpenSSL 1.1.1g  21 Apr 2020
```

```:Compose V2
$ docker compose version
Docker Compose version v2.3.3
```

単にコマンドが違うだけでなく、細部では違いがあります。分かりやすい違いとしては、コンテナ名の命名規則が Compose V1 の「_」から、Compose V2 は「-」に変わります。

これまでは `プロジェクト名_サービス名_番号`でしたが、
`プロジェクト名-サービス名-番号`となります。

以下は、同じ docker-compose.yaml を V1 と V2 で起動し、 `docker ps` で見た結果です。 `NAMES` 列のコンテナ名が違います。

```:Compose V1
$ docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED         STATUS         PORTS
       NAMES
a46f50068c28   tmp_check1   "/docker-entrypoint.…"   5 seconds ago   Up 3 seconds   80/tcp
       tmp_check1_1
22542f496500   wordpress    "docker-entrypoint.s…"   5 seconds ago   Up 3 seconds   0.0.0.0:8080->80
/tcp   tmp_wordpress_1
7dc008c51589   mysql:5.7    "docker-entrypoint.s…"   5 seconds ago   Up 3 seconds   3306/tcp, 33060/
tcp    tmp_db_1
```

```:Compose V2
$ docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED       STATUS       PORTS
   NAMES
226a890516bc   mysql:5.7    "docker-entrypoint.s…"   2 hours ago   Up 2 hours   3306/tcp, 33060/tcp
   tmp-db-1
cf167b06aee4   tmp_check1   "/docker-entrypoint.…"   2 hours ago   Up 2 hours   80/tcp
   tmp-check1-1
d261092d22b1   wordpress    "docker-entrypoint.s…"   2 hours ago   Up 2 hours   0.0.0.0:8080->80/tcp
   tmp-wordpress-1
```

Compose V2 は、基本的には Go 言語で作り直されたものです。ほぼ多くの V1 の仕様が移行されたようですが、一部は実装されていないものもあります。違いの詳細は、 [互換性についてのページ](https://docs.docker.com/compose/cli-command-compatibility/) をご覧ください。


# Docker Desktop (macOS / Windows / Linux (beta) で Compose V2 を使うには

Docker Desktop 3.4 以上では、既に Compose V2 が自動でインストールされています。また、Docker Desktop 4.4.2 以上では、デフォルトで `docker-compose` コマンドが、 `docker compose` のエイリアスになっています。

## `docker compose` コマンドを使用中の場合

そのため、 `docker compose` コマンドを普段から使っている状態であれば、Compose V2 が GA になったからと、何か特段対応は必要ありません。これまで通り使い続けられます。 

## `docker-compose` コマンドを使用中の場合

コマンド `docker-compose` は Compose V1 相当のため、Copmose V2 への移行が必要です（アナウンスでは、ただちに速やかな移行ではなく、時間をかけての移行が必要と書かれています）。


Docker Desktop では、コマンドラインで Compose V1 と Compose V2 の切り替えが可能です。

- `docker-compose disable-v2` … `docker-compose` で Compose V1 を有効化
- `docker-compose enable-v2` … `docker-compose` で Compose V2 を有効化

コマンドラインでスムーズに切り替え可能なため、現行の docker-compose.yaml や環境等が正常に動作するかどうかが確認できます。

あるいは、Docker Desktop のユーザーインターフェースからは、「Settings」→「Generals」に「Use Docker Compose V2」という項目があります。ここにチェックを入れ、「Apply & Restart」を実行しても、 `docker-compose enable-v2` を実行したのと同じ状態です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/f0efc719-1c9e-627b-b799-5035b7bb51b3.png)


# Docker Engine (Linux) で Compose V2 を使うには

現在 current バージョンとして提供中の Docker Engine v20.10.14 を含め、v20.10.13 からは `docker compose` が既に使える状態です。これは、 Docker CLI プラグインとして compose-plugin を内蔵しているためです。

```
$ docker compose version
Docker Compose version v2.3.3
```

それよりも古いバージョンで Compose V2 を有効にするには、compose-plugin をセットアップします。

以下は、自分のホームディレクトリに入れる例です。

```
$ DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
$ mkdir -p $DOCKER_CONFIG/cli-plugins
$ curl -SL https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
$ chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
```

あとは、 `docker compose version` コマンドを実行すると、バージョン情報が確認できます。

```
$ docker compose version
Docker Compose version v2.4.1
```

また、この手順はホームディレクトリ以下に置きましたが、サーバ全t内で利用できるようにするには、　`~/.docker/cli-plugins` を `/usr/local/lib/docker/cli-plugins` に移動します。


なお、Compose V2 が入った状態でも、現時点では Compose V1 の `docker-compose` との共存は可能です。それぞれ、独立して利用できます。


# 参考(reference)

- Announcing Compose V2 General Availability - Docker
  - https://www.docker.com/blog/announcing-compose-v2-general-availability/#proposed-compose-v1-end-of-lie-timeline
- [Docker Compose] V1 End of Life Policy · Issue #257 · docker/roadmap
  - https://github.com/docker/roadmap/issues/257
- Compose command compatibility with docker-compose | Docker Documentation
  - https://docs.docker.com/compose/cli-command-compatibility/
- Compose V2 | Docker Documentation
  - https://docs.docker.com/compose/cli-command/#install-on-linux
- Install Docker Compose | Docker Documentation
  - https://docs.docker.com/compose/install/


# omake

V2 の件、自分の現状確認や検証も兼ねて書きました。

Enjoy!