Docker & Docker Compose on CentOS8

RHEL8からDockerコンテナーエンジン、Dockerコマンド等は無くなり、[サポート対象外](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html-single/building_running_and_managing_containers/index)になっています。そのクローンOSであるCentOS8も同等であります。
デフォルト状態では、yum、dnfでインストールしようとしてもリポジトリにDockerが無いことも確認できます。

RedHatとしては今後は[podman](https://podman.io/)を推奨のようです。

そんな中、CentOS8でDockerを稼働させる必要に迫られたので、その手順をまとめておくことにします。（自己責任の範囲）

CentOS8でDockerを稼働させる参考サイトは結構ありましたが、以下サイトを参考にさせてもらいました。感謝致します。

[CentOS8にDockerをインストール。名前解決できなかったのが解消した。](https://qiita.com/bashaway/items/4001c0ad5a6f21957986)

検証環境は以下となります。

- VirtualBox Version6.1.2 r135662
- CentOS Linux release 8.1.1911 (Core)
- kernel 4.18.0-147.5.1.el8_1.x86_64

# podmanアンインストール
本環境ではデフォルト状態でpodmanがインストールされていたのでアンインストールします。

```Linux:コマンド
# dnf -y remove podman
モジュラーの依存に関する問題:

 問題 1: conflicting requests
  - nothing provides module(perl:5.26) needed by module perl-DBD-SQLite:1.58:8010020191114033549:073fa5fe-0.x86_64
 問題 2: conflicting requests
  - nothing provides module(perl:5.26) needed by module perl-DBI:1.641:8010020191113222731:16b3ab4d-0.x86_64
依存関係が解決しました。
=============================================================================================================================================================
 パッケージ                         アーキテクチャー          バージョン                                                 リポジトリー                  サイズ
=============================================================================================================================================================
削除中:
 podman                             x86_64                    1.6.4-2.module_el8.1.0+272+3e64ee36                        @AppStream                     57 M
依存関係パッケージの削除:
 cockpit-podman                     noarch                    11-1.module_el8.1.0+272+3e64ee36                           @AppStream                    4.0 M
未使用の依存関係の削除:
 conmon                             x86_64                    2:2.0.6-1.module_el8.1.0+272+3e64ee36                      @AppStream                     83 k
 libvarlink                         x86_64                    18-3.el8                                                   @anaconda                     129 k
 podman-manpages                    noarch                    1.6.4-2.module_el8.1.0+272+3e64ee36                        @AppStream                    137 k

トランザクションの概要
=============================================================================================================================================================
削除  5 パッケージ

解放された容量: 62 M
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
  準備             :                                                                                                                                     1/1
  scriptletの実行中: cockpit-podman-11-1.module_el8.1.0+272+3e64ee36.noarch                                                                              1/1
  削除             : cockpit-podman-11-1.module_el8.1.0+272+3e64ee36.noarch                                                                              1/5
  削除             : podman-1.6.4-2.module_el8.1.0+272+3e64ee36.x86_64                                                                                   2/5
  scriptletの実行中: podman-1.6.4-2.module_el8.1.0+272+3e64ee36.x86_64                                                                                   2/5
  削除             : podman-manpages-1.6.4-2.module_el8.1.0+272+3e64ee36.noarch                                                                          3/5
  削除             : conmon-2:2.0.6-1.module_el8.1.0+272+3e64ee36.x86_64                                                                                 4/5
  削除             : libvarlink-18-3.el8.x86_64                                                                                                          5/5
  scriptletの実行中: libvarlink-18-3.el8.x86_64                                                                                                          5/5
  検証             : cockpit-podman-11-1.module_el8.1.0+272+3e64ee36.noarch                                                                              1/5
  検証             : conmon-2:2.0.6-1.module_el8.1.0+272+3e64ee36.x86_64                                                                                 2/5
  検証             : libvarlink-18-3.el8.x86_64                                                                                                          3/5
  検証             : podman-1.6.4-2.module_el8.1.0+272+3e64ee36.x86_64                                                                                   4/5
  検証             : podman-manpages-1.6.4-2.module_el8.1.0+272+3e64ee36.noarch                                                                          5/5

削除しました:
  podman-1.6.4-2.module_el8.1.0+272+3e64ee36.x86_64                               cockpit-podman-11-1.module_el8.1.0+272+3e64ee36.noarch
  conmon-2:2.0.6-1.module_el8.1.0+272+3e64ee36.x86_64                             libvarlink-18-3.el8.x86_64
  podman-manpages-1.6.4-2.module_el8.1.0+272+3e64ee36.noarch

完了しました!
```

# Dockerインストール

## リポジトリ追加
dnfコマンドでDockerをインストールしてもパッケージが無いと表示されるので、まずはリポジトリを追加します。

```Linux:コマンド
# dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
repo の追加: https://download.docker.com/linux/centos/docker-ce.repo
```

## Dockerインストール
dnfコマンドで普通にインストールしようとすると依存関係の問題でインストールできません。一旦ここでは「--nobest」オプションを指定して強制的にインストールを行います。

```Linux:コマンド
# dnf -y install --nobest docker-ce docker-ce-cli
CentOS-8 - AppStream                                                                                                          11 kB/s | 4.3 kB     00:00
CentOS-8 - Base                                                                                                              8.0 kB/s | 3.8 kB     00:00
CentOS-8 - Extras                                                                                                            2.4 kB/s | 1.5 kB     00:00
Docker CE Stable - x86_64                                                                                                     53 kB/s |  21 kB     00:00
依存関係が解決しました。

 問題: package docker-ce-3:19.03.6-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed
  - cannot install the best candidate for the job
  - package containerd.io-1.2.10-3.2.el7.x86_64 is excluded
  - package containerd.io-1.2.2-3.3.el7.x86_64 is excluded
  - package containerd.io-1.2.2-3.el7.x86_64 is excluded
  - package containerd.io-1.2.4-3.1.el7.x86_64 is excluded
  - package containerd.io-1.2.5-3.1.el7.x86_64 is excluded
  - package containerd.io-1.2.6-3.3.el7.x86_64 is excluded
=============================================================================================================================================================
 パッケージ                            アーキテクチャー               バージョン                              リポジトリー                             サイズ
=============================================================================================================================================================
インストール:
 docker-ce                             x86_64                         3:18.09.1-3.el7                         docker-ce-stable                          19 M
 docker-ce-cli                         x86_64                         1:19.03.6-3.el7                         docker-ce-stable                          40 M
依存関係のインストール:
 libcgroup                             x86_64                         0.41-19.el8                             BaseOS                                    70 k
 containerd.io                         x86_64                         1.2.0-3.el7                             docker-ce-stable                          22 M
壊れた dependencies のパッケージをスキップします:
 docker-ce                             x86_64                         3:19.03.6-3.el7                         docker-ce-stable                          24 M

トランザクションの概要
=============================================================================================================================================================
インストール  4 パッケージ
スキップ      1 パッケージ

ダウンロードサイズの合計: 80 M
インストール済みのサイズ: 338 M
パッケージのダウンロード:
(1/4): libcgroup-0.41-19.el8.x86_64.rpm                                                                                      353 kB/s |  70 kB     00:00
(2/4): containerd.io-1.2.0-3.el7.x86_64.rpm                                                                                  6.2 MB/s |  22 MB     00:03
(3/4): docker-ce-cli-19.03.6-3.el7.x86_64.rpm                                                                                9.4 MB/s |  40 MB     00:04
(4/4): docker-ce-18.09.1-3.el7.x86_64.rpm                                                                                    3.6 MB/s |  19 MB     00:05
-------------------------------------------------------------------------------------------------------------------------------------------------------------
合計                                                                                                                          14 MB/s |  80 MB     00:05
警告: /var/cache/dnf/docker-ce-stable-091d8a9c23201250/packages/containerd.io-1.2.0-3.el7.x86_64.rpm: ヘッダー V4 RSA/SHA512 Signature、鍵 ID 621e9f35: NOKEY
Docker CE Stable - x86_64                                                                                                     13 kB/s | 1.6 kB     00:00
GPG 鍵 0x621E9F35 をインポート中:
 Userid     : "Docker Release (CE rpm) <docker@docker.com>"
 Fingerprint: 060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35
 From       : https://download.docker.com/linux/centos/gpg
鍵のインポートに成功しました
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
  準備             :                                                                                                                                     1/1
  インストール中   : docker-ce-cli-1:19.03.6-3.el7.x86_64                                                                                                1/4
  scriptletの実行中: docker-ce-cli-1:19.03.6-3.el7.x86_64                                                                                                1/4
  インストール中   : containerd.io-1.2.0-3.el7.x86_64                                                                                                    2/4
  scriptletの実行中: containerd.io-1.2.0-3.el7.x86_64                                                                                                    2/4
  scriptletの実行中: libcgroup-0.41-19.el8.x86_64                                                                                                        3/4
  インストール中   : libcgroup-0.41-19.el8.x86_64                                                                                                        3/4
  scriptletの実行中: libcgroup-0.41-19.el8.x86_64                                                                                                        3/4
  scriptletの実行中: docker-ce-3:18.09.1-3.el7.x86_64                                                                                                    4/4
  インストール中   : docker-ce-3:18.09.1-3.el7.x86_64                                                                                                    4/4
  scriptletの実行中: docker-ce-3:18.09.1-3.el7.x86_64                                                                                                    4/4
  検証             : libcgroup-0.41-19.el8.x86_64                                                                                                        1/4
  検証             : containerd.io-1.2.0-3.el7.x86_64                                                                                                    2/4
  検証             : docker-ce-3:18.09.1-3.el7.x86_64                                                                                                    3/4
  検証             : docker-ce-cli-1:19.03.6-3.el7.x86_64                                                                                                4/4

インストール済み:
  docker-ce-3:18.09.1-3.el7.x86_64       docker-ce-cli-1:19.03.6-3.el7.x86_64       libcgroup-0.41-19.el8.x86_64       containerd.io-1.2.0-3.el7.x86_64

スキップしました:
  docker-ce-3:19.03.6-3.el7.x86_64

完了しました!
```

リポジトリ上、docker-ceの最新バージョン（2020年2月）は19.03.6ですが、18.09がインストールされます。そして、containerd.ioについては、最新バージョン（2020年2月）は1.2.10となりますが、1.2.0-3がインストールされます。

「docker-ce-3:19.03.6-3.el7.x86_64」をインストールするには、「containerd.io-1.2.2-3.el7.x86_64」以上が必要となるが、それが無いため依存関係を考慮し、18.09のdocker-ceと1.2.0-3のcontainerd.ioの組み合わせとなるようです。

この状態のままだと、「dnf upgrade」コマンドを実行すると以下のエラーとなります。

```Linux:コマンド
# dnf upgrade
メタデータの期限切れの最終確認: 0:28:08 時間前の 2020年02月21日 01時28分55秒 に実施しました。
エラー:
 問題: package docker-ce-3:19.03.6-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed
  - cannot install the best update candidate for package docker-ce-3:18.09.1-3.el7.x86_64
  - package containerd.io-1.2.10-3.2.el7.x86_64 is excluded
  - package containerd.io-1.2.2-3.3.el7.x86_64 is excluded
  - package containerd.io-1.2.2-3.el7.x86_64 is excluded
  - package containerd.io-1.2.4-3.1.el7.x86_64 is excluded
  - package containerd.io-1.2.5-3.1.el7.x86_64 is excluded
  - package containerd.io-1.2.6-3.3.el7.x86_64 is excluded
(インストール不可のパッケージをスキップするには、'--skip-broken' を追加してみてください または、'--nobest' を追加して、最適候補のパッケージのみを使用しないでください)
```

CentOS7のリポジトリを利用して、containerd.ioをアップデートします。

```Linux:コマンド
# dnf -y update https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.10-3.2.el7.x86_64.rpm
メタデータの期限切れの最終確認: 0:30:47 時間前の 2020年02月21日 01時28分55秒 に実施しました。
containerd.io-1.2.10-3.2.el7.x86_64.rpm                                                                                      8.8 MB/s |  23 MB     00:02
依存関係が解決しました。
=============================================================================================================================================================
 パッケージ                             アーキテクチャー                バージョン                               リポジトリー                          サイズ
=============================================================================================================================================================
アップグレード:
 containerd.io                          x86_64                          1.2.10-3.2.el7                           @commandline                           23 M
     置き換え  runc.x86_64 1.0.0-64.rc9.module_el8.1.0+272+3e64ee36

トランザクションの概要
=============================================================================================================================================================
アップグレード  1 パッケージ

合計サイズ: 23 M
パッケージのダウンロード:
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
  準備             :                                                                                                                                     1/1
  scriptletの実行中: containerd.io-1.2.10-3.2.el7.x86_64                                                                                                 1/1
  アップグレード中 : containerd.io-1.2.10-3.2.el7.x86_64                                                                                                 1/3
  scriptletの実行中: containerd.io-1.2.10-3.2.el7.x86_64                                                                                                 1/3
  scriptletの実行中: containerd.io-1.2.0-3.el7.x86_64                                                                                                    2/3
  整理             : containerd.io-1.2.0-3.el7.x86_64                                                                                                    2/3
  scriptletの実行中: containerd.io-1.2.0-3.el7.x86_64                                                                                                    2/3
  廃止             : runc-1.0.0-64.rc9.module_el8.1.0+272+3e64ee36.x86_64                                                                                3/3
  scriptletの実行中: runc-1.0.0-64.rc9.module_el8.1.0+272+3e64ee36.x86_64                                                                                3/3
  検証             : containerd.io-1.2.10-3.2.el7.x86_64                                                                                                 1/3
  検証             : containerd.io-1.2.0-3.el7.x86_64                                                                                                    2/3
  検証             : runc-1.0.0-64.rc9.module_el8.1.0+272+3e64ee36.x86_64                                                                                3/3

アップグレード済み:
  containerd.io-1.2.10-3.2.el7.x86_64

完了しました!
```

[CentOS7 パッケージリポジトリ](https://download.docker.com/linux/centos/7/x86_64/stable/Packages/)

docker-ceのアップデートを行います。

```Linux:コマンド
# dnf -y update docker-ce
メタデータの期限切れの最終確認: 0:35:03 時間前の 2020年02月21日 01時28分55秒 に実施しました。
依存関係が解決しました。
=============================================================================================================================================================
 パッケージ                         アーキテクチャー                バージョン                               リポジトリー                              サイズ
=============================================================================================================================================================
アップグレード:
 docker-ce                          x86_64                          3:19.03.6-3.el7                          docker-ce-stable                           24 M

トランザクションの概要
=============================================================================================================================================================
アップグレード  1 パッケージ

ダウンロードサイズの合計: 24 M
パッケージのダウンロード:
docker-ce-19.03.6-3.el7.x86_64.rpm                                                                                           9.5 MB/s |  24 MB     00:02
-------------------------------------------------------------------------------------------------------------------------------------------------------------
合計                                                                                                                         9.5 MB/s |  24 MB     00:02
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
  準備             :                                                                                                                                     1/1
  scriptletの実行中: docker-ce-3:19.03.6-3.el7.x86_64                                                                                                    1/1
  アップグレード中 : docker-ce-3:19.03.6-3.el7.x86_64                                                                                                    1/2
  scriptletの実行中: docker-ce-3:19.03.6-3.el7.x86_64                                                                                                    1/2
  scriptletの実行中: docker-ce-3:18.09.1-3.el7.x86_64                                                                                                    2/2
/usr/bin/dockerd は dockerd の為の互換用として設定されていません。

  整理             : docker-ce-3:18.09.1-3.el7.x86_64                                                                                                    2/2
  scriptletの実行中: docker-ce-3:18.09.1-3.el7.x86_64                                                                                                    2/2
  検証             : docker-ce-3:19.03.6-3.el7.x86_64                                                                                                    1/2
  検証             : docker-ce-3:18.09.1-3.el7.x86_64                                                                                                    2/2

アップグレード済み:
  docker-ce-3:19.03.6-3.el7.x86_64

完了しました!
```

Dockerの自動起動を有効化します。

```Linux:コマンド
# systemctl enable docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
```

Dockerを起動します。

```Linux:コマンド
# systemctl start docker
```

「docker version」コマンドを実行してみます。

```Linux:コマンド
# docker version
Client: Docker Engine - Community
 Version:           19.03.6
 API version:       1.40
 Go version:        go1.12.16
 Git commit:        369ce74a3c
 Built:             Thu Feb 13 01:29:29 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.6
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.16
  Git commit:       369ce74a3c
  Built:            Thu Feb 13 01:28:07 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.10
  GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339
 runc:
  Version:          1.0.0-rc8+dev
  GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
```

「docker info」コマンドを実行してみます。

```Linux:コマンド
# docker info
Client:
 Debug Mode: false

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 19.03.6
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: b34a5c8af56e510852c35414db4c1f4fa6172339
 runc version: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
 init version: fec3683
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 4.18.0-147.5.1.el8_1.x86_64
 Operating System: CentOS Linux 8 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 1
 Total Memory: 3.692GiB
 Name: localhost.localdomain
 ID: 73MA:7GEH:Z4TQ:V4QU:O5JB:4DNI:R4LO:HMXO:GO2E:BSPN:NAKZ:2XFP
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false
```

アップグレードコマンドを実行してもエラーが出なくなりました。

```Linux:コマンド
# dnf upgrade
メタデータの期限切れの最終確認: 0:38:50 時間前の 2020年02月21日 01時28分55秒 に実施しました。
依存関係が解決しました。
行うべきことはありません。
完了しました!
```

# firewalldの変更

CentOS8の場合、デフォルトの状態ではDockerビルド中のdnfやyum等で名前解決ができません。

一つの回避方法としては、「docker container build」で「--network host」を指定して実行します。もう一つの回避方法は、以下firewalldでNAPTします。

```Linux:コマンド
# firewall-cmd --add-masquerade --permanent
success
```

```Linux:コマンド
# firewall-cmd --reload
success
```

# Docker Composeインストール

## jqのインストール

```Linux:コマンド
# dnf -y install jq
メタデータの期限切れの最終確認: 0:03:02 時間前の 2020年02月21日 03時25分28秒 に 実施しました。
依存関係が解決しました。
================================================================================
 パッケージ        Arch           バージョン            リポジトリー      サイズ
================================================================================
インストール:
 jq                x86_64         1.5-12.el8            AppStream         161 k
依存関係のインストール:
 oniguruma         x86_64         6.8.2-1.el8           AppStream         188 k

トランザクションの概要
================================================================================
インストール  2 パッケージ

ダウンロードサイズの合計: 349 k
インストール済みのサイズ: 1.0 M
パッケージのダウンロード:
(1/2): jq-1.5-12.el8.x86_64.rpm                 1.9 MB/s | 161 kB     00:00
(2/2): oniguruma-6.8.2-1.el8.x86_64.rpm         1.6 MB/s | 188 kB     00:00
--------------------------------------------------------------------------------
合計                                            682 kB/s | 349 kB     00:00
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
  準備             :                                                        1/1
  インストール中   : oniguruma-6.8.2-1.el8.x86_64                           1/2
  scriptletの実行中: oniguruma-6.8.2-1.el8.x86_64                           1/2
  インストール中   : jq-1.5-12.el8.x86_64                                   2/2
  scriptletの実行中: jq-1.5-12.el8.x86_64                                   2/2
  検証             : jq-1.5-12.el8.x86_64                                   1/2
  検証             : oniguruma-6.8.2-1.el8.x86_64                           2/2

インストール済み:
  jq-1.5-12.el8.x86_64               oniguruma-6.8.2-1.el8.x86_64

完了しました!
```

## 最新版のDocker Conposeをインストールするスクリプト作成

```Linux:コマンド
# vim docker-compose-install.sh
-------------------------------------------------------------------------------------------
#!/bin/bash
compose_version=$(curl https://api.github.com/repos/docker/compose/releases/latest | jq .name -r)
output='/usr/local/bin/docker-compose'
curl -L https://github.com/docker/compose/releases/download/$compose_version/docker-compose-$(uname -s)-$(uname -m) -o $output
chmod +x $output
echo $(docker-compose --version)
-------------------------------------------------------------------------------------------
Esc + :wq
```

実行権付与します。

```Linux:コマンド
# chmod +x docker-compose-install.sh
```

スクリプト実行します。最後にdocker-composeのバージョンが表示されます。

```Linux:コマンド
# sh docker-compose-install.sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 19167  100 19167    0     0  63049      0 --:--:-- --:--:-- --:--:-- 63049
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   617  100   617    0     0   2730      0 --:--:-- --:--:-- --:--:--  2730
100 16.3M  100 16.3M    0     0  3849k      0  0:00:04  0:00:04 --:--:-- 4486k
docker-compose version 1.25.4, build 8d51620a
```

依存関係を無視して強制インストールした状態で、Docker Composeを利用してWordPress環境を構築した際に、WordPressのコンテナーからMySQLのコンテナーへの接続における内部の名前解決ができないなど不具合がありましたが、上記手順で解決できました。

今後のdocker-ceのアップデート運用も検討が必要となりそうな感じですね。。

RHEL8からpodman推奨となるとDocker利用はUbuntuで利用するケースが多くなるかもしれませんが、それに代わるpodmanについても色々と追っていきたいと思いました。