Docker Compose v1がEOLになるのでv2を触ってみる

この記事は NTTテクノクロス Advent Calendar 2022 の16日目の記事です。

NTTテクノクロスの飯山です。
普段はCRMシステムの構築・保守や、社内向けにDockerの研修講師をしています。

本記事はDocker Composeを使っている(知っている)けれど、EOLのことを知らなかった。
知っていたけど移行を先延ばしにしていた人向けです。

## はじめに

複数のコンテナの管理/実行を容易にするDocker Composeは[2013年に登場](https://docs.docker.com/compose/release-notes/#001)してから多くのユーザに利用されていたと思います。

https://docs.docker.com/compose/release-notes/#001

そんな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が一般提供が発表された[ブログ](https://www.docker.com/blog/announcing-compose-v2-general-availability/)を参照すると、Docker Compose V2に変わるにあたり、Composeの言語がPythonからGoに切り替わり、Docker CLIのオプションとして統合されるようになりました。構成される言語が切り替わってもV1の互換性を保持しつつ、動作が速くなるなどいくつかのメリットがあるそうです。

https://www.docker.com/blog/announcing-compose-v2-general-availability/

コマンドを使う上では、実行コマンドが切り替わりました。

### V1

```console
$ docker-compose XXXX
```
### V2

```console
$ docker compose XXXX
```



## インストール方法の違い

Compose V1はDockerをインストールしたのち、DockerのGitHubよりComposeファイルを取得することでインストールを行っていましたが、
Compose V2では標準パッケージとしてインストールできるようになっていました。

Docker CEの[インストールページ](https://docs.docker.com/engine/install/ubuntu/#:~:text=Install%20Docker%20Engine%2C%20containerd%2C%20and%20Docker%20Compose.)では、Docker関連パッケージをインストールする際に一緒にインストールするように記載されていますので、公式手順を参照していると意識せずにインストールすることができます。

### V1手順
- Composeファイルの取得
```console
$ curl -L https://github.com/docker/compose/releases/download/1.29.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
```
- 実行権限の付与
```console
$ sudo chmod +x /usr/local/bin/docker-compose
```

### V2手順
- インストール
```console
$ 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
```console
$ 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
```console
$ 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                                                                                                                     
```

### コマンドの差分

先ほどの[ブログ記事](https://www.docker.com/blog/announcing-compose-v2-general-availability/)中に、
> Docker Compose V2 is a drop-in replacement for Compose V1(≒ComposeV1の完全な互換品)

といった記載もあることから基本的にはdocker-composeコマンドがdocker composeコマンドとして切り替わったと理解して良さそうです。

[公式ドキュメント](https://docs.docker.com/compose/cli-command-compatibility/)参照すると新しく追加されたコマンドや未実装のコマンド、削除されたコマンドを確認できます。

https://docs.docker.com/compose/cli-command-compatibility/

#### 追加されたコマンド

```console
$ docker compose cp
```
composeで起動しているコンテナと、ホスト間でファイルをコピーする際に利用するコマンドです。
--allオプションを使うことで、対応するcomposeで起動しているすべてのコンテナに一括でファイルをコピーすることができます。

```console
$ docker compose ls
```
実行されているComposeを一覧で表示するコマンドになります。
composeを起動する際にフラグを指定することで、複数のcomposeを一括で管理できるようになります。

#### 未実装のコマンド
```console
$ compose build --memory
```
コンテナ起動時に使用メモリ量を制限するこのオプション(docker container run --memoryオプションに相当)はまだ未実装とのことです。

composeファイルの起動を自動化しており、さらにそこでメモリ量を制限している場合はcomposeファイルの中でメモリ制限を設定するなどの対応が必要になります。

####  削除されたフラグ

```console
$ compose ps --filter KEY-VALUE service
$ compose rm --alldocker-compose 
$ compose scaledocker-compose
```

## おまけ：compose-switch(V1のコマンドを自動でV2に変換してくれる公式ツール)

[compose-switch](https://github.com/docker/compose-switch)とは、V1のコマンドで実行したものをV2のコマンドに変換することでみかけ上の使用感は変わらずにV2に移行ができるツールです。

https://github.com/docker/compose-switch

### インストール手順

基本的に[READ ME](https://github.com/docker/compose-switch#readme)に記載されている手順を実行するだけでインストールができます。
注意点としては自動セットアップによる構築の場合はインストールする場合、対象のマシンにDocker Compose V1とV2が**どちらもインストール**されている必要がありました

```console
# 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)に変換されて実行されます。

```console
$ docker-compose --version
Docker Compose version v2.12.2
```

この状態でV1のコマンドを呼び出したいときはdocker-compose-v1コマンドとして実行すれば良いようになっています。
```console
$ docker-compose-v1 --version
docker-compose version 1.29.0, build 07737305
```

Docker Compose V2に対応したものの各種ドキュメントや自動実行ツールの中身まではメンテナンスが追いつかないなどといった時の一時策としては役立ちそうです。

## 記事で利用したリンクまとめ

本記事文中で記載したURLを以下にまとめます。
- [Docker Compose release notes](https://docs.docker.com/compose/release-notes/#001)
- [Announcing Compose V2 General Availability](https://www.docker.com/blog/announcing-compose-v2-general-availability/)
- [Install Docker Engine on Ubuntu
](https://docs.docker.com/engine/install/ubuntu/#:~:text=Install%20Docker%20Engine%2C%20containerd%2C%20and%20Docker%20Compose.)
- [Compose command compatibility with docker-compose
](https://docs.docker.com/compose/cli-command-compatibility/)
- [GitHub > Compose Switch
](https://github.com/docker/compose-switch)
    - [GitHub > Compose Switch > README](https://github.com/docker/compose-switch#readme)

## まとめ

気付けばDocker Compose V1のEOLがすぐそこまで迫っており、ちょうどいい機会だったのでCompose V2で何が変わるのか、インストール方法、使用感について公式マニュアルを中心に確認しました。
一般的な用途でただ使うだけであれば特に焦る必要はなくプラグインをインストールしてDocker CLIのオプションの一つとしてComposeを使ってあげれば良さそうでした。
また、既存のコマンドをそのままV2のコマンドを実行できるツールが用意されているなど、比較的簡単に移行ができそうであったため安心しました。
あとはちょっとハードな使い方をしたときにどこに影響が出てくるのかなどが気になるところですが取り急ぎの確認としてはここまでといたします。

明日は@yuitomoさんです。
お楽しみに！