Dockerでlaravelの環境構築

エンジニア歴約半年ほどの駆け出しエンジニアです。
今回も中々苦労した環境構築についての備忘録を自分用に残したいと思います。
他サイトやlaravelのチュートリアルを参考に環境構築をしたかったのですが、どれを見てもエラーが出て最後まで構築できなかったので自分なりにDockerを使ったlaravelの環境構築についてまとめてみました。
まだdocker、laravelとともに知識が浅いので間違っていましたらご指摘いただけますと幸いです。

## ①作成したディレクトリの中にフォルダを作成
ディレクトリ構造↓
（見えにくかったらすみません）
```
📁practice
└ 📁docker
　 ├ 📁app
　 │ ├ Dockerfile
　 │ ├ php.ini
　 │ └ 000-default.conf
　 ├ 📁db
　 │ ├ 📁data
　 │ └ my.conf
　 ├ 📁src
　 └ docker-compose.yml
```
## ②Dockerfileに以下を記述
~~~
# どんな docker イメージを利用して構築をするか
# FROM : ここではPHPの公式イメージである「php:7.4-apache」というあらかじめPHPとApacheがインストールされているイメージを、Docker Hubというサイトからダウンロードしてくるようになっている。
FROM php:7.4-apache

# 設定ファイルをdockerコンテナ内のPHP、Apacheに読み込ませる
# ADD：ローカルのファイルをDockerコンテナ内にコピーする
ADD php.ini /usr/local/etc/php/
ADD 000-default.conf /etc/apache2/sites-enabled/

# Composerのインストール
# RUN：コンテナ内でコマンド実行する
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer

# ミドルウェアのインストール
RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim \
libpng-dev \
libpq-dev \
&& docker-php-ext-install pdo_mysql

# Laravelで必要になるmodRewriteを有効化する
RUN mv /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled
RUN /bin/sh -c a2enmod rewrite

# composerコマンドを使えるようにする
COPY --from=composer /usr/bin/composer /usr/bin/composer
~~~

## ③000-default.confのに以下を記述
```
<VirtualHost *:80>
       ServerAdmin webmaster@localhost
        //my-projectの部分は書き換え
       DocumentRoot /var/www/html/practice/public
       ErrorLog ${APACHE_LOG_DIR}/error.log
       CustomLog ${APACHE_LOG_DIR}/access.log combined
        //my-projectの部分は書き換え
       <Directory /var/www/html/practice/public>
           AllowOverride All
       </Directory>
</VirtualHost>
```

## ④php.iniに以下を記述
```
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
```

## ⑤my.cnfに以下を記述
```
[mysqld]
character-set-server=utf8
```

## ⑥docker-compose.ymlに以下を記述（docker-composeの設定を行う）
```
# Compose fileのバージョン指定
version: '3'

# どんなコンテナを立ち上げるか
services:

 # ---------------------------------
 # laravelを動かすコンテナ
 # ---------------------------------
 app:
   # どのポートを開いて繋ぐか。下記はコンテナの80番ポートを開いて、ホストの80番につなぐ
   ports:
     - "80:80"
   # 先ほど作ったDockerfileを使って、コンテナをビルドするという指定
   build: ./docker/app
   # コンテナの名前を指定
   container_name: my-project
   # ローカルのディレクトリとコンテナ上のディレクトリのリンクを設定
   # ./src は docker-composer.yml のディレクトリ直下にある src を設定している
   # コンテナが作成されると src ディレクトリからコンテナの /var/www/html にアクセスすることができる
   volumes:
     - ./src:/var/www/html

# ----------------------------------
# MySQLを動かすコンテナ
# ----------------------------------
 db:
   # Docker HubからMySQL5.7の公式イメージをダウンロードしてくる指定
   image: mysql:5.7
   container_name: my-project-db

   # コンテナ内の環境変数を指定。環境変数を渡すとビルド時に設定してくれるDockerイメージがあるので、利用の際はDocker Hubのサイトで確認する
   environment:
     MYSQL_ROOT_PASSWORD: root
     MYSQL_DATABASE: laravel_db
     MYSQL_USER: laravel_user
     MYSQL_PASSWORD: laravel_pass
     TZ: 'Asia/Tokyo'

   # 起動時のコマンド
   command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
   # ディレクトリ同期。設定ファイルとMySQLのデータが保存される場所を同期している。コンテナは基本的に起動時に変更されてもコンテナ自体が止まるとデータが消えてしまうため、保存しておきたいものはホストマシンと同期しておく必要がある。
   volumes:
     - ./docker/db/data:/var/lib/mysql
     - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
   ports:
     - 3306:3306
```

## ⑦Docker Composeでコンテナを立ち上げる
ディレクトリ直下にあるフォルダに移動（ここでDockerを起動しておく）


practiceディレクトリに移動
```
cd practice
```

Dockerイメージを作成
```
docker-compose build
```

-dでバックグラウンドを起動
```
docker-compose up -d
```

起動しているコンテナの確認
```
docker ps
```

//コンテナの中に入る
```
docker-compose exec app bash
```


## ⑧laravelプロジェクトの作成
ここではsrcディレクトリの中にlaravelプロジェクトが作られます


laravelプロジェクトの作成
```
composer create-project laravel/laravel プロジェクト名 "バージョンを指定する場合は記述"
```

laravelプロジェクトに移動
```
cd プロジェクト名
```

ストレージの権限変更
```
chmod 777 -R storage/
```

暗号化キーの生成
```
php artisan key:generate
```

ここまで来たらローカルホストへ接続をします。
**ローカルホストに接続**
http://localhost/

作業が終わったらコンテナの停止をします
```
docker-compose stop
```

**補足**
開発環境を一旦クリーンにして、一から作り直したい場合
```
docker-compose stop
```