初心者｜docker-compose｜PHP+ Nginx + MySQL 

docker-compose.ymlファイル**だけ**でphp環境を簡単に構築できないかと思い、調べて見ました。（残念ながらdocker-compose.ymlファイル**だけ**ではダメでしたが...）

# リスペクトな記事
この記事を作成するにあたり、参考にさせていただいた記事です。
本件、同様の既存記事を踏襲する内容となります。

[DockerによるPHP開発環境構築（PHP + MySQL + Nginx）](https://qiita.com/nemui_/items/f911be7ffa4f29293fd5)
[Docker + Nginx + PHP-FPM なら40秒くらいで環境を準備できる docker-compose が楽しくなってきました。](https://qiita.com/mochizukikotaro/items/b398076cb57492980447)

# したいこと
dockerを使って、ローカル環境でphpを使いたい

# したこと
## 1） docker-compose.yml の用意
下記、コピペでOKです

```yml:docker-compose.yml
version: "3"
services:
  db:
    image: mysql:5.7
    volumes:
      - ./db/mysql:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root_pass_fB3uWvTS

  phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest
    restart: always
    ports: ["8888:80"]
    depends_on: ["db"]
    environment:
      MEMORY_LIMIT: 3G
      UPLOAD_LIMIT: 3G

  php:
    image: php:7.4-fpm
    volumes:
      - ./nginx/html:/usr/share/nginx/html
      - ./php/php.ini:/usr/local/etc/php/conf.d/php.ini
    depends_on: ["db"]

  nginx:
    image: nginx:latest
    volumes:
      - ./nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf
      - ./nginx/html:/usr/share/nginx/html
    restart: always
    ports: ["8080:80"]
    depends_on: ["php"]
```

## 2）とりあえず docker-compose up
docker-compose.ymlファイルのあるディレクトリで`docker-compose up -d`してみてください。<font color="red">エラーが出るはずです。</font>

エラーが出たことを確認しましたら`docker-compose down`で停止してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283603/82ebe2e9-d12a-c5b9-c627-c141b2583a13.png)

エラーが出た理由は`nginx:`サービスで使う default.conf ファイルがクライアント側に存在しないためです。

<font color="red"> default.conf ファイルを用意する必要があります</font>


:::note warn
もし「no matching manifest for linux/arm64/v8 in the manifest list entries」という表示が出て止まったら、次の参考サイトをご確認ください。

【参考サイト】
[[Docker] M1 Macで「 no matching manifest for linux/arm64/v8 in the manifest list entries」のエラーの対処法](https://qiita.com/jizya/items/38f15271903de629d1ab)

私はM2チップ搭載のMacBookで表示されました
:::


## 3)【重要】 nginx用のdefault.confファイルの用意
default.conf ファイルを用意します。

```conf:default.conf
server {
    listen       80;
    server_name  localhost;
    root   /usr/share/nginx/html;
    index  index.php index.html;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ [^/]\.php(/|$) {
        fastcgi_pass php:9000;
        fastcgi_index index.php;    
        fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include       fastcgi_params;
    }
}
```

## 4) default.confファイルの保存先
上記の工程（2）で`docker-compose up -d`をした後であれば、docker-compose.ymlファイルのあるディレクトリに`nginx` `php` `db`という３つのディレクトリが生まれているはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283603/12790560-b644-470f-963d-c30167c75bac.png)

ディレクトリ`nginx / conf.d`の中に**default.conf**ファイルを保存してください。

<font color="red"> 「default.conf」というディレクトリが先に存在している場合は、削除してください（入れ替えてください）</font>

## 5）もう一度 docker-compose up
再度に`docker-compose up -d`してください。今回は上手く立ち上がったのではないでしょうか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283603/d5716c4b-3dd6-23c1-04e8-da938e78b922.png)

## 6）確認してみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283603/300ab563-0ad0-f658-aa36-9e881698f499.png)

動作確認のため、ディレクトリ`nginx / ｈｔｍｌ`の中に`index.php`ファイルをおいてください。（`index.php`ファイルの内容は何でも結構です）

```php:index.phpの例
<?php
echo phpinfo();
```

ブラウザで`http://localhost:8080/`へアクセスして表示されれば確認完了です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283603/a91768da-d842-dedd-1812-1b7c2d2d4faa.png)

---

# 補足
## データベースとphpMyAdminは不要です
上記の docker-compose.yml には個人的な都合でmysqlとphpmyadminを入れておりますが、php環境を作る目的だけであれば不要なものです。
よってサービス`db:`と`phpmyadmin:`は削除いただいてOKです。ただし、削除する場合はサービス`php:`内にある`depends_on: ["db"]`を**削除することを忘れない**ように。

もし、phpMyAdminへアクセスする場合は`http://localhost:8888/`です。
ユーザー名`root`、パスワード`root_pass_fB3uWvTS`でログインできるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283603/0af6e76a-e806-dbf5-9455-6cca91877f21.png)

## nginx−default.conf の記述について
こちらの参考サイトがとても勉強になりました。

参考サイト：[nginx連載4回目: nginxの設定、その2 - バーチャルサーバの設定](https://heartbeats.jp/hbblog/2012/04/nginx04.html)
参考サイト：[nginx連載5回目: nginxの設定、その3 - locationディレクティブ](https://heartbeats.jp/hbblog/2012/04/nginx05.html)

## nginx と PHP-FPM の関係性について
こちらの参考サイトがとても勉強になりました。

参考サイト：[nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する](https://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc)

## FastCGIって何？
こちらの参考サイトがとても勉強になりました。

参考サイト：[調べなきゃ寝れない！と調べたら余計に寝れなくなったソケットの話](https://qiita.com/kuni-nakaji/items/d11219e4ad7c74ece748)