Docker で CentOS Linux 8 環境を構築して Apache HTTP Server を起動する

## 概要

- macOS 上の Docker で CentOS Linux 8 環境を構築する
- Apache HTTP Server を起動してコンテナ内外からアクセスする

## 今回の環境

- macOS Catalina
- Docker Desktop Community 2.2.0.4
- Docker 19.03.8
- CentOS Linux 8
- Apache HTTP Server 2.4.37

```
$ docker --version
Docker version 19.03.8, build afacb8b
```

## CentOS Linux 8 イメージを Docker Hub から取得

docker pull コマンドでイメージを取得する。

```
$ docker pull centos:centos8
centos8: Pulling from library/centos
8a29a15cefae: Pull complete 
Digest: sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700
Status: Downloaded newer image for centos:centos8
docker.io/library/centos:centos8
```

インストール可能な CentOS Linux のイメージは [centos Tags \- Docker Hub](https://hub.docker.com/_/centos?tab=tags) から探すことができる。

## コンテナを作成して起動

コンテナに foobar という名前を割り当てて、バックグラウンドで実行する。
ここではコンテナの80番ポートをホストの8080番ポートに割り当てている。

```
$ docker run --detach --name foobar --privileged --publish=8080:80 centos:centos8 /sbin/init
```

[run — Docker\-docs\-ja 17\.06\.Beta ドキュメント](http://docs.docker.jp/engine/reference/commandline/run.html)

> docker run コマンドは、まず指定されたイメージ上に書き込み可能なコンテナ・レイヤを create （作成）します。それから、指定されたコマンドを使って start （開始）します。この docker run は、 API の /containers/create の後で /containers/(id)/start を実行するのと同じです。

docker run コマンドに --privileged と /sbin/init を指定しないと、systemd を使用する際に以下のようなエラーメッセージが表示されて systemd が使用できなくなるので注意する。

```
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
```

## CentOS Linux 8 にログイン

docker exec コマンドを使用して、起動したコンテナ内にて bash シェルを実行する。
これで CentOS Linux 8 内に入ることができる。

```
$ docker exec -it foobar bash
```

## CentOS Linux 8 を使用

シェル内で OS バージョン等を確認する。

```
[root@29d737551a55 /]# cat /etc/os-release 
NAME="CentOS Linux"
VERSION="8 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="8"
PLATFORM_ID="platform:el8"
PRETTY_NAME="CentOS Linux 8 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:8"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-8"
CENTOS_MANTISBT_PROJECT_VERSION="8"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="8"
```

```
[root@29d737551a55 /]# uname -a
Linux 29d737551a55 4.19.76-linuxkit #1 SMP Thu Oct 17 19:31:58 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
```

vim などのよく使うと思われるソフトウェアがインストールされていない。

```
[root@29d737551a55 /]# vim
bash: /usr/bin/vim: No such file or directory
```

vim をインストールする。

```
[root@29d737551a55 /]# dnf install vim
```

```
[root@29d737551a55 /]# vim --version
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Nov 11 2019 19:08:24)
Included patches: 1-1763
```

シェルから抜けるには exit コマンドを使う。

```
[root@29d737551a55 /]# exit
exit
```

## コンテナを停止

docker stop コマンドで起動しているコンテナを停止できる。

```
$ docker stop foobar
```

## コンテナの情報を確認

docker ps コマンドでコンテナの情報を表示できる。

```
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS               NAMES
29d737551a55        centos:centos8      "/sbin/init"        46 minutes ago      Exited (137) 19 seconds ago                       foobar
```

## コンテナを起動

docker start コマンドで停止したコンテナを起動できる。

```
$ docker start foobar
```

## Apache HTTP Server をインストールする

コンテナ内にシェルを起動してログインする。

```
$ docker exec -it foobar bash
```

dnf コマンドで httpd パッケージをインストールする。

```
[root@29d737551a55 /]# dnf install httpd
```

これで Apache HTTP Server がインストールできた。
バージョンを確認する。

```
[root@29d737551a55 /]# httpd -v
Server version: Apache/2.4.37 (centos)
Server built:   Dec 23 2019 20:45:34
```

systemd で管理するように設定する。

```
[root@29d737551a55 /]# systemctl enable httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
```

systemctl start コマンドで Apache HTTP Server を起動する。

```
[root@29d737551a55 /]# systemctl start httpd
```

初期設定ではドキュメントルートが /var/www/html/ になっているので /var/www/html/index.html に HTML ファイルを作成する。

```
[root@29d737551a55 /]# vi /var/www/html/index.html
```

今回は以下の内容を記述した。

```html
<html>
<body>
Hello, World!
</body>
</html>
```

curl コマンドでアクセスすると Apache HTTP Server が HTML ファイルを出力する。

```
[root@29d737551a55 /]# curl -i http://localhost/
HTTP/1.1 200 OK
Date: Sat, 21 Mar 2020 06:00:04 GMT
Server: Apache/2.4.37 (centos)
Last-Modified: Sat, 21 Mar 2020 05:59:52 GMT
ETag: "2d-5a1571c48ab9e"
Accept-Ranges: bytes
Content-Length: 45
Content-Type: text/html; charset=UTF-8

<html>
<body>
Hello, World!
</body>
</html>
```

今回はコンテナの80番ポートを Docker ホスト側の8080番ポートに割り当てている。
コンテナ外からホスト側の8080番ポートにアクセスするとコンテナの80番ポートにつながる。

```
$ curl -i http://localhost:8080/
HTTP/1.1 200 OK
Date: Sat, 21 Mar 2020 06:01:21 GMT
Server: Apache/2.4.37 (centos)
Last-Modified: Sat, 21 Mar 2020 05:59:52 GMT
ETag: "2d-5a1571c48ab9e"
Accept-Ranges: bytes
Content-Length: 45
Content-Type: text/html; charset=UTF-8

<html>
<body>
Hello, World!
</body>
</html>
```

## 参考資料
- [centos \- Docker Hub](https://hub.docker.com/_/centos)
- [コマンドライン・リファレンス — Docker\-docs\-ja 17\.06\.Beta ドキュメント](http://docs.docker.jp/engine/reference/commandline/toc.html)
- [Docker Hubで公開されたCentOS 8を試してみる \- Qiita](https://qiita.com/witchcraze/items/bc05f8fd90bea2dc333f)
- [Homebrew で macOS に Docker をインストールして Hello world \- Qiita](https://qiita.com/niwasawa/items/c8cfe350caa9f4730400)
- [第1章 Apache HTTP Web サーバーの設定 Red Hat Enterprise Linux 8 \| Red Hat Customer Portal](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/deploying_different_types_of_servers/setting-apache-web-server_deploying-different-types-of-servers)