【Docker】Laravel9でSQL Serverに接続する方法

テクノロジー・ガジェット

すぐに解決したい方はまとめ記事をご覧ください。

はじめに

Dockerfileをのちのち編集したいので、以前の記事【docker】Laravel9でxdebugを導入を終えた状態からスタートします。

SQL Serverとの接続テストをしたいので my-project/routes/web.php を下記のように編集します。

<?php

use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\DB;


Route::get('/', function () {
    $pdo = DB::connection()->getPdo();
    dd($pdo);
    // return view('welcome');
});

公式ドキュメントより抜粋、接続インスタンスでgetPdoメソッドを使用して、接続の基になる素のPDOインスタンスにアクセスできます。

この状態でトップページにアクセスすると以下のようなレスポンスが返ってきます。

PDO {#281 ▼ // routes/web.php:9
  inTransaction: false
  attributes: {▶}
}

デフォルトではmysql設定なので問題なくmysqlのDBに接続できています。

次に、$pdo = DB::connection()->getPdo();を$pdo = DB::connection(‘sqlsrv’)->getPdo();に変更します。

すると、「could not find driver」のエラーになります。SQL Server用のdriverが無いエラーです。

SQL Server用のドライバーをインストール

マイクロソフト公式ドキュメントを読みとODBCドライバーが必要とのことなのでMicrosoft ODBC 18のDebianの箇所のコードを順次実行します。

まずは、コンテナに入ります。

docker compose exec myapp bash

次に以下を実行

sudo su
curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -

すると以下のエラーが発生します。

 0E: gnupg, gnupg2 and gnupg1 do not seem to be installed, but one of them is required for this operation

翻訳すると、gnupg、gnupg2、gnupg1がインストールされていないようですが、この操作にはそのうちの1つが必要です。

gnupgをインストールします。

apt install -y gnupg

もう一度sudoから実行します。

sudo su
curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -

OKと表示されたら次のコードを実行します。#Debian 11の下のコードを実行

curl https://packages.microsoft.com/config/debian/11/prod.list > /etc/apt/sources.list.d/mssql-release.list

続けて以下を実行

sudo apt-get update
sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18

以上でODBCドライバーのインストールの完了です。

Microsoft Drivers for PHP for SQL Serverのインストール

公式ドキュメントを参考に進めます。

手順 3. Microsoft SQL Server 用 PHP ドライバーをインストールする (Debian)の箇所を実行する

sudo pecl install sqlsrv

ERROR: `make’ failedというエラーが発生します。次のコードで解決です。

apt install -y unixodbc-dev

もう一度 sudo pecl install sqlsrv を実行します。

You should add “extension=sqlsrv.so” to php.iniというコメントが出ていますが、後ほど対応します。

sudo pecl install pdo_sqlsrv

You should add “extension=pdo_sqlsrv.so” to php.iniというコメントも後ほど対応します。

phpenmod sqlsrv pdo_sqlsrv

bash: phpenmod: command not foundというエラーが発生するので次のコマンドを実行します。

apt install -y php-common

もう一度 phpenmod sqlsrv pdo_sqlsrv を実行します。

php.iniファイルへ追記する

php.iniファイルの[Pdo]の下に以下を追記して保存します。

[Pdo]
extension=pdo_sqlsrv.so
extension=sqlsrv.so

コンテナを再起動します。docker compose down と up を行います。

すると下記エラーが表示されます。

SQLSTATE[HY000]: [Microsoft][ODBC Driver 18 for SQL Server]Protocol error in TDS stream

下記で対応します

my-project/config/database.phpを編集する

'connections' => [

        'sqlite' => [
            //省略
        ],

        'mysql' => [
            //省略
        ],

        'pgsql' => [
            //省略
        ],

        'sqlsrv' => [
            'driver' => 'sqlsrv',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST_SECOND', '192.168.0.100'),  //SQL ServerのIPアドレス
            'port' => env('DB_HOST_SECOND', '1433'),  //SQL Serverのポート番号に合わせる
            'database' => env('DB_HOST_SECOND', 'my_dbname'), // 編集
            'username' => env('DB_HOST_SECOND', 'my_user_name'), // 編集
            'password' => env('DB_HOST_SECOND', 'my_password'),  // 編集
            'charset' => 'utf8',
            'prefix' => '',
            'prefix_indexes' => true,
            // 'encrypt' => env('DB_ENCRYPT', 'yes'),
            // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'),
        ],

.envファイルを編集します。DB_HOST_SECONDで設定します

DB_CONNECTION_SECOND=sqlsrv
DB_HOST_SECOND=192.168.0.100
DB_PORT_SECOND=1433
DB_DATABASE_SECOND=my_dbname
DB_USERNAME_SECOND=my_user_name
DB_PASSWORD_SECOND=my_password

database.phpと.envファイルの変数名と変数を一致させます。

もう一度トップページに接続します。

また、エラーが発生しました。

SQLSTATE[08001]: [Microsoft][ODBC Driver 18 for SQL Server]SSL Provider: [error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed:self signed certificate]

下記で対応します

my-project/config/database.phpに追記します

'connections' => [

        'sqlite' => [
            //省略
        ],

        'mysql' => [
            //省略
        ],

        'pgsql' => [
            //省略
        ],

        'sqlsrv' => [
            'driver' => 'sqlsrv',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST_SECOND', '192.168.0.100'),
            'port' => env('DB_HOST_SECOND', '1433'),
            'database' => env('DB_HOST_SECOND', 'my_dbname'),
            'username' => env('DB_HOST_SECOND', 'my_user_name'),
            'password' => env('DB_HOST_SECOND', 'my_password'), 
            'charset' => 'utf8',
            'prefix' => '',
            'prefix_indexes' => true,
            'trust_server_certificate' => 'true', //追記
        ],

SSLプロバイダーエラーを調べると上記の一文を追記でOKでした。

再度トップページを表示します。

PDO {#281 ▼ // routes/web.php:9
  inTransaction: false
  attributes: {▶}
}

無事にSQL Serverに接続できていることが確認できました。

長くなったので別記事に一発でできるようにまとめました。

ITスキルを磨きたいなら、Tech Academyがおすすめです。今すぐこちらからチェックして、あなたのスキルを次のレベルへと引き上げましょう!

コメント