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


Laradockの取得

基本は 公式ドキュメント を参照

// 作業用ディレクトリに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文字以上で大文字小文字記号数字の4種類から3種以上含んでいる必要があります。パスワード ポリシー

### 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

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

設定可能な環境変数はこちら

### 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のデフォルトページが表示されることが確認できます。

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

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

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