PHP+Apache+MySQL+phpMyAdminのDocker環境構築してみた！

# はじめに
今年の4月から未経験で関西の受託開発企業に就職し、エンジニアとして働いている者です。これまでXAMPPを使ってローカルで開発を行っておりましたが、新しい技術にも挑戦したい考え、Dockerで開発環境を構築してみました。その時の復習として本記事を書きました。
間違い等ございましたらご指摘をバンバンいただけると幸いです。

# 対象者
- PHPの環境をDockerを使って構築をしたい方
- XAMPPからDockerへ移行したい方

# 目的
- DockerでXAMPPっぽい開発環境を構築し、phpMyAdminとphpinfoをブラウザで表示させる！

※MacBook Air M2 Sonoma14.4、windows 11で動作確認済みです。
※PHPのバージョン7.4.8、 MySQLのバージョン8.1の環境を作成します。


# 目次
| 章 |    タイトル    |
|---:|-------------|
| 1  |Dockerについて| 
| 2  |ディレクトリ構成| 
| 3  |Dockerfile作成| 
| 4  |docker-compoes.yml作成| 
| 5  |実際にコンテナを動かしてみる|
| 6 |参考文献|


# 1章　Dockerについて
Dockerを触るのが久しぶりだったので、主要な概念を改めて勉強し直しました。

**Docker** →コンテナと呼ばれる仮想環境の中でアプリケーションの作成、配布、実行などを行うためのプラットフォームです。（データやプログラムを隔離できる仕組みを提供しています。）コンテナを利用することで、開発やデプロイの効率化、環境の再現性の確保、システムの可搬性などのメリットがあります。

**コンテナ**→アプリケーションの実行に必要な要素をすべて含んでいる「箱」のようなもの。

**イメージ**→コンテナを作る設計図のようなもの。イメージをもとにコンテナが作られる。

**ボリューム**→コンテナ内で使われるデータを保持するための仕組み。コンテナによって作成される。

**マウント**→「取り付ける」という意味。コンテナに自分のPCのストレージの一部（これをボリュームと呼ぶ）をマウントする、といったように使う。マウントの方法は２種類あるみたいだが、それについては今後勉強しようと思います。


# 2章　ディレクトリ構成

```
├── docker
│   ├── mysql
│   │   ├── dockerfile
│   │   └── my.cnf
│   └── php
│       ├── dockerfile
│       └── php.ini
├── docker-compose.yml
└── public
    └── index.php
```
ディレクトリ構成は上記のようになっています。
public配下にアプリケーションのフォルダやファイルを作成していくことを想定としています。

# 3章　Dockerfile作成
### MySQL 
MySQLのDockerfileは以下のような内容となっています。

```
FROM mysql:8.1

COPY ./docker/mysql/my.cnf /etc/my.cnf
```

- FROM・・・mysql:8.1とすることでDocker公式が提供している[MySQLイメージ](https://hub.docker.com/_/mysql)をインストールしている。
- COPY・・・ローカルにあるmy.cnfをインストールしたmy.cnfにコピー、上書きしている。（my.cnfファイルとはMySQLの設定ファイルです）

my.cnfは以下のような内容となっています。
```
[mysqld]
default_authentication_plugin=mysql_native_password
```
- 新しいユーザーを作成する際に使用されるデフォルトの認証方式を設定している。
### PHP
PHPのDockerfileは以下のような内容となっています。
```
FROM php:7.4.8-apache

RUN apt-get update && apt-get install -y \
    libonig-dev \
  && docker-php-ext-install pdo_mysql mysqli


COPY ./docker/php/php.ini /usr/local/etc/php/php.ini
```
- FROM・・・php:7.4.8-apacheとすることでDocker公式が提供している[PHPとApacheがセットになったイメージ](https://hub.docker.com/_/php)をインストールしている。
- COPY・・・ローカルにあるphp.iniをインストールしたphp.iniにコピー、上書きしている。（php.iniファイルとはPHPの設定ファイルです）
- RUN・・・各種パッケージのインストールを行っています。（-yは最新verでインストしてくれるオプション）バックスラッシュで改行できる。&&でコマンドとコマンドを繋いでいる。

php.iniは以下のような内容となっています。
```
[Date]
date.timezone = "Asia/Tokyo"

[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
```
- デフォルトのタイムゾーンを日本標準時に設定
- PHPの内部文字エンコーディングをUTF-8に設定
- マルチバイト文字列関数のデフォルトの言語設定を日本語に設定


# 4章　docker-compoes.yml作成

```
version: '3'

services:

  # PHP
  php:
    container_name: php
    build:
      context: .
      dockerfile: ./docker/php/Dockerfile
    volumes:
      - ./public:/var/www/html/
    depends_on:
      - db
    ports:
      - "80:80"

  # MySQL
  db:
    container_name: mysql_host
    build: 
      context: .
      dockerfile: ./docker/mysql/Dockerfile
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test_db
      MYSQL_USER: test_user
      MYSQL_PASSWORD: test_password
      TZ: 'Asia/Tokyo'
    volumes:
      - ./public/docker/db/data:/var/lib/mysql
      - ./public/docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./public/docker/db/sql:/docker-entrypoint-initdb.d
    ports:
      - 3306:3306

  # phpMyAdmin
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      PMA_HOST: db
      MYSQL_ROOT_PASSWORD: root
    ports:
      - 8081:80
    depends_on:
      - db

```



# 5章　実際にコンテナを動かしてみる
ターミナルでdocker-comopose.ymlファイルの上のディレクトリに移動して、以下のコマンドを打ってコンテナを作成、起動していきます。

まず、Dockerfileからイメージを作成する。（このコマンドは、Dockerfileやdocker-compose.ymlを編集した時にも叩くコマンドです）
```
docker compose build
```

コンテナを作成、起動する。
```
docker compose up
```

phpMyAdminにアクセスする。http://localhost:8081/
※ユーザー名、パスワードともにroot

phpinfoにアクセスする。http://localhost:80/


両方にアクセスできたら完了です。


# 参考文献

https://tech-blog.rakus.co.jp/entry/20200908/docker

https://qiita.com/gon0821/items/77369def082745d19c38

https://qiita.com/nasuB7373/items/523f1392d87dffb5521d

https://qiita.com/zembutsu/items/9e9d80e05e36e882caaa

https://zenn.dev/satonopan/articles/43ba26f97a8388

https://qiita.com/yoshii0110/items/0accb7f21fa1c375e0d7