この記事は NTTテクノクロス Advent Calendar 2022 の16日目の記事です。
NTTテクノクロスの飯山です。
普段はCRMシステムの構築・保守や、社内向けにDockerの研修講師をしています。
本記事はDocker Composeを使っている(知っている)けれど、EOLのことを知らなかった。
知っていたけど移行を先延ばしにしていた人向けです。
はじめに
複数のコンテナの管理/実行を容易にするDocker Composeは2013年に登場してから多くのユーザに利用されていたと思います。
そんなDocker Composeですが、2022年4月にDocker Compose V2(以下、V2)が正式リリースされ、
従来のDocker Compose(以下、V1)は2023年4月にEOLを迎えます。
1年の移行期間がありましたが、私はV2について何も知らないままV1を使って生きてきたのでこの機会にV2で何が変わるのかについて動かしながら確認してみました。
前提条件
本記事内では以下環境で動作を行っています。
バージョン | |
---|---|
OS | Ubuntu 20.04 LTS 5.4.0-66-generic |
Docker Platform | Docker Engine Community Edition |
Dockerバージョン | 20.10.21 |
※Composeを動かすだけなのでDockerのバージョンは同じです。
何が変わったのか
Docker Compose V2が一般提供が発表されたブログを参照すると、Docker Compose V2に変わるにあたり、Composeの言語がPythonからGoに切り替わり、Docker CLIのオプションとして統合されるようになりました。構成される言語が切り替わってもV1の互換性を保持しつつ、動作が速くなるなどいくつかのメリットがあるそうです。
コマンドを使う上では、実行コマンドが切り替わりました。
V1
$ docker-compose XXXX
V2
$ docker compose XXXX
インストール方法の違い
Compose V1はDockerをインストールしたのち、DockerのGitHubよりComposeファイルを取得することでインストールを行っていましたが、
Compose V2では標準パッケージとしてインストールできるようになっていました。
Docker CEのインストールページでは、Docker関連パッケージをインストールする際に一緒にインストールするように記載されていますので、公式手順を参照していると意識せずにインストールすることができます。
V1手順
- Composeファイルの取得
$ curl -L https://github.com/docker/compose/releases/download/1.29.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
- 実行権限の付与
$ sudo chmod +x /usr/local/bin/docker-compose
V2手順
- インストール
$ sudo apt install docker-compose-plugin
Compose V1とV2のcompose upコマンド比較
Docker RegistryとDocker RegistryのwebUIコンテナを起動するcompose.ymlをV1,V2でそれぞれ起動してみました。
起動時の出力表現に差があるものの、使用感は変わらない印象でした。
V1とV2での速度の違いですが、同じco acmposeファイルを複数回実行しましたが安定して2~3秒ほど速くV2は動作しました。
V1
$ time docker-compose up -d
Creating network "compose_default" with the default driver
Creating compose_registry_1 ... done
Creating compose_registry-web_1 ... done
real 0m11.528s
user 0m0.899s
sys 0m0.172s
V2
$ time docker compose up -d
[+] Running 3/3
⠿ Network compose_default Created 0.3s
⠿ Container compose-registry-1 Started 7.3s
⠿ Container compose-registry-web-1 Started 6.4s
real 0m9.185s
user 0m0.140s
sys 0m0.094s
コマンドの差分
先ほどのブログ記事中に、
Docker Compose V2 is a drop-in replacement for Compose V1(≒ComposeV1の完全な互換品)
といった記載もあることから基本的にはdocker-composeコマンドがdocker composeコマンドとして切り替わったと理解して良さそうです。
公式ドキュメント参照すると新しく追加されたコマンドや未実装のコマンド、削除されたコマンドを確認できます。
追加されたコマンド
$ docker compose cp
composeで起動しているコンテナと、ホスト間でファイルをコピーする際に利用するコマンドです。
--allオプションを使うことで、対応するcomposeで起動しているすべてのコンテナに一括でファイルをコピーすることができます。
$ docker compose ls
実行されているComposeを一覧で表示するコマンドになります。
composeを起動する際にフラグを指定することで、複数のcomposeを一括で管理できるようになります。
未実装のコマンド
$ compose build --memory
コンテナ起動時に使用メモリ量を制限するこのオプション(docker container run --memoryオプションに相当)はまだ未実装とのことです。
composeファイルの起動を自動化しており、さらにそこでメモリ量を制限している場合はcomposeファイルの中でメモリ制限を設定するなどの対応が必要になります。
削除されたフラグ
$ compose ps --filter KEY-VALUE service
$ compose rm --alldocker-compose
$ compose scaledocker-compose
おまけ:compose-switch(V1のコマンドを自動でV2に変換してくれる公式ツール)
compose-switchとは、V1のコマンドで実行したものをV2のコマンドに変換することでみかけ上の使用感は変わらずにV2に移行ができるツールです。
インストール手順
基本的にREAD MEに記載されている手順を実行するだけでインストールができます。
注意点としては自動セットアップによる構築の場合はインストールする場合、対象のマシンにDocker Compose V1とV2がどちらもインストールされている必要がありました
# curl -fL https://raw.githubusercontent.com/docker/compose-switch/master/install_on_linux.sh | sh
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1418 100 1418 0 0 36358 0 --:--:-- --:--:-- --:--:-- 36358
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 2884k 100 2884k 0 0 3097k 0 --:--:-- --:--:-- --:--:-- 24.8M
/usr/bin/update-alternatives
Configuring docker-compose alternatives
update-alternatives: using /usr/local/bin/docker-compose-v1 to provide /usr/local/bin/docker-compose (docker-compose) in auto mode
update-alternatives: using /usr/local/bin/compose-switch to provide /usr/local/bin/docker-compose (docker-compose) in auto mode
'docker-compose' is now set to run Compose V2
use 'update-alternatives --config docker-compose' if you want to switch back to Compose V1
実行イメージ
インストール後はdocker-composeコマンド(V1)を実行するとdocker composeコマンド(V2)に変換されて実行されます。
$ docker-compose --version
Docker Compose version v2.12.2
この状態でV1のコマンドを呼び出したいときはdocker-compose-v1コマンドとして実行すれば良いようになっています。
$ docker-compose-v1 --version
docker-compose version 1.29.0, build 07737305
Docker Compose V2に対応したものの各種ドキュメントや自動実行ツールの中身まではメンテナンスが追いつかないなどといった時の一時策としては役立ちそうです。
記事で利用したリンクまとめ
本記事文中で記載したURLを以下にまとめます。
- Docker Compose release notes
- Announcing Compose V2 General Availability
- Install Docker Engine on Ubuntu
- Compose command compatibility with docker-compose
-
GitHub > Compose Switch
まとめ
気付けばDocker Compose V1のEOLがすぐそこまで迫っており、ちょうどいい機会だったのでCompose V2で何が変わるのか、インストール方法、使用感について公式マニュアルを中心に確認しました。
一般的な用途でただ使うだけであれば特に焦る必要はなくプラグインをインストールしてDocker CLIのオプションの一つとしてComposeを使ってあげれば良さそうでした。
また、既存のコマンドをそのままV2のコマンドを実行できるツールが用意されているなど、比較的簡単に移行ができそうであったため安心しました。
あとはちょっとハードな使い方をしたときにどこに影響が出てくるのかなどが気になるところですが取り急ぎの確認としてはここまでといたします。
明日は@yuitomoさんです。
お楽しみに!