DockerでCentOS8+apache2.4+php7.4環境を作りwordpressを動かす環境を作る

現在借りているVPSサーバのスペックが低くく、過去には[Google](https://developers.google.com/speed/pagespeed/insights/?hl=JA)さんに100点満点中2点という、あまりにひどい点を頂いたので、それを改善すべく奮闘中です。

GWにはVPSのサーバの乗り換えもしくはスケールアップを行いますが、その際、上モノ（Apahce＋php）はいつでもバージョンを上げていけるよう。Dockerを使ってコンテナ化してみようと画策。

まずはタイトルに挙げた環境で環境を作ろうとしてみました。

# DockerでCentOS8+apache2.4+php7.4環境を作る

## Dockerfileについて
DockerFleとして用意したのは下記のとおりです。

``` Dockerfile
# docker-hubからOSのイメージ引込
FROM centos:centos8.1.1911

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

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

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

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

# 必要なモジュールのインストール(apache）
RUN yum -y install httpd &&\
    yum clean all

# 必要なモジュールのインストール（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

# phpコマンドを作成
RUN ln /usr/bin/php74 /usr/bin/php

# wordpressインストールディレクトリの所有者をapacheユーザに変更                                              
RUN chown -R apache:apache /var/www/html

# ｐｈｐ７４−ｐｈｐ−ｆｐｍのサービス永続化
RUN systemctl enable php74-php-fpm

# apache サーバのサービス永続化
RUN systemctl enable httpd 

# 接続用ポートの穴あけ
EXPOSE 80
```
Dokerfileの細かな内容についてはDockerfileの補足で説明していますのでそちらもご覧ください。


## dockerイメージの作成
Dockerfileの保存ディレクトリで下記のコマンドを実行

```
docker build -t wordpress:0.0.1 ./
```
-tのあとはタグ名なので、wordpressで動かすことを考えてwordpress:0.0.1としました。けど、よくよく考えたらwordpressは今回インストールしていないので、名前は変えても良さそうですね。


## dockerコンテナの起動
イメージができたらコンテナを起動。

```
 docker run --privileged --name wordpress -p 80:80 -v [localhostのディレクトリ]:/var/www/html -itd wordpress:0.0.1 /sbin/init
```

## ブラウザで起動確認
dockerコンテナ起動時に指定した「localhostのディレクトリ」にwordpressのモジュールを入れておくと下記のように「wordpressへようこそ」画面が出るはず。ここまでくれば、この記事のゴールです。

![スクリーンショット 2020-04-02 21.19.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205773/3b0fb7eb-ef9f-211a-edad-08bcdea601e4.png)

ここまでたどり着くまでいろいろ調べまくりました。
もともとあるコンテナを使えばもっと手軽にできたと思いますが、勉強がてらDockerfileを作るところから始めたので思いの外時間がかかりましたが、勉強になりましたね。こうやって記事にすることで後で見直すこともできるので一石二鳥です。


## Dockerfileの設定の補足
### docker-hubからOSのイメージ引込

``` 
FROM centos:centos8.1.1191
```

OSコンテナの引き込みですね。latestでも良かったのですが、一旦執筆時点の最新のバージョンを指定しています。最終的にはlatestにするかもしれません。

### サーバの日付合わせ

```
RUN /bin/cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

コンテナの時刻を日本時間に合わせるコマンドです。
ログなどを保管する際、時刻がおかしなことになっていると色々と面倒なので、必要な設定となりますね。

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

### remiのインストール
```
RUN rpm -ivh http://ftp.riken.jp/Linux/remi/enterprise/remi-release-8.rpm
```
php7.4をインストールするためにremiレポジトリをインストールする必要がありますが、まずここにたどり着くまで苦労しました。
CentOS8用のrpmをインストールしないと当然動かないのですが、ネットではremi-release-7.rpmでしか記事が見つからず、適当に7→8に書き換えたらインストールできました。

remiのインストールのに結構手こずりました。



### yumのアップデート

```
RUN yum update -y &&\
    yum clean all
```
yumのアップデートは必須作業なので、apache、php7.4のインストール前に実行しておきます。


### 必要なモジュールのインストール(apache）
```
RUN yum -y install httpd &&\
    yum clean all
```
apacheのインストールはyum経由ですので特に何も設定は必要ありませんね。


### 必要なモジュールのインストール（php7.4）
```
RUN yum -y install php74-php php74-php-mysqli php74-php-gd php74-php-mbstring php74-php-opcache php74-php-xml
```
phpのモジュールのインストールはphp74でもインストールされますが、動作させるにはphp74-php-xxx といったphp74とモジュールの間に-phpを入れる必要があるというところに行き着くまでにまた手こずりました。

### phpコマンドを作成
```
RUN ln /usr/bin/php74 /usr/bin/php
```

php7.4を入れた後、phpとコマンドを実行しても何も反応がなく、いろいろ調べた結果、php74がphpのコマンドであることが判明。
このままだと、phpとしてコマンドが実行できないので、リンクを張ってphpでもコマンドが実行できるようにしました。

### wordpressインストールディレクトリの所有者をapacheユーザに変更                                              
```
RUN chown -R apache:apache /var/www/html
```
apacheサーバの起動ユーザに合わせてwordpress配置ディレクトリのオーナーを変更。


### php74-php-fpmのサービス永続化
```
RUN systemctl enable php74-php-fpm
```
apacheをインストールしてもwordpresの画面が立ち上がらず何故かと調べていたらphp-fpmがサービスとして起動している必要があるということがわかりました。
コンテナ起動時に自動でサービスが起動するようにサービスを永続化させるようにしました。


### apache サーバのサービス永続化
```
RUN systemctl enable httpd 
```
apacheもphp-fpm同様サービスとして常に起動するように設定しました。


### 接続用ポートの穴あけ
```
EXPOSE 80
```
http接続できるように80番のポートを開けます。https化を狙って443も開けておく必要がありますが、それはこれからGWまでの課題ですね。


## 今後の課題

* https化
* mysqlとの接続

といったところでしょうか。wordpressの画面は起動しましたがwordpressまではインストールできていないです。
なので、GWまでにはこのあたりを解決したいですね。