DockerでPHP7.3(モジュール版)環境作ろうとしてハマった記録

※ハマった記録のわりにエラーログとってないので一切エラーログが出てきません:stuck_out_tongue_winking_eye:

# 動かしたい環境

CentOSにApacheいれてPHP7.3をモジュール版で動かしたい。←ここ！
MySQL5.7もいれたい←ここは今回は触れてません

# 事始め

約1年前ぐらいに作ってたdocker-composeをビルドしようとしたらエラー出た(たしか)

で、当時のDockerfile。

```dockerfile:Dockerfile

FROM centos:latest

MAINTAINER docker-web

# update yum
RUN yum -y update
RUN yum -y install yum-utils
RUN yum clean all

RUN yum -y install epel-release
RUN yum -y groupinstall "Development Tools"
RUN yum -y install wget git vim zsh curl

# install remi repo
RUN wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
RUN rpm -Uvh remi-release-7*.rpm
RUN yum-config-manager --enable remi-php73

# install php73
RUN \
  yum -y install \
    php-devel \
    php php-common \
    php-mbstring \
    php-mcrypt \
    php-xml \
    php-mysqlnd \
    php-pdo \
    php-gd \
    php-cli \
    php-intl \
    php-opcache --nogpgcheck \
    php-xdebug

# clear yum cache
RUN yum clean all

# install composer
RUN curl -sS https://getcomposer.org/installer | php && \
  mv composer.phar /usr/local/bin/composer

# timezone setting
RUN cp /etc/localtime /etc/localtime.org
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# for web
EXPOSE 80

COPY ./conf.d/vhosts.conf /etc/httpd/conf.d/vhosts.conf

CMD /usr/sbin/httpd -DFOREGROUND

COPY ./start-develop.sh /start-develop.sh
RUN chmod 755 /start-develop.sh
```

ついでに当時のファイル構成。


```
├ apps
  ├
├ docker-compose.yml
└ docker
  ├ web
    ├ Dockerfile : centos, php, apatch install
    ├ start-develop.sh : apps directory symbolic link web/data directory
    ├ conf.d
      ├ vhosts.conf
    ├ data : Document root
      ├
  ├ db
    ├ data : mysql data
      ├
    ├ Dockerfile : mysql install
    ├ my.cnf
  ├ logs : server & sql log
    ├
```

# php-mcryptがPHP7.2からdeprecated

oh...とりあえず。はずそう。

# そもそもcentos:latestがよろしくない

多分当時

```dockerfile:Dockerfile
FROM centos:latest
```

で7がはいってたところ8になった模様。
そして引っ張られて

```dockerfile:Dockerfile
RUN yum -y install epel-release
```

がこれも7だったのが8になった。
epelが8でremiが7をいれてて駄目な感じがする。

# Remi's repoの8はdevelopment release(2019/12/31現在)

http://rpms.remirepo.net/enterprise/8/

![スクリーンショット 2019-12-31 18.59.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138485/a46eec7b-0d5a-39bf-0b2b-bfd521f863a6.png)

This is a development release.

**This is a development release.**

開発バージョン使うのも、、、なぁ、、、？

# ならepelを7にすりゃよくね？(迷走)

```dockerfile:Dockerfile
# RUN dnf -y install epel-release
RUN dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
```

※yumがdnfになったと見かけたのでコマンド変えました

今度はremiリポジトリ入れるところでepelのなんたらファイルがないと怒られたので素直にremiを8にすることに。

# Remi's Repoを8にしよう

```dockerfile:Dockerfile
# install remi repo
#RUN wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
#RUN rpm -Uvh remi-release-7*.rpm
RUN wget http://rpms.famillecollet.com/enterprise/remi-release-8.rpm
RUN rpm -Uvh remi-release-8*.rpm
RUN yum-config-manager --enable remi-php73
```

うご、、、かん！！！！！！！！！！！！！！

