Dockerでlaravel環境を構築してみた

#Dockerでlaravel環境を構築してみた
Dockerでlaravel環境を構築した際の手順を備忘録的に残しとこうと思い投稿しました。

##導入ミドルウェア
- HTTPサーバ  nginx:1.15.8
- PHP php:7.3-fpm
- DB mysql:8

## フォルダ構成
設定ファイルなどの事前に作成するファイルの格納場所を示しています。  

```
project/
├docker-compose.yml
├docker/
  └ap/
   └Dockerfile
├server/
  └ap/
  └db/
  └web/
   └etc/
    └nginx/
     └conf.d/
      default.conf
```

## 各種設定ファイルの記載
### docker-compose.yml
dockerの構成の大元となるファイルを設定していきます。
HTTPサーバとDB製品に関しては、公式イメージをそのまま使用します。

```yaml
version: '3'
services:
  web:
    image: nginx:1.15.8
    ports:
      - "8000:80"
    depends_on:
      - ap
    # 設定ファイルをnginx に読み込ませる
    volumes:
      - ./server/web/etc/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf
  ap:
    build: ./docker/ap
    depends_on:
      - db
    # ソースフォルダとして利用する
    volumes:
      - ./server/ap/application:/var/www/html
  db:
    image: mysql:8
    environment:
      MYSQL_DATABASE: dbname
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: password
    ports:
      - "3306:3306"
    # containerを停止してもデータが消えないように永続化する
    volumes:
      - ./server/db/var/lib/mysql:/var/lib/mysql
```

### Dockerfile
phpの導入に関しては、composerの導入などがあるため、公式イメージ　＋　作業を記載していきます。

```yaml
FROM php:7.3-fpm

# composerの導入
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

# PHPのExtensionsを導入
RUN apt-get update \
&& apt-get install -y libpq-dev \
&& docker-php-ext-install pdo_mysql pdo_pgsql

WORKDIR /var/www/html

```

### default.conf
nginxの設定ファイルを更新します。

```
server {
    listen 80;

    # appnameはlaravelプロジェクトの名前を設定
    root   /var/www/html/appname/public;
    index index.php index.html index.htm;

    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

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

    location ~ \.php$ {
          fastcgi_split_path_info ^(.+\.php)(/.+)$;
          fastcgi_pass   ap:9000;
          fastcgi_index  index.php;

          include        fastcgi_params;
          fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
          fastcgi_param  PATH_INFO $fastcgi_path_info;
      }
}
```

##起動＆MySQLのユーザ設定
設定ファイルがかけたらDockerを起動します。docker-compose.ymlのファイルがある箇所で以下を実行する。

```
docker-compose up -d
```

### MySQL利用者設定
laravelからDB接続する際に、デフォルトだと認証エラーが発生してしまいます。
MySQL8だとデフォルトの認証方式が変わったのですが、laravel側が対応できてないみたいです。
そのため、利用者の設定をするため、dbコンテナに入ります。

```
docker-compose exec db bash
```

mysqlの認証方式を変更します。

```
mysql -u root -p
ALTER USER 'user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
```

設定が終わったら、dbコンテナからexitで抜けましょう。

## laravelプロジェクトの作成
apコンテナの中に入って、laravelプロジェクトを作成します。

```
docker-compose exec ap bash
# appnameは好きな名前にしてください
composer create-project --prefer-dist laravel/laravel appname
```

ここまできたら、laravelプロジェクトにアクセスができるはずです。
http://localhost:8000/

## 最後にマイグレーションファイルの作成
最後にマイグレーションファイルを作成しましょう！
projeect/server/ap/application/appname配下にある「.env」ファイルのDB定義を書き換えます。

```
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=dbname
DB_USERNAME=user
DB_PASSWORD=password
```

以下のコマンドを入力して、マイグレーションファイルを作成しましょう。

```
docker-compose exec ap bash
cd appname
php artisan migrate
```

「Migration table created successfully.」と出力されれば完了です。

最後までみていただき、ありがとうございました。
ミスや不明な点があれば、ご連絡ください。