Ubuntu22.04へDockerとDocker Compose v2 をインストール

:::note info
【2024.8.30追記】現在の公式マニュアルに沿った手順は以下を参照ください
**「[Ubuntu24.04へDocker Engine 一式をインストール （Compose含む）](https://qiita.com/kujiraza/items/00b9066c49ddfc718fd6)」**- Qiita 
:::

# はじめに

Ubuntu 22.04 LTS をメインで使用するようになったので、ついでに今どきのDocker & Docker Composeの導入方法を調べてみました。

以下の記事の内容をベースにまとめなおしています。

https://qiita.com/kujiraza/items/e1bf4069514ce8c4fd4d

# 環境

* インストール先
    * Ubuntu Server 22.04.1 LTS (x86_64) 
        * デスクトップ環境は使用していません

* インストールするもの
    * Docker
    * Docker Compose

# 手順

デスクトップ環境がある場合は、[Docker Desktop on Linux](https://docs.docker.com/desktop/install/linux-install/) の導入が推奨されるようになったようですが、デスクトップ環境は利用していないので無視します。
ここでは以下の手順を記載します。

* Docker のリポジトリからDocker をインストール
* Docker のリポジトリからCompose をインストール （手軽に導入したい場合はこちら）
* 手動で Compose をインストール（最新版を利用したい場合はこちら）

Composeの導入方法はどちらか1つを実行すればいいです。

##  Docker のリポジトリからDocker をインストール

:::note info
【参考】["Install Docker Engine on Ubuntu - Install using the repository"](https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository). docker docs. 
:::

参考サイト記載の手順で実施します。ただし手動ではapt-getよりもaptを使うのが好みなのでそこは変更しています。
以前と比較してGPGキーの保存先フォルダが変わったほか、アーキテクチャを自動判別するようになっています。

```bash:Dockerのリポジトリを登録してインストール
# 依存パッケージインストール
sudo apt update
sudo apt install \
  ca-certificates curl gnupg lsb-release

# Dockerの公式GPGキーを追加
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# Dockerリポジトリ登録
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \
  | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Docker Engineのインストール
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
```

```bash:動作確認
$ docker --version
Docker version 20.10.17, build 100c701

$ sudo docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.
...
```

## Docker のリポジトリからCompose をインストール 

:::note info
【参考】["Install Docker Compose CLI plugin - Install using the repository"](https://docs.docker.com/compose/install/compose-plugin/#install-using-the-repository). docker docs. 
:::


手軽に導入したい場合はこちらがおすすめ。上で登録したリポジトリから Conpose v2 が簡単にインストールできます。

```bash:Docker のリポジトリからCompose をインストール
sudo apt install docker-compose-plugin
```

```bash:動作確認(2022.8.20時点）
$ docker compose version
Docker Compose version v2.6.0
```

##  手動で Compose をインストール

:::note info
【参考】["Install Docker Compose CLI plugin - Install the plugin manually"](https://docs.docker.com/compose/install/compose-plugin/#install-the-plugin-manually). docker docs. 
:::

リポジトリで導入できるバージョンより新しいものを利用したい場合はこちらをどうぞ。
ファイルをダウンロードして指定された場所に保存するだけなのでさほど手間はかかりませんが、バージョンアップは自分で対応する必要があります。


```bash:自分だけが使用する場合（x86_64用)
# DOCKER_CONFIG 変数に値が入っていればそのまま、値が入っていなければ $HOME/.docker を代入する
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
# インストール先ディレクトリを作成する
mkdir -p $DOCKER_CONFIG/cli-plugins
# リリースモジュールをダウンロードし、docker-composeという名前でインストール先に保存する
curl -SL \
  https://github.com/docker/compose/releases/download/v2.10.0/docker-compose-linux-x86_64 \
  -o $DOCKER_CONFIG/cli-plugins/docker-compose
# docker-composeを実行可能にする
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
```

```bash:すべてのユーザが使用する場合（x86_64用)
# インストール先ディレクトリを作成する
sudo mkdir -p /usr/local/lib/docker/cli-plugins
# リリースモジュールをダウンロードし、docker-composeという名前でインストール先に保存する
sudo curl -SL \
  https://github.com/docker/compose/releases/download/v2.10.0/docker-compose-linux-x86_64 \
  -o /usr/local/lib/docker/cli-plugins/docker-compose
# docker-composeを実行可能にする
sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
```

```bash:動作確認
$ docker compose version
Docker Compose version v2.10.0
```
:::note info
- 他のバージョンを使いたい場合は、curlに指定したURLのバージョン部分を変更して手順を再実行します
（つまりは docker-composeファイルの上書き）
- curlに指定したURLは、[GitHUBのリリースページ](https://github.com/docker/compose/releases)掲載ファイルのダウンロードURLです
- Docker Compose は 以下の5つの場所にインストール可能です。
  【参考】 ["Where to get Docker Compose"](https://github.com/docker/compose#where-to-get-docker-compose). Github. 
  - ```$HOME/.docker/cli-plugins```
  - ```/usr/local/lib/docker/cli-plugins```
 OR ```/usr/lib/docker/cli-plugins```
  - ```/usr/local/libexec/docker/cli-plugins``` 
OR  ```/usr/libexec/docker/cli-plugins```
:::

# Compose優先順位について

Compose導入の3つの手順をすべて実施した場合の、実行時の優先順位を確認したので載せておきます。手順ごとに導入バージョンを変更して確認しました。

1. 手動で Compose v2.10.0 をインストール（自分だけが使用する場合）
2. 手動で Compose v2.9.0 をインストール（すべてのユーザが使用する場合）
3. Docker のリポジトリからCompose v2.6.0 をインストール

```bash: 1,2,3すべて実施した場合の結果
# sudo なしの場合は1で導入したバージョンが表示
$ docker compose version
Docker Compose version v2.10.0

# sudo ありの場合は2で導入したバージョンが表示
$ sudo docker compose version
Docker Compose version v2.9.0
```

1,2,3 の手順全て実施した場合の他にも、どんなパターンの時にどの手順で導入されたバージョンが表示されるかを上の要領で確認しました。その結果をまとめたものがこちら。

| 1 | 2 | 3 | sudoなし | sudoあり |
|:---:|:---:|:---:|:---:|:---:|
| ○ | ○ | ○ | 1で導入 | 2で導入 |
| ○ | ○ |   | 1で導入 | 2で導入 |
| ○ |   | ○ | 1で導入 | 3で導入 |
| ○ |   |   | 1で導入 | エラー[^2]  |
|   | ○ | ○ | 2で導入 | 2で導入 |
|   | ○ |   | 2で導入 | 2で導入 |
|   |   | ○ | 3で導入 | 3で導入 |

[^2]: compose はdockerコマンドではない（```docker: 'compose' is not a docker command.```）といわれる

結果として、1 > 2 > 3 の優先順位となりました。ただし、sudoをつけた場合は1の手順で導入したものは無視されるようです。
1 の手順を使用する場合は、sudoなしでdockerを実行できるようにしておいたほうがよさそうです。（やり方はググってください！）

# おわりに

Docker Compose v2 はaptで導入できるようになったので、更新がだいぶ楽になりましたね！
今回はUbuntu Server 22.04 で確認しましたが、 [こちらの記載](https://docs.docker.com/engine/install/ubuntu/#os-requirements) によるとDocker のリポジトリからaptでインストールする手順はバージョン18.04, 20.04, 21.10 でも使えるようです。x86_64だけでなくamd64, armhf, arm64, s390x アーキテクチャでもよさそうですよ。

[^1]: ["Install Docker Engine on Ubuntu - OS requirements" ](https://docs.docker.com/engine/install/ubuntu/#os-requirements) の章を参照