```dockerfile:Dockerfile
RUN rpm -Uvh remi-release-8*.rpm
```

でエラーになった(たしか)

wgetやめてdnf installしたれ。

```dockerfile:Dockerfile
#RUN wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
#RUN rpm -Uvh remi-release-7*.rpm
#RUN wget http://rpms.famillecollet.com/enterprise/remi-release-8.rpm
#RUN rpm -Uvh remi-release-8*.rpm
RUN dnf -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
RUN dnf-config-manager --enable remi-php73
```

うご、、、かん！！！！！！！

```dockerfile:Dockerfile
RUN dnf-config-manager --enable remi-php73
```

今度はここでエラー。
あっそ。いいよいいよphpインストールするときにenablerepoするから。


```dockerfile:Dockerfile
#yum -y install php
dnf -y install --enablerepo=remi,remi-php73 php
```

※拡張は端折ってます


```sh
Error: Unknown repo: 'remi-php73'
```

remi-php73がないって言い出した。
んなわけあるかい。

```sh
$ dnf repolist all | grep remi
```

![スクリーンショット 2019-12-31 19.22.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138485/8c0bb898-89c0-1fb2-8cac-b42b806bc4d4.png)

ほんまや！！！！おらん！！！！！！！！

# Remi's Repo入れたけどremi-php73がいない

php73はそもそもいるのだろうかという疑問が湧いたので確認。

```sh

$ dnf search php73
```

![スクリーンショット 2019-12-31 19.26.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138485/0841e64f-adc9-4780-ad6f-54303610e16a.png)

いる。

```dockerfile:Dockerfile
#yum -y install php
#dnf -y install --enablerepo=remi,remi-php73 php
dnf -y install php73
```

はいった。

```sh

$ php -v
bash: php: command not found
```

ぐぬぬ。

```sh

$ php73 -v
PHP 7.3.13 (cli) (built: Dec 17 2019 10:29:15) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.13, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.13, Copyright (c) 1999-2018, by Zend Technologies
    with Xdebug v2.9.0, Copyright (c) 2002-2019, by Derick Rethans
```

でた。
そしたらphpでphp73が動くようにシンボリックリンク足しとけばいいですね。

```dockerfile:Dockerfile

RUN ln -s /bin/php73 /bin/php
```

# httpdが動かない

```dockerfile:Dockerfile

CMD /usr/sbin/httpd -DFOREGROUND
```


ここで/usr/sbinがないとかなんとかってエラーがでる。


```sh

$ httpd -v
```

ない！！！！！！

Dockerfileよくみたらたしかにhttpdは読んでない。
当時動いたんだけどなんだったのかなぁ、、、という疑問はさておき。

```dockerfile:Dockerfile

RUN dnf -y install httpd httpd-tools
```

追記。
無事 docker-compose buildにdocker-compose runが動く。
htmlもアクセスできる。
よしよし。

![ENBHTDTUYAAZ0V_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138485/2c7de9a4-95f5-5084-97bf-2d9c84e4eeba.png)

なんで！！！！！！！！！！！

# PHPが認識してない

Apacheのconfigにmodule読んだ記憶はたしかにない。
けどしなくてもphpいれたときに自動で入ってたような、、、？という記憶をたどってもう1度search php73。


```sh

$ dnf search php73
```

![スクリーンショット 2019-12-31 21.54.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138485/b1ee3e09-dc42-3248-5ed5-f8e426e1e096.png)

もしかしてphp73じゃなくてphp73-phpをインストールしたらいいのでは？


```dockerfile:Dockerfile
#yum -y install php
#dnf -y install --enablerepo=remi,remi-php73 php
#dnf -y install php73
dnf -y install php73-php
```

503エラー！！！！！！！！

# PHP-FPMはお呼びでないです

