Dockerがぶっちゃけよく分からんっていう人向けにCentOS 8/PHP7.4/Apache2.4の環境構築を例に説明してみる

#概要
本記事はDocker初心者向けです。
またDockerで環境構築したことはあるけど、何が起こっているのか分からない人向けです。

Dockerは良くも悪くもコマンド一発で環境構築ができてしまうので、何が起こっているのか分からない人は意外と多いのではないでしょうか。
ぶっちゃけ僕、最初は1ミリも分かってなかったです。
でも使えちゃうのがDockerの凄いところですね!

今回はタイトルの通り、CentOS 8/PHP7.4/Apache2.4の環境構築のシナリオを通してDockerに触れていきたいと思います。

まずは環境の基本となるCentOS 8の環境を作り、その上でDockerfileの必要性を述べながら環境を構築していき、最終的にハローワールドをブラウザに表示するという流れでやっていきたいと思います。

#環境

* macOS
* Docker 19.03.5

#前提

今回は/Users/dockerというディレクトリを作成/移動した前提で話を進めます。

```
mkdir /Users/hoge/docker && cd /Users/hoge/docker
```

#1 まずはCentOS 8のコンテナを作ってみる

## 1.1 Docker Hubからイメージを取得
```
docker pull centos:centos8
```
下記からお好きなイメージを探すことができます。

https://hub.docker.com/_/centos?tab=tags

##1.2 取得したイメージをもとにコンテナの生成・起動

```
docker run -it -d --name centos8_test --privileged centos:8 /sbin/init
```

*  「-it」-iと-tがくっついたやつ

-iはホストの入力をコンテナの標準出力をつなげる。
-tはコンテナの標準出力とホストの出力をつなげる。
下記の記事が分かりやすいです

https://qiita.com/k_uchida_____/items/8ca31226bd6d10850791

*  「-d」バッググラウンドで実行
* 「--name centos8_test」イメージの名前を指定
* 「--privileged」と「/sbin/init」　こいつらを指定しないとsystemctlが使えない。。

因みにdocker runのオプションについては下記記事で良い感じにまとめられています。

https://scrapbox.io/llminatoll/docker_run%E3%81%AE%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%84%E3%82%8D%E3%81%84%E3%82%8D

これでCentOS 8の環境が作れました。

##1.3コンテナにbashで入る
```
docker exec -it centos8_test bash
[root@0d9ee6158fa8 /]#
```

無事ログインできました。
ではこの環境は茶番用なので、一旦ログアウトしコンテナを削除してしまいましょう。

```
[root@0d9ee6158fa8 /]# exit
$ docker rm -f centos8_test
```
#2 CentOS 8/PHP/Apache2.4の環境を作ってみる

##Dockerfileを使って環境を構築する
先ほどCentOS 8の環境を作りましたが、例えばwebサービスを作るとなると
コンテナ内でPHPやApacheをインストールする作業が発生します。
その他にも色々と、カスタマイズしたりすると思います。
しかしコンテナを作成する度に、毎回同じコマンドで環境を構築していくのも面倒です。
先ほど取得したCentOS 8のイメージにプラスαが欲しいですよね。
そこで、Dockerfileの登場です。
Dockerfileをベースに新しくCentOS 8/PHP7.4/Apache2.4のイメージを作成し、コンテナを作り直します。
こうすることで今後、同じ環境がコマンド一発で構築できるようになるわけです。

##2.1 Dockerfileを準備

```:Dockerfile
#1 docker-hubからベースとなるCentOS 8のイメージ取得
FROM centos:8

#2 サーバの日付合わせ
RUN /bin/cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

#3 epel-releaseのインストール
RUN yum install -y epel-release &&\
    yum clean all

#4 remiのインストール
RUN rpm -ivh http://ftp.riken.jp/Linux/remi/enterprise/remi-release-8.rpm

#5 yumのアップデート
RUN yum update -y && yum clean all

#6 Apacheのインストール
RUN yum -y install httpd && yum clean all

#7 PHP7.4のインストール
RUN yum -y install php74-php php74-php-mysqli php74-php-gd php74-php-mbstring php74-php-opcache php74-php-xml php74-php-pear php74-php-devel php74-php-pecl-imagick php74-php-pecl-imagick-devel php74-php-pecl-zip

#8 phpコマンドを使えるようにする
RUN ln /usr/bin/php74 /usr/bin/php

#9 ドキュメントルート配下の所有者をapacheユーザに変更                                              
RUN chown -R apache:apache /var/www/html

#10 php74-php-fpm サービスの自動起動
RUN systemctl enable php74-php-fpm

#11 apache サービスの自動起動
RUN systemctl enable httpd 

#12 接続用ポートの穴あけ
EXPOSE 80

```
\#2以降がプラスαの環境構築になります。
以下、補足説明

* \#1 1.1と同じことをやっています。
* \#12は実際は必要ありません。しかし明示することでメリットもあるため、使う人は多いとのこと。

https://docs.docker.com/engine/reference/builder/#expose

##2.2 Dockerfileをもとにイメージを作成

```
$ docker build -t test ./
```

* 「-t test」 イメージに名前を指定。

##2.3 作成したイメージをもとにコンテナの生成・起動

```
$ docker run -it -d --name centos8_test --privileged -p 80:80 -v /Users/hoge/docker/src:/var/www/html test /sbin/init
```

「-it」、「-d」、「--privileged」、「/sbin/init」は1.2を参照

* 「--name」 コンテナ名をcentos8_testに指定
* 「-p 80:80」ポートフォワーディング　左がホスト、右がコンテナのポート
* 「-v /Users/docker/src:/var/www/html」 ホストとコンテナのディレクトリの共有
* 「test」2.2で作ったイメージを指定

##2.4コンテナにbashで入る

```
$ docker exec -it centos8_test bash
```

無事ログインできました。
では以下2点を確認しましょう。

* PHP7.4がインストールされているか
* Apacheがインストールされ起動しているか

```
[root@66f4d7fc1461 /]# php -v
・・・
PHP 7.4.25 (cli) ・・・
・・・

[root@66f4d7fc1461 /]# httpd -v
Server version: Apache/2.4.37 (centos)
・・・
[root@66f4d7fc1461 /]#systemctl status httpd
・・・
 Active: active (running) ・・・
・・・・

```

確認できましたー!
これで取り敢えずハローワールドできるはず。。

コンテナ内であれば/var/www/html/index.php
ホストであれば./src/index.php
を作成しハローワールドを書いて↓にアクセスし動作確認をしてみましょう。
http://localhost:80

正常にハローワールドしてれば成功です。
お疲れ様でした。