Top View


Author uchida

PHP8のLAMP環境をDockerで作ってみる

2021/08/12

ディレクトリ構成

カレントディレクトリがドキュメントルートになるようにします。

├── docker
│   ├── docker-compose.yml
│   ├── mysql
│   │   └── Dockerfile
│   └── php-apache
│       ├── Dockerfile
│       └── php.ini
└── index.html

docker

docker-compose.yml

WSLのdockerを利用しているのもあり、各DockerのユーザとWSLユーザの権限をそろえておきたいので、.envでユーザIDとグループIDを渡しておきます。

version: "3.8"

services:

  php-apache:
    build:
      context: ./php-apache
      args:
        - WWW_USER_ID=${WWW_USER_ID}
        - WWW_GROUP_ID=${WWW_GROUP_ID}
    ports:
      - ${WEB_PORT}:80
    volumes:
      - ${PROJECT_PATH_HOST}:/var/www/html
    depends_on:
      - mysql

  mysql:
    build:
      context: ./mysql
      args:
        - MYSQL_USER_ID=${MYSQL_USER_ID}
    ports:
      - ${MYSQL_PORT}:3306
    volumes:
      - ${DATA_PATH_HOST}/mysql:/var/lib/mysql"
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_USER: default
      MYSQL_PASSWORD: default
      MYSQL_DATABASE: default
      TZ: "Asia/Tokyo"
    command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci

.env

COMPOSE_PROJECT_NAME=lmap-php8
COMPOSE_FILE=docker-compose.yml
COMPOSE_PATH_SEPARATOR=:

PROJECT_PATH_HOST=../
DATA_PATH_HOST=~/.docker/lmap-php8/data

WEB_PORT=8080
WWW_USER_ID=1000
WWW_GROUP_ID=1000

MYSQL_USER_ID=1000
MYSQL_PORT=3306

php-apache

Dockerfile

oppacheのextensionをインストールしておきます。

FROM php:8.0-apache-buster

ENV COMPOSER_ALLOW_SUPERUSER=1

ARG WWW_USER_ID=${WWW_USER_ID}
ARG WWW_GROUP_ID=${WWW_GROUP_ID}

RUN usermod -u $WWW_USER_ID -o www-data
RUN groupmod -g $WWW_GROUP_ID -o www-data

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

RUN apt-get update -y && \
    apt-get upgrade -y && \
    apt-get -y install \
        libicu-dev \
        libzip-dev \
        libonig-dev \
        zip \
        unzip \
        libssl-dev  && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* && \
    docker-php-ext-install intl mbstring opcache pdo_mysql zip

COPY ./php.ini /usr/local/etc/php/php.ini

WORKDIR /var/www/html

php.ini

opcache.jit_buffer_size に値を入れておけば、とりあえずJITは動きます。

[global]
expose_php = Off
memory_limit = 2048M
max_execution_time = 1200
short_open_tag = Off
default_charset = "UTF-8"
max_input_vars = 10000
upload_max_filesize = 40M
post_max_size = 50M

[mbstring]
mbstring.language = Japanese

[Date]
date.timezone = Asia/Tokyo

[opcache]
opcache.jit_buffer_size=32M

動かす

cd ./docker
docker-compose up -d

docker ps

上手くいけば、WEB_PORT で指定したポートで localhost:8080 とかで、一つ上のディレクトリに置いたindex.htmlが見えてると思います。

 docker-compose exec -u www-data php-apache php -v
PHP 8.0.7 (cli) (built: Jun  4 2021 18:39:21) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.7, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.7, Copyright (c), by Zend Technologies

 docker-compose exec -u www-data php-apache php -i | grep jit
auto_globals_jit => On => On
opcache.jit => tracing => tracing
opcache.jit_bisect_limit => 0 => 0
opcache.jit_blacklist_root_trace => 16 => 16
opcache.jit_blacklist_side_trace => 8 => 8
opcache.jit_buffer_size => 32M => 32M
opcache.jit_debug => 0 => 0
opcache.jit_hot_func => 127 => 127
opcache.jit_hot_loop => 64 => 64
opcache.jit_hot_return => 8 => 8
opcache.jit_hot_side_exit => 8 => 8
opcache.jit_max_exit_counters => 8192 => 8192
opcache.jit_max_loop_unrolls => 8 => 8
opcache.jit_max_polymorphic_calls => 2 => 2
opcache.jit_max_recursive_calls => 2 => 2
opcache.jit_max_recursive_returns => 2 => 2
opcache.jit_max_root_traces => 1024 => 1024
opcache.jit_max_side_traces => 128 => 128
opcache.jit_prof_threshold => 0.005 => 0.005

OpcacheもJITも無事有効化されてそうです。

> docker-compose exec -u mysql mysql mysql -u root -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.34 MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

MySQLも起動しているので、php側からhostを"mysql"に設定すれば接続できます。

おわり

メモ的な内容になりましたが、PHP8でLAMPをDockerで作る方法について記載しました。
PHP8の公式イメージもリリースされ、Apache込みのイメージもあるので、簡単に開発が出来て助かりますね。

uchida

uchida

福岡でWebエンジニアやってます。PHP, クラウド, インフラあたりが好き。