🕌
Laravel、PHP、MySQLの開発環境をDockerコンテナ化(ビルトインサーバー)
レガシー環境を少しでも快適にしようのコーナーです(´・ω・`)
現状のプロジェクト
- phpenvで環境構築している。
- フレームワークはLaravelを利用。
- sailを使おうと思ったが諸々の事情により断念。
- PHPの実行環境、DBをコンテナ化。
- ソースは既存のものを利用する。
なぜコンテナ化するの?
- 特定パッケージをbrewでアップデートした際に、特定ver.のPHPが起動しなくなって発狂しそうになったため。
- PHPではコンテナ化必須という意見がよくわかった。
- 様々なパッケージのバージョンが上がりすぎてモグラ叩き状態になってしまった。
- 運用がうまく回り始め、改善に時間を確保できるようになってきた(ここが一番大事)
構成
- app、dbそれぞれのコンテナを立てる。
- container_nameを指定するのは、host名でないとLaravelが解釈できないらしい?ため。
- https://qiita.com/kaorikatakura/items/98e928c57a761ac2d714
- appコンテナにはLaravelのソースをマウントさせる。
- コンテナ内でビルトインサーバーをport=8080で立てる想定。なのでymlで指定している。
ファイルツリー
.
├── README.md
├── docker
│ ├── db
│ │ ├── data
│ │ ├── logs
│ │ ├── my.cnf
│ │ └── sql
│ │ └── init.sql
│ └── php
│ ├── Dockerfile
│ └── php.ini
└── docker-compose.yml
各種ファイル
コンフィグ関連は自分のプロジェクトに応じて修正してください。
※修正前のネットの海に広がっているものを記載していますが、このまま利用いただいても動作するはずです。
docker-compose.yml
version: '3'
services:
app:
container_name: app
build: ./docker/php
volumes:
- .:/var/www
ports:
- 8080:8080
db:
image: mysql:8.0
container_name: db
environment:
- MYSQL_DATABASE=${DB_NAME}
- MYSQL_USER=${DB_USER}
- MYSQL_PASSWORD=${DB_PASS}
- MYSQL_ROOT_PASSWORD=${DB_PASS}
- TZ=${TZ}
volumes:
- db-store:/var/lib/mysql
- ./docker/db/logs:/var/log/mysql
- ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
- ./docker/db/sql:/docker-entrypoint-initdb.d
ports:
- ${DB_PORT}:3306
volumes:
db-store:
.env
DB_NAME=dbname
DB_USER=username
DB_PASS=password
DB_PORT=23306
TZ=Asia/Tokyo
my.cnf
[mysqld]
# 文字コード/照合順序の設定
character-set-server = utf8mb4
collation-server = utf8mb4_bin
# タイムゾーンの設定
default-time-zone = SYSTEM
log_timestamps = SYSTEM
# デフォルト認証プラグインの設定
default-authentication-plugin = mysql_native_password
# エラーログの設定
log-error = /var/log/mysql/mysql-error.log
# スロークエリログの設定
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 5.0
log_queries_not_using_indexes = 0
# 実行ログの設定
general_log = 1
general_log_file = /var/log/mysql/mysql-query.log
# mysqlオプションの設定
[mysql]
# 文字コードの設定
default-character-set = utf8mb4
# mysqlクライアントツールの設定
[client]
# 文字コードの設定
default-character-set = utf8mb4
init.sql
CREATE DATABASE IF NOT EXISTS `SchemeName`;
GRANT ALL ON SchemeName.* TO 'username'@'%';
php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
[opcache]
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1
Dockerfile
FROM php:7.4.27-fpm
COPY php.ini /usr/local/etc/php/
RUN apt-get update \
&& apt-get install -y zlib1g-dev mariadb-client vim libzip-dev \
&& docker-php-ext-install zip pdo_mysql
#Composer install
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer
ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin
WORKDIR /var/www
RUN composer global require "laravel/installer"
コンテナ内でビルトインサーバー起動
コンテナ外からコンテナ内のローカルホストを参照しにいく場合、[--host 0.0.0.0]が必要。
docker-compose exec app php /var/www/meetscare-workers/artisan serve --host 0.0.0.0 --port=8080
ストレスフリーに近づいてきました(´・ω・`)
Discussion