Dockerとnginx,mysqlでLaravelを構築(初心者のメモ)

# はじめに
DockerでLaravelを構築した時にいろいろと問題にぶち当たり、メモ程度にまとめました。
# 目次
- nginxの構築
- MYSQLの構築
- PHPの構築
- Laravelプロジェクトの作成
- コンテナの作成
- おわりに

# 使ったもの
- Docker Desktop
- ubuntu 22.04.2 LTS
- nginx
- MYSQL 8.0.32
- PHP 8.2.3-fpm
- laravel
# ディレクトリ全体像
Dockerのディレクトリの全体像を先に示しておきます。
```
$ tree
├── docker-compose.yml
├── mysql
│   └── my.ini
├── nginx
│   ├── Dockerfile
│   └── nginx.conf
└── php
    └── Dockerfile
```
# nginxの構築
docker composeを使うのでdocker-compose.ymlを編集しました。
```docker:docker-compose.yml
version: '3.9'
services:
    nginx:
        image: nginx:latest
        #Dockerfileのディレクトリ
        build: ./nginx
        container_name: nginx
        volumes:
            #コンフィグファイルの同期
            ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
            ./src:/var/www/html
        ports:
            - 80:80
```

次にDockerfileを編集しました。
```Dockerfile:nginx/Dockerfile
FROM nginx:latest
RUN service nginx start
```
次にnginxのコンフィグファイルを記載します。
```config:nginx/nginx.conf
server{
    root /var/www/html/laravelのプロジェクト名/public;
    listen *:80;
    listen [::]:80;
    index index.html index.php;

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

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
```
locationより下の処理は、書かないとwebページの表示ではなく、phpファイルがダウンロードされたので必要です。
以上でnginx関連は終了です。
# MYSQLの構築
nginxの時のdocker-compose.ymlに追記をします。
```docker:docker-compose.yml
version: '3.9'
services:
    nginx:
        image: nginx:latest
        build: ./nginx
        container_name: nginx
        volumes:
            ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
            ./src:/var/www/html
        ports:
            - 80:80
    mysql:
        image: mysql:8.0.32
        container_name: mysql
        volumes:
            #コンフィグファイルの同期
            ./mysql/my.ini:/etc/my.ini
        environment:
            MYSQL_ROOT_PASSWORD: 管理者のパスワード
            MYSQL_USER: ユーザー名
            MYSQL_PASSWORD: ユーザーのパスワード
            MYSQL_DATABASE: データベース名
        ports:
            3306:3306
```
MYSQLではDockerfileを使用しませんでした。次はmy.iniに文字コードについての処理を記載します。
```ini:mysql/my.ini
[mysql]
default-character-set=utf8mb4

[mysqld]
character-set-server=utf8mb4
```
以上でMYSQLは終了です。
# PHPの構築
MYSQL同様、docker-compose.ymlに追記していきます。
```docker:docker-compose.yml
version: '3.9'
services:
  nginx:
    image: nginx:latest
    build: ./nginx
    container_name: app-web
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
      - ./src:/var/www/html
    ports:
      - 80:80
  mysql:
    image: mysql:8.0.32
    container_name: mysql
    volumes:
      - ./mysql/my.ini:/etc/my.ini
    environment:
        MYSQL_ROOT_PASSWORD: 管理者のパスワード
        MYSQL_USER: ユーザー名
        MYSQL_PASSWORD: ユーザーのパスワード
        MYSQL_DATABASE: データベース名
    ports:
      - 3306:3306
  php:
    image: php:8.2.3-fpm
    #Dockerfileのディレクトリ
    build: ./php
    container_name: php
    volumes:
      - ./src:/var/www/html
    ports:
      - 9000:9000
    #PHPとmysqlを簡単に接続できるようにする
    depends_on:
      - mysql
```
次にDockerfileの処理です。
```dockerfile:php/Dockerfile
FROM php:8.2.3-fpm

RUN apt-get update && apt-get install -y libonig-dev && \
    docker-php-ext-install pdo_mysql mysqli mbstring
```
必要なライブラリのインストールなどです。
# Laravelプロジェクトの作成
DockerfileへcomposerとLaravelプロジェクト作成のコマンドを追記します。
```dockerfile:php/Dockerfile
FROM php:8.2.3-fpm

RUN apt-get update && apt-get install -y libonig-dev && \
    docker-php-ext-install pdo_mysql mysqli mbstring
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN ./composer.phar create-project laravel/laravel laravelのプロジェクト名
```
以上ですべてのファイルが用意できました。
# コンテナの作成
Ubuntuのコマンド上で以下を実行させます。
```
$ docker-compose up -d --build
```
これでnginx,mysql,phpのコンテナが作成されます。念のため以下のコマンドで確認しておきます。
```
$ docker-compose ps -a
NAME                IMAGE               COMMAND                  SERVICE             CREATED             STATUS              PORTS
nginx               php:8.2.3-fpm       "docker-php-entrypoi…"   php                 24 hours ago        Up 12 hours         0.0.0.0:9000->9000/tcp
mysql               mysql:8.0.32        "docker-entrypoint.s…"   mysql               2 days ago          Up 12 hours         0.0.0.0:3306->3306/tcp, 33060/tcp
php                 nginx:latest        "/docker-entrypoint.…"   nginx               12 hours ago        Up 12 hours         0.0.0.0:80->80/tcp
```
全てのステータスがUpになった状態で[localhost](http://localhost "localhost")を表示し、Laravelの初期画面が表示されたら成功です！
# おわりに
Qiitaの練習とDockerのメモのためにこの記事を作ったので端折るところや言葉足らずのところが多くても許してください。
それと、とりあえずLaravelを導入したかっただけなのでこれで自作コードが動かないかもしれないのでこのままの環境でLaravelの学習を続けていきたいと思います。