DockerでApache+PHP-FPM構築メモ

Amazon Linux 2で久々にApache+PHPの環境に触ったらmod_phpではなくphp-fpmを使うのがデフォルトになってびっくりしました。
Dockerだとどんな感じになるのか気になって構築したのでその時のメモを残しときます。

ディレクトリ構成

├ docker
│ └ php
│  └ Dockerfile
├ conf
│ └ httpd
│  └ httpd.conf
├ html
└ docker-compose.yml

ファイルの内容

Laravel用。DBはPostgreSQLを使用。

docker/php/Dockerfile

FROM php:7.4-fpm-alpine

RUN apk --update add && \
    apk add \
        bash \
        curl \
        postgresql-dev

RUN curl -sS https://getcomposer.org/installer | php && \
    mv ./composer.phar /usr/local/bin/composer && \
    composer config -g repos.packagist composer https://packagist.jp && \
    composer global require hirak/prestissimo

RUN docker-php-ext-install \
        bcmath \
        pdo_pgsql

conf/httpd/httpd.conf

ServerRoot "/usr/local/apache2"

Listen 80

LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
LoadModule filter_module modules/mod_filter.so
LoadModule mime_module modules/mod_mime.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule env_module modules/mod_env.so
LoadModule headers_module modules/mod_headers.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule version_module modules/mod_version.so
LoadModule unixd_module modules/mod_unixd.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule dir_module modules/mod_dir.so
LoadModule alias_module modules/mod_alias.so

LoadModule rewrite_module modules/mod_rewrite.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

<IfModule unixd_module>
    User daemon
    Group daemon
</IfModule>

ServerAdmin you@example.com

<Directory />
    AllowOverride none
    Require all denied
</Directory>

DocumentRoot "/var/www/html/public"

<Directory "/var/www/html/public">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted

    <FilesMatch \.php$>
       SetHandler "proxy:fcgi://php:9000"
    </FilesMatch>
</Directory>

<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>

<Files ".ht*">
    Require all denied
</Files>

ErrorLog /proc/self/fd/2
LogLevel warn

<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common

    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>

    CustomLog /proc/self/fd/1 common
</IfModule>

<IfModule alias_module>
    ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
</IfModule>

<Directory "/usr/local/apache2/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>

<IfModule headers_module>
    RequestHeader unset Proxy early
</IfModule>

<IfModule mime_module>
    TypesConfig conf/mime.types

    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
</IfModule>

<IfModule proxy_html_module>
    Include conf/extra/proxy-html.conf
</IfModule>

<IfModule ssl_module>
    SSLRandomSeed startup builtin
    SSLRandomSeed connect builtin
</IfModule>

docker-compose.yml

version: '3.8'
services:
  apache:
    image: httpd:alpine
    container_name: lrvl.apache
    ports:
      - 80:80
    volumes:
      - ./conf/httpd/httpd.conf:/usr/local/apache2/conf/httpd.conf
      - ./html:/var/www/html
    environment:
      TZ: Asia/Tokyo
    links:
      - php:php

  php:
    build: ./docker/php
    image: lrvl-php:latest
    container_name: lrvl.php
    volumes:
      - ./html:/var/www/html
    environment:
      TZ: Asia/Tokyo
    links:
      - postgres:postgres

  postgres:
    image: postgres:13-alpine
    container_name: lrvl.postgres
    environment:
      TZ: Asia/Tokyo
      POSTGRES_PASSWORD: Passw0rd
      POSTGRES_USER: Uzer
      POSTGRES_DB: lrvl
    volumes:
      - ./data/postgresql:/var/lib/postgresql/data