aptにDockerリポジトリを追加してDockerをインストールする

今までおまじない的に使ってきたaptをちょっと勉強したので、アウトプットの練習も兼ねて実際にaptにDockerリポジトリを追加してDockerをインストールしてみる。
環境は以下の通り。

OS: Ubuntu 24.04
shell: fish

aptについては以下を参考にさせて頂いた。

https://zenn.dev/ikkik/articles/ffa45ed1fe5a1a

## aptにDockerリポジトリを追加する

とりあえずDockerのドキュメントを確認して手順通りにやってみる。

https://docs.docker.com/engine/install/ubuntu/#installation-methods

順にコマンドを実行していく。

```
❯ sudo apt install ca-certificates curl
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
ca-certificates はすでに最新バージョン (20240203) です。
curl はすでに最新バージョン (8.5.0-2ubuntu10.3) です。
```
関連パッケージは既にインストール済み。

```
sudo install -m 0755 -d /etc/apt/keyrings
```
`install`コマンドなるものがあるらしい。
`cp`と似ているけど、パーミッションの設定やディレクトリの作成などを同時にやってくれるっぽい。
これは単にディレクトリ作ってパーミッション設定してるぽい。

```
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
```

Dockerの公開鍵を取得して、先程作成したディレクトリに出力している。
curlのオプションはいずれもエラー出力やリダイレクトに関するものなのであまり気にしなくて良さそう。

```
/etc/apt/keyrings🔒
❯ ll
合計 4.0K
-rw-r--r-- 1 root root 3.8K  9月 13 11:02 docker.asc
```
ちゃんとできてる。

```
sudo chmod a+r /etc/apt/keyrings/docker.asc
```
パーミッションを設定。

```
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  ```

とりあえず前部分だけ流して結果を見てみる。
~~~
❯ echo \
        "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
    $(. /etc/os-release && echo "$VERSION_CODENAME") stable"
/etc/os-release (line 1): Unsupported use of '='. In fish, please use 'set PRETTY_NAME "Ubuntu 24.04.1 LTS"'.
PRETTY_NAME="Ubuntu 24.04.1 LTS"
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
from sourcing file /etc/os-release
in command substitution
.: Error while reading file '/etc/os-release'
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu    stable
~~~

なんかエラー出た。
バージョンコードネームの部分が取得できてないっぽい。
fishシェル使っているからその影響かな？

とりあえず、`/etc/os-release`の中身を見てみる。
```
❯ cat /etc/os-release
(略)
VERSION_CODENAME=noble
(略)
```
この値が取れれば良さそう。

色々調べて見たところ、`lsb_release`というコマンドでこのあたりの情報が取得できるっぽい。
というわけでこのパッケージを導入する。
```
❯ sudo apt install lsb-release
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
lsb-release はすでに最新バージョン (12.0-2) です。
```

入ってた。

```
❯ lsb_release -cs
No LSB modules are available.
noble
```
これで取れそうなので、一部書き換えて実行する。
```
❯ echo \
        "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) stable"
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu   noble stable

~
❯
```

大丈夫そうなので、改めてコマンドを流す。

```
❯ echo \
        "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) stable" | \
        sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

~
❯
```

参考にしたサイトには
>Ubuntu公式のリポジトリ情報は/etc/apt/sources.listに記述され、サードパーティのリポジトリ情報は/etc/apt/sources.list.d/以下に「～.list」または「～.sources」というファイル名で記述する。

と記載があるので、Dockerのリポジトリをこの段階で追加していると見て良さそう。
ファイルの内容も確認しておく。

```
❯ cat /etc/apt/sources.list.d/docker.list
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu   noble stable

~
❯
```

## Dockerをインストールする

リポジトリが追加できたので、Dockerをインストールしてみる。
```
❯ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
提案パッケージ:
  aufs-tools cgroupfs-mount | cgroup-lite
以下のパッケージが新たにインストールされます:
  containerd.io docker-buildx-plugin docker-ce docker-ce-cli
  docker-compose-plugin

  (中略)

docker-compose-plugin (2.29.2-1~ubuntu.24.04~noble) を設定しています ...
docker-ce-cli (5:27.2.1-1~ubuntu.24.04~noble) を設定しています ...
docker-ce (5:27.2.1-1~ubuntu.24.04~noble) を設定しています ...
man-db (2.12.0-4build2) のトリガを処理しています ...

~ took 20s
❯
```
インストールできた！
正常にインストールされているか確認

```
❯ docker -v
Docker version 27.2.1, build 9e34c9b

~
❯
```
問題なさそう。

## listファイルの中身
こちらを参考に中身を見てみる。

https://gihyo.jp/admin/serial/01/ubuntu-recipe/0677

中身の形式は以下のようになってるっぽい。
> deb [ option1=value1 option2=value2 ] uri suite [component1] [component2] [...]

```
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu   noble stable
```

`uri`はリポジトリのURIを指定していて、
`suite`にはUbuntuのコードネームを含む「noble stable」が指定されているという理解でいいのかな。

参考にしたサイトによると、全ての`apt`コマンドのバージョンが1.4以上で、`signed-by`に公開鍵のパスを指定すれば、鍵をdearmorしなくても大丈夫みたい。