PHPはじめてのDocker環境構築

## はじめに
・"RUNTEQ Advent Calendar 2024"の17日目担当
・プログラミング未経験から2024年10月にプログラミングスクールRUNTEQ卒業
・バックエンドエンジニアとして転職（現在2日目）
・テーマは『プログラミングでの"ワクワク"』ということで、キャッチアップ開始時のワクワク環境構築手順を記事にしてみました！

## 背景
・未経験言語PHPとMysqlキャッチアップを開始
・環境構築（今回記事）→PDOでMysql操作（現在ここ）→簡単なCRUDの実装→未定
・まずは、ひと段落した環境構築の手順を記事にしてみました。

:::note warn
注意
実務経験なし初学者のため、
内容に誤りがあればご指摘いただけますと幸いです。
:::

## ゴール
下記環境で、Mysql操作をPHPで実行できるローカル環境を構築すること。

| | 使用技術 | 
| -- | -- | 
| 開発環境 | Docker, Apache |
| 使用言語 | PHP |
| フレームワーク | なし |
| DB | mysql |
| PC | Macbook Air M2 | 

#### ディレクトリ構造の把握
```
.
├── Dockerfile
├── compose.yaml
├── config.php
├── mysql
│   ├── data
│   └── my.cnf
└── project
    ├── config
    │   └── ini.php
    └── public
        └── index.php
```

## 手順
### 1.さっそく、compose.yamlを書く

```
#【compose.yaml】

services:
  php:
    build: .
    volumes:
      - ./project/config:/usr/local/etc/php/php.ini
      - ./project/public:/var/www/html
    ports:
      - '8080:80'
    restart: always
  mysql:
    container_name: entry_php_mysql_container
    image: mysql:8.3
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/my.cnf:/etc/mysql/my.cnf
      - ./mysql/init:/docker-entrypoint-initdb.d
    ports:
      - '3307:3306'
    environment:
      MYSQL_ROOT_PASSWORD:（任意のパスワード）
    restart: always
volumes:
  mysql_data:
```
- volumes
    - 《目的》データの永続化（コンテナを落としてもデータ消えないよう
    - 《書き方》`ホストのファイル・ディレクトリ:コンテナのファイル・ディレクトリ`

https://docs.docker.jp/compose/compose-file/compose-file-v3.html#compose-file-v3-volume-configuration-reference

- phpコンテナ
  - `./project/public:`：Webサーバーに公開されるディレクトリを指定 
  - `/var/www/html` ：通常、Apache や Nginx などの Web サーバーがデフォルトで参照するディレクトリ
- mysqlコンテナ
  - 必要なオプションを追加できる(今回は最低限で入れていません。)

https://dev.mysql.com/doc/refman/8.0/ja/option-files.html

https://docs.docker.jp/get-started/08_using_compose.html#mysql

### 2.続いて、Dockerfileを書く
```
#【Dockerfile】

FROM php:8.3-apache
RUN apt update \
  && apt install -y libonig-dev \
  && docker-php-ext-install pdo_mysql mysqli mbstring
```
- PHPでMySQLを扱うためには、`pdo_mysql`と`mysqli`が必要
- マルチバイト文字列（例えば日本語）を扱う必要がある場合は、`mbstring`も必要

### 3.各設定ファイルをとりあえず書いておく
(コンテナを立ち上げ、phpをインストールしてから細かい修正可能)
```
#【config/ini.php】

[PHP]
engine = On
memory_limit = 128M
error_reporting = E_ALL
display_errors = On
display_startup_errors = On
log_errors = On
post_max_size = 64M
default_charset = "UTF-8"
upload_max_filesize = 64M

[Date]
date.timezone = Asia/Tokyo

[MySQLi]
mysqli.default_port = 3307

[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
```
```
#【mysql/my.cnf】

[mysqld]
user = mysql
socket = /var/run/mysqld/mysqld.sock
pid-file = /var/run/mysqld/mysqld.pid
datadir = /var/lib/mysql
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
skip-name-resolve
host-cache-size = 0
secure-file-priv = /var/lib/mysql-files
default-time-zone = Asia/Tokyo

[client]
socket = /var/run/mysqld/mysqld.sock
default-character-set = utf8mb4

!includedir /etc/mysql/conf.d/

```

### 4.最後に、PHP接続・動作確認用
```
#【project/public/index.php】

<?php
phpinfo();
```
#### お疲れ様です、Dockerコンテナを立ち上げる準備完了です！

### 5.Dockerコンテナを立ち上げ、ブラウザ確認
- ```docker compose up```：Dockerコンテナを立ち上げる
- ```localhost:8080```：ブラウザで接続確認

#### 終了！
最後までお読みいただきありがとうございます！
今回はphpの開発環境を手元に用意し、今後の学習に使う目的で馴染みのあるDocker環境を選択しました。
実際にドキュメント等使用しながら書いたcompose.yamlを動かすまではまさに"ワクワク"でした！なにかの参考になれば幸いです。