Laradock でLaravel + SQLServerの環境を用意する

# Laradockの取得

基本は [公式ドキュメント](http://laradock.io/getting-started/) を参照

```
// 作業用ディレクトリにlaradockをクローンする
git clone https://github.com/Laradock/laradock.git

// envファイルをコピーする
cd laradock
cp env-example .env
```

本記事は公式ドキュメントの新規作成用のプロジェクト手順に従い、次のディレクトリ構成となる想定です。

```
作業用フォルダ
  ├ laradock
  └ lara-test(新規プロジェクトフォルダ)
```


# dockerをビルドする前に行う設定

## .envの修正

### 基本設定

`APP_CODE_PATH_HOST`に作成予定のプロジェクト名を入力する

```
APP_CODE_PATH_HOST=../lara-test/
```

### SQL Server用設定

DB名、SA用パスワード、ポート番号を設定する。
パスワードは8文字以上で大文字小文字記号数字の４種類から3種以上含んでいる必要があります。[パスワード ポリシー](https://docs.microsoft.com/ja-jp/sql/relational-databases/security/password-policy?view=sql-server-ver15)

```
### MSSQL #################################################

MSSQL_DATABASE=master
MSSQL_PASSWORD="yourStrong(!)Password"
MSSQL_PORT=1433
```

WORKSPACE用のインストールオプション、PHP_FPM用のインストールオプションをtrueに変更する。

```
### WORKSPACE #############################################

WORKSPACE_INSTALL_MSSQL=true

### PHP_FPM ###############################################

PHP_FPM_INSTALL_MSSQL=true

```
それぞれtrueにしないとDB接続時に次のようなエラーが発生します。

```
Illuminate\Database\QueryException
could not find driver
```


## docker-compose.ymlの修正

### ボリュームコンテナーを使用するための修正(Macでのみ必須)

デフォルトでは `${DATA_PATH_HOST}` のディレクトリにマウントするように設定されていますが、Macの場合はそのままだとエラーが出ます。

```:エラー内容
2020-05-08 06:49:33.62 Server      Error: 17113, Severity: 16, State: 1.
2020-05-08 06:49:33.62 Server      Error 87(パラメーターが間違っています。) occurred while opening file '/var/opt/mssql/data/master.mdf' to obtain configuration information at startup. An invalid startup option might have caused the error. Verify your startup options, and correct or remove them if necessary.

```

2020年6月時点ではMac上ではホストのディレクトリマウントがサポートされていないためです。
https://docs.microsoft.com/ja-jp/sql/linux/sql-server-linux-configure-docker?view=sql-server-ver15#mount-a-host-directory-as-data-volume
> 現時点では、SQL Server on Linux イメージを使用した Mac 上の Docker のホスト ボリューム マッピングはサポートされていません。 代わりにデータ ボリューム コンテナーを使用してください。

回避するためにはデータボリュームコンテナを用意してそちらを使用する必要があります。

```:volume定義例
volumes:
  mssqlvolume:
    driver: local
```

```
       volumes:
#        - ${DATA_PATH_HOST}/mssql:/var/opt/mssql
        - mssqlvolume:/var/opt/mssql
```

### インストール時に使用される環境変数の変更

設定可能な環境変数は[こちら](https://docs.microsoft.com/ja-jp/sql/linux/sql-server-linux-configure-environment-variables?view=sql-server-ver15)

```
### MSSQL ################################################
    mssql:
      build:
        context: ./mssql
      environment:
        - MSSQL_PID=Express
        - MSSQL_DATABASE=${MSSQL_DATABASE}
        - SA_PASSWORD=${MSSQL_PASSWORD}
        - ACCEPT_EULA=Y
```

Developerエディションにするなら `MSSQL_PID=Developer` に変更、言語を日本語にしたいなら `MSSQL_LCID=1041` に変更など。

以降は基本的にMySQLの場合などと同様。
失敗したら、画面に表示されるエラーログや `dokcer logs`でログを確認する。

# コンテナを立ち上げてプロジェクトを作成する

```
docker-compose up -d workspace nginx mssql php-fpm
```

でコンテナをビルド & 立ち上げて

```
docker-compose exec workspace bash
```

でコンテナに入って

```
composer create-project --prefer-dist laravel/laravel .
```
でプロジェクトを作成する。
コンテナ上では `/var/www` 下にファイルが配置され、ホストPC上では`APP_CODE_PATH_HOST` で設定したプロジェクトフォルダに各ファイルが配置されている状態となります。

```:コンテナ上にLaravelのファイルが作成される
/var/www# ls -a
.    artisan        composer.lock  .editorconfig  .gitattributes  phpunit.xml  resources   storage       vendor
..   bootstrap      config         .env           .gitignore      public       routes      .styleci.yml  webpack.mix.js
app  composer.json  database       .env.example   package.json    README.md    server.php  tests
```

この状態で http://localhost を開くとlaravelのデフォルトページが表示されることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299916/e80489af-41cb-7fe1-620f-3c13a2f64729.png)

# Laravel側のDB設定と疎通確認

## Laravel用の.envでSQL Server用の設定をする
新規作成されたlaravelのプロジェクトの.envを編集

```
DB_CONNECTION=sqlsrv
DB_HOST=laradock_mssql_1
DB_PORT=1433
DB_DATABASE=master
DB_USERNAME=SA
DB_PASSWORD='""yourStrong(!)Password""'
```
`docker-compose.yml` のデフォルトのパスワードではダブルクォートが入っていますが、そのまま`.env`に記載すると除外されてしまうので、上記のような対応が必要です。

## 疎通確認

`routes/web.php` に

```php
Route::get('/test/', function () {
    return json_encode(\Illuminate\Support\Facades\DB::select("select @@version"));
});
```

を追加して、 http://localhost/test/ でSQL Serverのバージョン情報が表示されたらSQL Serverに接続ができています。