Table of Contents
ディレクトリ構成
カレントディレクトリがドキュメントルートになるようにします。
├── 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
福岡でWebエンジニアやってます。PHP, クラウド, インフラあたりが好き。
Related Posts
AWSの各サービスをLocalStackやMinioでDocker Compose環境を構築、S3バケットやDynamoDBテーブルを自動作成する
Daiki Urata
2022/06/13
Laravel + Vue.jsで開発した社内コミュニケーション円滑化システムの技術スタックを公開します
sarah
2022/04/20