Docker on CentOS Stream8

Docker環境をCentOS Stream8に構築した時の手順備忘。
Docker, docker-compose導入の他、複数のサービスを立ち上げた際にリバースプロキシ経由でリクエストを実現したいためにnginxの導入を行った。

# Dockerの導入
```sh:インストール手順
# Dockerとの競合パッケージを削除
$ dnf -y remove podman runc
$ yum install -y yum-utils
# リポジトリの登録
$ yum-config-manager --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
$ yum install docker-ce docker-ce-cli containerd.io
# インストールされているか確認
$ docker -v
Docker version 20.10.12, build e91ed57
# docker起動
$ systemctl start docker
```

# Docker Composeの導入
```sh
# 最新版をダウンロード
$ curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# バイナリに実行権限を付与
$ sudo chmod +x /usr/local/bin/docker-compose
# インストールされているか確認
$ docker-compose -v
docker-compose version 1.29.2, build 5becea4c
# コマンド補完機能の導入
$ curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
```

# nginxの導入
任意のディレクトリに下記ファイルを作成

```conf:nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
```

`yum info nginx`を実行し、下記のようなリポジトリ情報が取得できればOK

```sh
$ yum info nginx
Last metadata expiration check: 0:05:14 ago on Sat 22 Jan 2022 05:50:14 PM JST.
Available Packages
Name         : nginx
Epoch        : 1
Version      : 1.14.1
Release      : 9.module_el8.0.0+1060+3ab382d3
Architecture : x86_64
Size         : 570 k
Source       : nginx-1.14.1-9.module_el8.0.0+1060+3ab382d3.src.rpm
Repository   : appstream
Summary      : A high performance web server and reverse proxy server
URL          : http://nginx.org/
License      : BSD
Description  : Nginx is a web server and a reverse proxy server for HTTP, SMTP, POP3 and
             : IMAP protocols, with a strong focus on high concurrency, performance and
             : low memory usage.
```

yumでインストール

```sh
$ yum -y install nginx
$ nginx -v
nginx version: nginx/1.14.1
```

実行と起動の自動化

```sh
$ systemctl enable nginx
$ systemctl start nginx
```

`firewall-cmd`でhttpポートを解放するのを忘れずに。

```
$ firewall-cmd --add-port=80/tcp --permanent
$ firewall-cmd --reload
```

ブラウザ上でサーバIPにアクセスし、nginxのWelcome画面が出たら成功。

# 【重要】nginxのSELinux設定
SELinuxの設定により、nginx経由でDockerにアクセスしようとすると502Bad Gatewayになる場合がある。
CentOS Stream8ではSELinuxがデフォルトで有効なため、本設定をしないとうまくいかなかった。
SELinuxの外部接続許可パラメータを確認する。

```sh
$ getsebool httpd_can_network_connect
httpd_can_network_connect --> off
```
これをonに変更する。 `-P`は恒久設定の意味。

```sh
$ setsebool -P httpd_can_network_connect 1
$ getsebool httpd_can_network_connect
httpd_can_network_connect --> on
```
これでうまくいった。
尚、接続エラー等の調査をする場合は、auditログを確認するのが有効。
`tail -f /var/log/audit/audit.log`

# 参考
[docker公式] https://docs.docker.com/engine/install/centos/
https://www.server-world.info/query?os=CentOS_Stream_8&p=docker&f=1
https://docs.docker.jp/compose/toc.html
https://hirooooo-lab.com/development/install-nginx-for-centos/
[docker UI(自身の過去記事)] https://qiita.com/kod314/items/f96541373398dfffea37
https://dev.classmethod.jp/articles/redhat-selinx-might-block-network-connection-to-servers-from-apache-php/