概要
2022年4月26日、Docker Compose Version 2 (以下「Compose V2」と省略)が GA(一般提供開始)になったと Docker Blog で発表 がありました。
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 でフィードバックを受け付け中 であり、私たちの反応次第で変わる可能性が示唆されています)。
既に 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 は、両方のバージョンが共存できます。
$ 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
$ docker compose version
Docker Compose version v2.3.3
単にコマンドが違うだけでなく、細部では違いがあります。分かりやすい違いとしては、コンテナ名の命名規則が Compose V1 の「_」から、Compose V2 は「-」に変わります。
これまでは プロジェクト名_サービス名_番号
でしたが、
プロジェクト名-サービス名-番号
となります。
以下は、同じ docker-compose.yaml を V1 と V2 で起動し、 docker ps
で見た結果です。 NAMES
列のコンテナ名が違います。
$ 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
$ 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 の仕様が移行されたようですが、一部は実装されていないものもあります。違いの詳細は、 互換性についてのページ をご覧ください。
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
を実行したのと同じ状態です。
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
- [Docker Compose] V1 End of Life Policy · Issue #257 · docker/roadmap
- Compose command compatibility with docker-compose | Docker Documentation
- Compose V2 | Docker Documentation
- Install Docker Compose | Docker Documentation
omake
V2 の件、自分の現状確認や検証も兼ねて書きました。
Enjoy!