```
[proxy:error] [pid 10:tid 140512262579968] (2)No such file or directory: AH02454: FCGI: attempt to connect to Unix domain socket /var/opt/remi/php73/run/php-fpm/www.sock (*) failed
[proxy_fcgi:error] [pid 10:tid 140512262579968] [client 192.168.202.1:36754] AH01079: failed to make connection to backend: httpd-UDS
```

頼んでもないのにphp-fpmがどうたら言ってる。
許すまじ。

調べるとEvent MPMだとモジュール版のPHPは動かないとかなんとか。
ふーん？

```sh

$ httpd -V | grep 'MPM'
Server MPM:     event
```

eventってしっかり出てきて草。

/etc/httpd/conf.modules.d/00-mpm.conf
として設定ファイルができてるのを発見。

```sh
$ docker cp [コンテナID]:/etc/httpd/conf.modules.d/00-mpm.conf 00-mpm.conf
```

コピーして

```apache:httpd.conf

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
```

のコメントを解除。

```apache:httpd.conf

LoadModule mpm_event_module modules/mod_mpm_event.so
```

をコメントアウト。

したものを

docker/web/conf.modules.d/00-mpm.conf

に設置。

```dockerfile:Dockerfile

RUN mv /etc/httpd/conf.modules.d/00-mpm.conf /etc/httpd/conf.modules.d/00-mpm.conf.origin
COPY ./conf.modules.d/00-mpm.conf /etc/httpd/conf.modules.d/00-mpm.conf
```

元のファイル置いとかなくてもいいかなと思いながらも追記。


![スクリーンショット 2019-12-31 21.56.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138485/e267aadd-1aa4-ba6e-11f7-64d522885ca5.png)



動いた！！！！！！！！！！！！！！！！:clap::clap::clap:

# 最終的に出来上がったDockerfile

```dockerfile:Dockerfile
FROM centos:centos8

MAINTAINER docker-web

# update dnf
RUN dnf -y update
RUN dnf -y install dnf-utils
RUN dnf clean all

# install epel-release
RUN dnf -y install epel-release

# install dev tool
RUN dnf -y groupinstall "Development Tools"
RUN dnf -y install git vim zsh curl

# install remi repo
RUN dnf -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm

# inatall httpd
RUN dnf -y install httpd httpd-tools

# install php73
RUN \
  dnf -y install \
    php73-php \
    php73-php-mbstring \
    php73-php-common \
    php73-php-xml \
    php73-php-mysqlnd \
    php73-php-pdo \
    php73-php-gd \
    php73-php-cli \
    php73-php-intl \
    php73-php-opcache --nogpgcheck \
    php73-php-json \
    php73-php-pecl-xdebug

RUN ln -s /bin/php73 /bin/php

# clear dnf cache
RUN dnf clean all

# install composer
RUN curl -sS https://getcomposer.org/installer | php && \
  mv composer.phar /usr/local/bin/composer

# timezone setting
RUN cp /etc/localtime /etc/localtime.org
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# for web
EXPOSE 80

COPY ./conf.d/vhosts.conf /etc/httpd/conf.d/vhosts.conf

RUN mv /etc/httpd/conf.modules.d/00-mpm.conf /etc/httpd/conf.modules.d/00-mpm.conf.origin
COPY ./conf.modules.d/00-mpm.conf /etc/httpd/conf.modules.d/00-mpm.conf

CMD /usr/sbin/httpd -DFOREGROUND

COPY ./start-develop.sh /start-develop.sh
RUN chmod 755 /start-develop.sh
```


構成はこう。


```
├ apps
  ├
├ docker-compose.yml
└ docker
  ├ web
    ├ Dockerfile : centos, php, apatch install
    ├ start-develop.sh : apps directory symbolic link web/data directory
    ├ conf.d
      ├ vhosts.conf
    ├ conf.modules.d
      ├ 00-mpm.conf
    ├ data : Document root
      ├
  ├ db
    ├ data : mysql data
      ├
    ├ Dockerfile : mysql install
    ├ my.cnf
  ├ logs : server & sql log
    ├
```