Dockerのインストール手順

## はじめに

Dockerのインストール手順です。インストールは公式サイトをもとに行っています。

## 環境

Ubuntu20.4　(Windows10 + Vagrant)

## 公式サイト

https://docs.docker.com/engine/install/ubuntu/

## 手順

#### １．非公式の Docker パッケージの削除

ディストリビューションよっては、インストール済みのDockerパッケージが存在する場合があるようです。そのようなパッケージが、公式のDockerパッケージと競合する可能性があるため、公式のDocker Engineをインストールする前に削除します。

削除するDockerパッケージはつぎの６個です。

- docker.io
- docker-compose
- docker-compose-v2
- docker-doc
- podman-docker

```
$for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
```

#### ２．Dockerのインストール

インストール方法はいくつかありますが、aptでインストールします。普通はaptでインストールするものだと思います。

まずは、CA証明書をインストールします。こちらはDockerのHTTPS通信で必要になります。curlはインストール済であれば不要です。

```
$sudo apt-get update
$sudo apt-get install ca-certificates curl
```

インストールされたことを確認します。

```
$apt list --installed | grep ca-ccertificates
```

/etc/apt/keyringsディレクトリを作成します。

```
$sudo install -m 0755 -d /etc/apt/keyrings
```

keyringsディレクトリのパーミションが755で作成されていることを確認します。

```
$ls -l /etc/apt
```

公開鍵をダウンロードします。公開鍵はPGPによって生成されています。

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

etc/apt/sources.list.d/docker.list にDockerのリモートリポジトリのアドレスを追加します。

Dockerはaptのリポジトリには置いていおらず、Docker独自のリポジトリから取得するようになっています。

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

更新した内容を確認します。

```
$cat /etc/apt/sources.list.d/docker.list
```

パッケージの一覧を最新にします。

```
$sudo apt-get update
```

ここに来てようやく本番。Dockerをインストールします。aptを使ってインストールしていますが、Dockerのリモートリポジトリからインストールしています。

```
$sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```

Dockerがインストールされたことを確認します。

```
$apt list --installed | grep docker
```

Dockerイメージを実行してインストールが成功したことを確認します。

```
$sudo docker run hello-world
```

Dockerデーモンが起動されていることを確認します。

```
$service --status-all
$systemctl status docker
```

#### ３．dockerグループの追加

プロセス間通信にTCPポートを使っているデーモンであれば、一般ユーザーでも利用できますが、UNIXソケットを使っている場合は、基本的にrootでないと利用できないようになっています。DockerデーモンはUNIXソケットを使っておりrootでないと利用できません。

つまり、dockerコマンドを利用するときは、先頭にsudoをつけて実行することになります。毎回sudoを付けなくてもいいようにするには、dockerグループを作成してdockerグループに自分のユーザーを追加すれば対応できます。dockerグループを用意しておくと、DockerデーモンがdockerグループからUNIXソケットにアクセスできるようになります。

ディストリビューションによっては、dockerグループを手動で作成しなくても、自動で作成されるようになっている場合があるようです。ちなみに、自分の環境では自動で作成されていました。

```
$cat /etc/group
```

ユーザーをdockerグループに追加します。ここに関しては自動で行われません。必ず、手動で行う必要があります。

```
sudo usermod -aG docker $USER
```

追加されたことを確認します。

```
$cat /etc/group
docker:x:996:   			# 変更前
docker:x:996:vagrant		# 変更後
```

グループへの追加を再ログインすることなく反映させます。

```
$newgrp docker
```

sudoを付けずにdockerコマンドが実行できることを確認します。

```
$docker run hello-world
```

dockerデーモンが自動起動になっているかどうかを確認します。インストール直後はデフォルトでは自動起動になっています。

```
$systemctl is-enabled docker.service
$systemctl is-enabled containerd.service
enabled
```

自動起動を止めたい場合はつぎのコマンドで止めます。

```
$systemctl disable docker.service
$systemctl disable containerd.service
```

#### ４．デフォルトのログドライバーを構成する

Dockerはjson-fileというログドライバーを利用してログを収集します。json-fileの代わりに、OSが持っているjournald-systemd、rsyslogを利用することもできます。

json-fileを使う場合、ログローテを行う機能は自動で設定されていないため、デフォルトのままにしておくと、ログはどんどんと肥大化していくことになります。json-fileのログローテは自分で設定する必要があります。

次のファイルを新規作成します。デフォルトでは/etc/docker/daemon.jsonファイルは存在していません。

```
$vi /etc/docker/daemon.json
```

つぎのようにファイルを編集します。ログは10MBまでとして、履歴を5ファイルまで保持しますという例です。

```daemon.json
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "5"
  }
}
```

設定ファイルを有効にするためにデーモンを再起動します。

```
$sudo systemctl restart docker.service
```

これで、json-fileのログローテが有効になりました。