【Docker】PHP＋MySQL＋phpMyAdminの環境構築メモ

とりあえずDockerに慣れる意味での簡易的な環境構築方法となります。
Docker初心者が書いているので、おかしな点など有りましたらご指摘いただけると助かります。

## Dockerデスクトップをインストール

まずはDockerデスクトップをインストール。
インストール方法はこちらの記事様がわかりやすく解説して下さってます（Windowsです）

https://qiita.com/zaki-lknr/items/db99909ba1eb27803456

## 必要なファイルを準備

以下の構成でファイル・フォルダを作成。
```
┌─ html
│　 └ index.php
├─ php.ini
└─ docker-compose.yml
```
※MySQLのフォルダは後で自動作成されるので作成不要。
なお、解説サイトによってはDocekerfile（imageの設計図のようなもの）を別途作成している場合もある。Docekerfileはオリジナルのimageを使用する場合等には必要だが、今回のように既存のimageをそのまま使用するだけなら無くてもOK。

## 各ファイルの中身

**index.php**

```php
<?php echo "hello"; ?>
```

**php.ini**
```ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
```

**docker-compose.yml（内容の意味については当記事下部に別途記載）**
```yml
version: '3'

services:
  php:
    image: php:7.4.8-apache
    volumes:
      - ./php.ini:/usr/local/etc/php/php.ini
      - ./html:/var/www/html
    ports:
      - 8080:80
  mysql:
    image: mysql:5.7
    volumes:
      - ./mysql:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=test
      - MYSQL_USER=test
      - MYSQL_PASSWORD=test
      - TZ=Asia/Tokyo
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=test
      - PMA_PASSWORD=test
    ports:
      - 4040:80
    volumes:
      - ./phpmyadmin/sessions:/sessions
```

## コンテナ起動
下記コマンドでimageの作成とコンテナ作成・起動が行われる。`-d`はバックグラウンドで実行するためのオプション。
```
$ docker-compose up -d 
```

起動が完了するとdocker-compose.yml等と同じ階層にmysqlフォルダが自動作成されている。
なお、起動中のコンテナ一覧は下記コマンドで確認できる。
```
$ docker ps
```
`-a`オプションを付けて`docker ps -a`とすると、起動していないコンテナも表示される。

ちなみに、今回のようにdocker-compose.ymlに書かれた複数のコンテナを同時に作成・起動する場合は`docker-compose up`を使用するが、単一のコンテナの作成・起動であれば`run`コマンドを使用する。そのあたり下記記事様がわかりやすくまとめて下さってます。

https://qiita.com/tegnike/items/bcdcee0320e11a928d46

## 動作確認
http://localhost:8080/
にアクセスすると、index.phpの内容が表示されるはず。

http://localhost:4040/
にアクセスすると、phpMyAdminの管理画面が表示されるはず。

## コンテナの停止・再開・削除

**停止**
```
$ docker-compose stop
```
**再開**
```
$ docker-compose start
```
**削除**
```
$ docker-compose down
```
なお、downによりコンテナは削除されるがimageが削除される訳ではないので、「stopで停止しstartで再開」でも、「downで削除しupで再作成」でも時間的にはあまり変わらない。


## docker-compose.ymlの内容について

長いので上半分のみ。
```yml
version: '3' 

services:
  php:
    image: php:7.4.8-apache
    volumes:
      - ./php.ini:/usr/local/etc/php/php.ini
      - ./html:/var/www/html
    ports:
      - 8080:80
  mysql:
    image: mysql:5.7
    volumes:
      - ./mysql:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root
```
**version:**
docker-compose.ymlの書式のバージョン。Docker Desktopがバージョンアップしても古い書式に対応できるように記載する。
**services:**
ここに「php」や「mysql」などのコンテナ名を書く。
**image:**
コンテナで使用するDocker Image を指定。
**volumes:**
少しややこしいので後述します。
**ports:**
ホストPCのポート番号とDockerコンテナのポート番号を紐づけるための設定。上記phpの設定で言うと8080がホストで80がコンテナのポート番号。
**environment:**
環境変数の設定。各コンテナに対しての設定を記述する。myaqlの場合ならパスワードやユーザー名などをここで設定している。

## volumesについて
**volumesでは何を設定する？**
ホストPCのディレクトリを、Dockerコンテナのディレクトリにマウントするための設定など。

**マウントとは？**
機能としてはWindowsのショートカットフォルダ（Macならエイリアス）のイメージに近いと思う。Dockerコンテナ内のディレクトリにホストPC内のディレクトリを紐づけることで、DockerコンテナからホストPCのファイルへアクセスできるようになる。

**マウントが必要な理由１：ファイル編集が簡単**
例えばindex.phpの内容を編集する場合に、マウントしていればホストPC内のindex.phpを編集するだけでコンテナに自動反映される。

**マウントが必要な理由２：データの永続化が出来る**
通常、`docker-compose down`コマンド等でコンテナを削除すると、当然コンテナ内のデータも消えてしまう。しかしマウントしていればホストPC内にデータが残っているので、コンテナを再作成した際などにそのまま使用できる。

**実際にマウントできてるか確認する**
今回のphpコンテナ（実際にはphp＋appach）の例で言うと、volumesの２行目に`./html:/var/www/html`と書かれている。これはホストPCの`./html`とコンテナ内の`/var/www/html`が対応していることを表している。
なので、`docker-compose exec php bash`コマンドでコンテナの中に入ってみると、ホストPCのhtmlフォルダ内のindex.phpと同じものがコンテナ内の/var/www/htmlフォルダ内にあることが確認できる。

　
## 参考にさせて頂いた記事様

https://futureys.tokyo/lets-understand-contents-of-docker-compose-yml/

https://zenn.dev/fagai/articles/55c1b34172ca5a0bce09

https://zenn.dev/aono/articles/0856cf4d4e3e25

https://www.nyamucoro.com/entry/2018/08/13/222617

https://qiita.com/taiga_tech/items/d9361f10d521a55659ee