【Docker】amazonlinux ＋ nginx ＋ php-fpm ＋ mysql でLaravelの開発環境構築してみた。

DockerでLaravelの開発環境を構築する際にめちゃちゃつまずいたので、
新人に同じ被害に遭ってほしく無いという思いからこの記事を書す^^

【目標】
・Docker-composeでLaravelの開発環境構築
・既存のLaravelプロジェクトの開発環境をDockerに乗り換える。

【ディレクトリ構成】

```
Larave_docker
 |__docker-compose.yml
 |_src
  |_LaravelプロジェクトをgitからCloneしてきたもの
 |_web
  |_Dockerfile
  |_nginx.conf
  |_php.ini
  |_www.conf
```

####🔽制作されるコンテナは2つ🔽
①DB(mysql)コンテナ
②Nginx+phpコンテナ


##順序はこう
①amazonlinuxサーバーでLaravelが動くようにする(Dockerfile作成)
②docker-compose.ymlを作成
③docker-composeで複数コンテナ同時立ち上げ
④mysqlにデーターベースを作成
⑤Laravelの.envファイル編集

#①amazonlinuxサーバーでLaravelが動くようにする(Dockerfile作成)

```
FROM amazonlinux:2

#nginxとphpをインストール
RUN yum -y update
RUN amazon-linux-extras install -y nginx1.12 php7.4

#パッケージをインストール
RUN yum install -y php-pecl-zip php-mbstring php-xml php-xml php-curl php-gd php-bcmatch vim zip unzip curl less procps
RUN yum -y update

#Composerインストール
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php composer-setup.php --version=1.10.23
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer

#gitインストール
RUN yum install -y git

#php.iniのmemory_limitを無制限に変更
COPY  ./php.ini /etc/php.ini

#nginxのデフォルトrootの変更
COPY ./nginx.conf /etc/nginx/nginx.conf

#php-fpmのuser groupとかの変更
COPY ./www.conf /etc/php-fpm.d/www.conf

#node.jsとnpmをインストール 
RUN curl -fsSL https://rpm.nodesource.com/setup_16.x | bash -
RUN yum install -y nodejs

```

変更点だけここに記載します。
####php.ini

```
;memory_limit = 128M
memory_limit = -1  
```

####nginx.conf

```
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /var/www/laravelプロジェクトディレクトリ名/public;
        client_max_body_size 30M;

        # Load configuration files for the default server block.
        # include /etc/nginx/default.d/*.conf;

        location ~* .(html|css|js|jpe?g|png|gif|svg|mpg|flv|swf)$ {
                expires 10d;
                access_log off;
                break;
        }
        location / {
                index index.php index.htm index.html;
                try_files $uri $uri/ /index.php?$query_string;
        }
        location ~ \.php$ {
                fastcgi_pass   unix:/var/run/php-fpm/www.sock;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /var/www/laravelプロジェクトディレクトリ名/public$fastcgi_script_name;
                include        fastcgi_params;
        }
```

### www。conf

```
;user = apache
user = nginx

;group = apache
group = nginx
```

これでLaravelは動く。
Laravel uiなども使える。

#②docker-compose.ymlを作成

```
version: '3'
services:
  db:
    platform: linux/x86_64
    image: mysql:5.7
    container_name: laravel_db
    environment:
      MYSQL_ROOT_PASSWORD: root
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
    - ./src/db/mysql_data:/var/lib/mysql
    ports:
    - 3306:3306
  web:
    container_name: laravel_docker
    build: ./web/ →webディレクトリ内のDockerfileからコンテナを作成
    ports:
      - "80:80"
    volumes:
      - ./src/LaravelプロジェクトをgitからCloneしてきたもの:/var/www/Laravelプロジェクト名
    working_dir: /var/www/Laravelプロジェクト
    command: /bin/sh -c "chmod 777 -R ./storage && composer install && npm install && npm run dev && cp .env.example .env && php artisan key:generate && php-fpm && nginx -g 'daemon off;'"
    depends_on:
      - db
```

#③docker-composeで複数コンテナ同時立ち上げ

```
docker-compose build up
```

#④mysqlにデーターベースを作成

③で制作されたmysqlコンテナに入って作業します。

```
docker exec -it laravel_db bash

#mysqlのbashで以下を入力
mysql -u root -p mysql

Enter password:パスワードrootを入力(docker-compose.ymlで設定したパスワード)

mysql> CREATE database laravel_db(データーベース名);
mysql> SHOW databases;→制作されたか確認
```

#⑤Laravelの.envファイル編集

```
DB_CONNECTION=mysql
DB_HOST=laravel_db(mysqlコンテナ名)
DB_PORT=3306
DB_DATABASE=laravel_db(④で制作したDB名)
DB_USERNAME=root →ユーザー制作してない場合はrootでアクセス
DB_PASSWORD=root →ユーザー制作してない場合はrootパスワードでアクセス
```

```
php artisan migrate 
```
これでテーブルが作成されればLaravelとDBの接続成功


##最後に
筆者はDB接続をRDSにしたかったのですが、
うまく接続ができなかったのでこの方法を用いました。
　
EC2→RDSとEC2を踏み台にすれば接続できそうなのですが、工数かかると思って今回はこの簡単な方法にしました😄
https://qiita.com/lighttiger2505/items/ea33291639a8656d50b4

AWSポートフォワーディング SSH Mysql などで記事出てくると、、、

※RDSのセキュリティグループのインバウンドを全ipから許可、mysqlのユーザーのアクセスip制限をどこからでもする、RDSのパブリックアクセスを許可する
でアクセスもできます。

そもそもRDSに接続しようとすると、Nginxの500エラーがでてきて、このエラーがDBにあると判断するまでに2日くらいかかってマジで時間浪費しました。。
このやろう！！