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 から探すことができる。

コンテナを作成して起動

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

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

run — Docker-docs-ja 17.06.Beta ドキュメント

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>
<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>

参考資料