Ubuntu上にDocker環境を構築

# はじめに
2013年にDockerが誕生してから10年経ち、使い古いされてきた。
もっと言うと、コンテナ環境=Kubernetesと言われるくらいオーケストレーションツールが普及している。
コンテナエンジンとしては、Docker以外にもPodmanといった新種も出ている。

https://www.creationline.com/lab/aquasecurity/32297

https://podman.io/

そんな中でDocker環境の構築を記すのは、私がより実践的なコンテナ開発・運用方法を習得する必要が出てきたからです。
規模の大きいシステムをコンテナ環境で運用することを検討（画策）している。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/docker?src=hash&amp;ref_src=twsrc%5Etfw">#docker</a> を学び直します！<br>断片的な知識を整理して、本番での運用能力を養うのと単純に兼務部署の上司にコンテナの良さをプレゼンする必要が出てきた。 <a href="https://t.co/ksUqIM2Qlt">pic.twitter.com/ksUqIM2Qlt</a></p>&mdash; LittleBear🐻 (@littlebear_6w6) <a href="https://twitter.com/littlebear_6w6/status/1649344510693093382?ref_src=twsrc%5Etfw">April 21, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

そんな状況で、技術評論社社から出版されている山田明憲氏著「Docker/Kubernetes 実践開発入門」に取り組むことに！

https://gihyo.jp/book/2018/978-4-297-10033-9

書籍にはLinux環境での構築はオプション的になっていて記述が少なかったので、やったことのメモも兼ねて当記事にまとめておく。
Linux環境でも[Docker Desktop](https://docs.docker.com/desktop/install/linux-install/)が使えるようになっているが、今回はあえてDocker EngineをインストールするCLI環境を構築した。
CLI環境にした理由は、この先の拡張性があるかなという程度です。

# 環境
|項目|値|
|----|----|
|OS|Linux|
|ディストリビューション|Ubuntu 22.04.02 LTS|
|Docker Engine|23.0.4|
|Docker Compose|2.17.2|

# Dockerインストール方法
基本的には[公式サイト](https://docs.docker.com/engine/install/ubuntu/)が丁寧に解説してくれているので、従ってインストールする。

１．aptの参照リポジトリにDockerを登録
```bash:Dockerリポジトリを登録
$ sudo apt-get update
$ sudo apt-get install \
    ca-certificates \
    curl \
    gnupg
```
２．DockerのGPGキーを登録
```bash:GPGキー登録
$ sudo install -m 0755 -d /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
```
３．リポジトリのセットアップ
```bash:リポジトリのセットアップ
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```
４．Docker Engine、containerd、Docker Composeをインストール
```bash:Dockerインストール
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```
５．稼働確認
```bash:hello-worldコンテナを実行
$ sudo docker run hello-world
```

# dockerコマンドを`sudo`なしで実行できるようにする
使用しているUserをDockerグループに入れる。
これにより、`/var/run/docker.sock`に書込み権限を付加できるので`sudo`なしで`docker ps`等が打てるようになる。
```bash:Dockerグループに追加
sudo usermod -aG docker $(whoami)
```
:::note info
ログアウトしても反映されない場合があります。
その場合は、再起動しましょう！
:::

# docker imagesの格納場所を変更する
Dockerを多用した開発をした場合、docker imagesが増えてDiskを逼迫させる恐れがる。
デフォルトでは`/var/lib/docker`がDocker Rootになっていて、このディレクトリにイメージが保存される。
また、複数のDiskをマウントしていてディレクトリを分けて保存している場合、`/var`を入れているDiskは小さくてすぐ一杯になる恐れがる。
その場合は、容量が大きいDiskに移しましょう！
そして、`/var/lib/docker`にシンボルリンクを張れば、細かい設定変更なしで問題なく使用できます！
1. DockerデーモンとDockerソケットを止める
1. Docker Rootディレクトリを移動
1. `/var/lib/docker`のシンボルリンクを移動先に張る
1. DockerデーモンとDockerソケットを起動
1. `hello-world`コンテナが起動するか確認

```bash:Docker Rootディレクトリを変更
$ sudo systemctl stop docker.service
$ sudo systemctl stop docker.socket
$ mv /var/lib/docker ~/dockerRoot/
$ sudo ln -s ~/dockerRoot/docker /var/lib/docker
$ sudo systemctl start docker.service
$ sudo systemctl start docker.socket
$ sudo docker run hello-world
```

# Dockerプラグインにパスを通す
`$PATH`に追加しても良いが、`/usr/local/bin`にシンボルリンクを張る。
`/usr/local/bin`はパスが通っているので、ここにシンボルリンクを張るだけで使用できる。
```bash:Dockerプラグインにパスを通す
$ sudo ln -s /usr/libexec/docker/cli-plugins/ /usr/local/bin/
```

# 参考資料
https://docs.docker.com/engine/install/ubuntu/

https://rikeiin.hatenablog.com/entry/2019/09/13/115611