🕌

Laravel、PHP、MySQLの開発環境をDockerコンテナ化(ビルトインサーバー)

2023/04/17に公開

レガシー環境を少しでも快適にしようのコーナーです(´・ω・`)

現状のプロジェクト

  • phpenvで環境構築している。
  • フレームワークはLaravelを利用。
  • sailを使おうと思ったが諸々の事情により断念。
  • PHPの実行環境、DBをコンテナ化。
    • ソースは既存のものを利用する。

なぜコンテナ化するの?

  • 特定パッケージをbrewでアップデートした際に、特定ver.のPHPが起動しなくなって発狂しそうになったため。
    • PHPではコンテナ化必須という意見がよくわかった。
    • 様々なパッケージのバージョンが上がりすぎてモグラ叩き状態になってしまった。
    • 運用がうまく回り始め、改善に時間を確保できるようになってきた(ここが一番大事)

構成

  • app、dbそれぞれのコンテナを立てる。
  • 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