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