GitHubからcloneしたLaravel プロジェクトをDockerで動かす

あるlaravel5のプロジェクトをGitHubからcloneして、docker上で動かした時の手順です。
docker-composeを使って、nginx+mysqlでlaravel開発環境を作成しています。


# 環境
macOS Monterey
docker desktop 4.5.0
docker 20.10.12
docker-compose 1.29.2
php 7.4.29
laravel/framework 5.8.38

# 前提
* docker desktopがインストール済み、起動済みで、docker、docker-composeが使える状態

# 手順
### 1. githubからlaravelプロジェクトをclone
```
git clone [リポジトリのURL]
```
今回cloneしたのは、とあるlaravel5.8のプロジェクトです。
プロジェクトのディレクトリ構成は以下となります。srcディレクトリがプロジェクトのルートディレクトリです。
```
./src
├── app
├── bootstrap
├── config
├── database
├── packages
├── public
├── resources
├── routes
├── storage
└── tests
```

### 2. Docker環境構築
最終的に以下の構成になります。
dockerディレクトリ配下のファイルとdocker-compose.ymlを作成していきます。
```
./project
├── docker
│   └── php
│   │   ├── Dockerfile
│   │   └── php.ini
│   ├── nginx
│   │   └── default.conf
├── src  //laravelプロジェクトのルートディレクトリ
│   ├── app
│   ├── bootstrap
│   ├── config
│   ├── database
│   ├── packages
│   ├── public
│   ├── resources
│   ├── routes
│   ├── storage
│   └── tests
├── docker-compose.yml
``` 
#### Dockerfile
```Dockerfile:docker/php/Dockerfile
FROM php:7.4-fpm
COPY php.ini /usr/local/etc/php/

RUN apt update \
  && apt install -y zlib1g-dev mariadb-client vim libzip-dev unzip nodejs npm\
  && docker-php-ext-install zip pdo_mysql

RUN echo 'alias la="ls -la"' >> ~/.bashrc
RUN echo 'alias ll="ls -la"' >> ~/.bashrc
RUN echo 'alias rm="rm -i"' >> ~/.bashrc
RUN echo 'alias cp="cp -i"' >> ~/.bashrc
RUN echo 'alias mv="mv -i"' >> ~/.bashrc

#Composer install
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer

ENV COMPOSER_ALLOW_SUPERUSER 1

ENV COMPOSER_HOME /composer

ENV PATH $PATH:/composer/vendor/bin

WORKDIR /var/www
```

#### PHP設定ファイル
```docker/php/php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
```

#### nginx設定ファイル
```docker/nginx/default.conf
server {
  listen 80;
    index index.php index.html;
    root /var/www/public;

  location / {
    try_files $uri $uri/ /index.php?$query_string;
    }

  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;
  }
 }
```

#### docker-compose.yml
```docker-compose.yml
version: '3'

services:
  php:
    container_name: php
    build: ./docker/php
    volumes:
      - ./src:/var/www

  nginx:
    image: nginx
    container_name: nginx
    ports:
      - 80:80
    volumes:
      - ./src:/var/www
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php

  mysql:
    image: mysql:5.7
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: sample_db 
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
      - ./docker/db/data:/var/lib/mysql
      - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./docker/db/sql:/docker-entrypoint-initdb.d
    ports:
      - 3306:3306
```

### 3. Docker起動
```
 //docker-compose.ymlを置いたディレクトリに移動
cd project
// Docker 起動
docker-compose up -d
```

### 4. laravelの設定
#### .envファイルを作成
src/.env.example をコピーしてsrc/.envを作成し、DB設定を、docker-compose.ymlのmysqlでの設定に合わせて変更する。
```src/.env
DB_HOST=mysql  //docker-compose.ymlの定義に合わせる。
DB_DATABASE=sample_db //docker-compose.ymlのmysql.environment.MYSQL_DATABASEの値を設定
DB_USERNAME=hoge //docker-compose.ymlのmysql.environment.MYSQL_USERの値を設定
DB_PASSWORD=hoge //docker-compose.ymlのmysql.environment.MYSQL_PASSWORDの値を設定
```

### 以降はphpコンテナに入って作業
```
// phpコンテナに入る
docker-compose exec php bash

// ここでcomposer updateしている理由は、補足説明(*1)を参照してください
composer update

// Composerのパッケージのインストール
composer install

// APP_KEYを更新
php artisan key:generate

// テーブルを作成
php artisan migrate

// npmでパッケージをインストール
npm install

// Laravel-Mixのビルド(開発環境なのでdevを指定)
npm run dev
```
:::note info
(*1)私がcloneしたプロジェクトは、composer installすると、「In PackageManifest.php line 122: Undefined index: name」というエラーが出たため、その対応としてここでcomposer updateをしています。
以下の記事を参考にさせていただきました。
https://monmon.jp/536/in-a-composer-install-of-laravel-in-packagemanifest-php-line-122-undefined-index-name-undefined-index/
:::

### 5. 確認
`http://localhost/`にアクセスして、トップ画面が表示されることを確認します。


# docker-composeのコマンドまとめ
開発時に使いそうなコマンドをまとめておきます。

* docker-compose.ymlを元にコンテナを作成、起動
```
// コンテナを作成して起動する。オプション-dをつけることでバックグラウンドで実行できる。
docker-compose up -d
// オプションで--buildをつけると起動前にイメージも構築する。
docker-compose up -d --build
```

* phpコンテナに入る
```
docker-compose exec php bash
```

* mysqlコンテナに入る
```
docker exec -it mysql bash

mysql -u [DBユーザー] -p
Enter password: [パスワード]
```

* サービスの起動と停止
```
// 起動(止まっているコンテナを起動するだけであり、新しいコンテナは作成しません。)
docker-compose start
// 停止
docker-compose stop
```

# 参考記事
https://chigusa-web.com/blog/laravel-github-clone/
https://qiita.com/A-Kira/items/1c55ef689c0f91420e81
https://qiita.com/wasanx25/items/d47caf37b79e855af95f