CentOS7でDocker（20.10.3）のバージョンアップの作業記録

## はじめに
CentOS7／docker1.13.1の環境上のとある開発環境で ```docker-compose up``` の実行時にエラーが出た事がきっかけで、dockerのバージョンをあげようとした際の調査と作業の記録です。

はじめに、とある開発環境での```docker-compose up```時、以下のエラーが発生しました。

```
$ docker-compose up
Building with native build. Learn about native build in Compose here: https://docs.docker.com/go/compose-native-build/
Building web
unknown flag: --iidfile
See 'docker build --help'.
ERROR: Service 'web' failed to build
```
[「Moby」ベースとなったオープンソース版Dockerの最新状況](https://knowledge.sakura.ad.jp/11068/) によると、
>さらに　Docker 17.06では、docker buildコマンドに「–iidfile ＜ファイル＞」オプションが追加された。これはビルドの完了後、指定したファイルに作成されたイメージのイメージIDを出力するというものだ。これらの機能はスクリプトファイルなどを利用したコンテナ作成の自動化などに役立つだろう。

とのことで、どうやら「docker 17.06」以降のフラグ設定がどこかで使われてるようだという所まで確認。早速、Dockerのバージョンアップに取り掛かったのが、これがなかなかの大仕事に発展したのでした。
## 参考

- [CentOS7.5に最新バージョンのDockerをインストールする](https://qiita.com/okcoder/items/e91f1e339c114e0be129)
- [Docker CE の入手（CentOS 向け）](https://docs.docker.jp/engine/installation/linux/docker-ce/centos.html)
- [/bootパーテーションの容量拡張方法（resize2fs）](https://qiita.com/Tamamushi/items/91f467602353b70831cf)

## 環境
- CentOS Linux release 7.9.2009 (Core)
- Docker 1.13.1

## 確認
```
$ yum list installed | grep docker
  docker.x86_64　　　　2:1.13.1-203.git0be3e21.el7.centos
```
## 手順

- 古いバージョンのdockerの削除
- 必要なパッケージのインストール
- リポジトリを追加する
- Docker CEをインストール
- 自動起動を設定
- dockerを起動する

```
$ sudo yum remove docker  docker-client  docker-client-latest  docker-common  docker-latest  docker-latest-logrotate  docker-logrotate  docker-selinux  docker-engine-selinux  docker-engine
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install docker-ce -y 
$ sudo systemctl enable docker
$ sudo systemctl start docker
```
ここでエラー発生

```
$ sudo systemctl start docker
Job for docker.service failed because start of the service was attempted too often. See "systemctl status docker.service" and "journalctl -xe" for details.
To force a start use "systemctl reset-failed docker.service" followed by "systemctl start docker.service" again.
```
これを見ると、```systemctl status docker.service```と```journalctl -xe```を見ろと出てる。
実行結果と考察は省略。


## yum upgradeを実行
どうやらkernelのバージョンが古い事が原因のように見受けられる。そこで、まずシステムのバージョンアップを試みる。

```
$ sudo yum upgrade

Transaction Check Error:
  installing package grub-1:0.97-99.el6.x86_64 needs 4KB on the /boot filesystem
  installing package kernel-2.6.32-696.el6.x86_64 needs 29MB on the /boot filesystem

Error Summary

Disk Requirements:
  At least XXMB more space needed on the /boot filesystem.
```
/bootの容量が足りずに```yum upgrade```が失敗。

## /bootの容量の拡張

- 拡張ディスクを追加する
- 拡張ディスクにLVMパーテションを作成する
- 物理ボリュームを追加した拡張ディスクに作成する
- ボリュームグループ名を確認し、作成した物理ボリュームを加える
- 既存の物理ボリュームら新規に作成した物理ボリュームにデータを移動する
- 既存の物理ボリュームをボリュームグループから削除する
- 既存の物理ボリュームのパーテションを再作成しつつ拡張する
- 再起動し拡張したパーテーションを認識させる
- 再作成した/bootパーテションをresize2fsで拡張する

参考：[/bootパーテーションの容量拡張方法（resize2fs）](https://qiita.com/Tamamushi/items/91f467602353b70831cf)

## 容量拡張 → 引き続きエラー発生
今回、たまたま2台同一環境のマシンのDockerのアップデート作業を実施していた所、```/boot```パーテーションの拡張で1台は問題解消されたのだが、なぜかもう1台は引き続き以下エラーが出続けてしまっていた。その際の解消に至った内容も追記しておく。

エラーは以下の通り

```
Client: Docker Engine - Community
 Version:           20.10.3
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        48d30b5
 Built:             Fri Jan 29 14:34:14 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true
Cannot connect to the Docker daemon at xxxxxxxx. Is the docker daemon runnnig?
```

エラーを詳細に表示させたい場合、以下のように```dockerd```で直接起動させると起動の様子を表示させることが出来る。

```
$ sudo dockerd
INFO[2021-02-20T04:05:49.872817325+09:00] Starting up
INFO[2021-02-20T04:05:49.883049052+09:00] libcontainerd: started new containerd process  pid=15581
INFO[2021-02-20T04:05:49.883118400+09:00] parsed scheme: "unix"                         module=grpc
INFO[2021-02-20T04:05:49.883133982+09:00] scheme "unix" not registered, fallback to default scheme  module=grpc
INFO[2021-02-20T04:05:49.883157429+09:00] ccResolverWrapper: sending update to cc: {[{unix:///var/run/docker/containerd/containerd.sock  <nil> 0 <nil>}] <nil> <nil>}  module=grpc
INFO[2021-02-20T04:05:49.883168139+09:00] ClientConn switching balancer to "pick_first"  module=grpc
INFO[2021-02-20T04:05:49.901808034+09:00] starting containerd                           revision=269548fa27e0089a8b8278fc4fc781d7f65a939b version=1.4.3
INFO[2021-02-20T04:05:49.927994720+09:00] loading plugin "io.containerd.content.v1.content"...  type=io.containerd.content.v1
　・
　・
　・
INFO[2021-02-20T04:05:49.965815327+09:00] parsed scheme: "unix"                         module=grpc
INFO[2021-02-20T04:05:49.965839790+09:00] scheme "unix" not registered, fallback to default scheme  module=grpc
INFO[2021-02-20T04:05:49.965854868+09:00] ccResolverWrapper: sending update to cc: {[{unix:///var/run/docker/containerd/containerd.sock  <nil> 0 <nil>}] <nil> <nil>}  module=grpc
INFO[2021-02-20T04:05:49.965860494+09:00] ClientConn switching balancer to "pick_first"  module=grpc
INFO[2021-02-20T04:05:50.065495949+09:00] [graphdriver] using prior storage driver: overlay2
INFO[2021-02-20T04:05:50.301671913+09:00] Loading containers: start.
INFO[2021-02-20T04:05:50.653224046+09:00] Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferred IP address
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x28 pc=0x555dab9e432c]
```
上記ではエラー内容少し違うが、この時ハマったのはバージョンアップ前のコンテナを起動させっぱなしでバージョンアップを試みた為、コンテナや仮想ネットワークが中途半端に残ってしまっていた。なので、古いコンテナのクリーンアップを実施

```
$ sudo rm /var/lib/docker/containers/ -rf 
```
また、```swap```領域をfdiskで定義し忘れていた事も可能性としてはありそう。この2つを解消して最後は無事起動させることが出来た。