# Sail で Docker 環境構築 Laravel SQL Server

Laravel の開発が多いですが、Mysql ではなくマイクロソフト SQL サーバー DB に繋いで作業する仕事がありました。
MSSQL とは Microsoft SQL、マイクロソフトが開発したリレーションデータベースサーバーのことで、略称は SQL Server または MSSQL です。
2021 年の調査結果になりますが、DBMS Market Transformation 2021: The Big Picture (opens new window) によりますと、シェアの 1 位はマイクロソフト、2 位 AWS、オラクル が 3 位になります。2020 から 2 年連続トップの MSSQL を挑戦しました。

スクリプトを実行して、pdo_sqlsrv を展開

# Ubuntu に MSSQL インストール

Ubuntu にインストールする手順(Root 権限が必要)

# PHP インストール
add-apt-repository ppa:ondrej/php -y
apt update
apt install php8.1 php8.1-dev php8.1-xml -y --allow-unauthenticated

# pecl コマンドをインストール
apt update
apt install -y php-pear


# ODBC ドライバーインストール
curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
curl https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list > /etc/apt/sources.list.d/mssql-release.list
apt update
ACCEPT_EULA=Y apt install -y msodbcsql18
# bcp & sqlcmd コマンド
sudo ACCEPT_EULA=Y apt install -y mssql-tools18
echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc
. ~/.bashrc

# unixodbc-devパッケージ for unixODBC development headersインストール
apt install unixodbc-dev

#   Microsoft SQL Server PHP ドライバーをインストール
pecl install sqlsrv
pecl install pdo_sqlsrv
printf "; priority=20\nextension=sqlsrv.so\n" > /etc/php/8.1/mods-available/sqlsrv.ini
printf "; priority=30\nextension=pdo_sqlsrv.so\n" > /etc/php/8.1/mods-available/pdo_sqlsrv.ini
phpenmod -v 8.1 sqlsrv pdo_sqlsrv

# apache に設定有効化する
apt install libapache2-mod-php8.1 apache2
a2dismod mpm_event
a2enmod mpm_prefork
a2enmod php8.1

# 必要に応じてApache再起動
service apache2 restart

# 古い ODBC driver について

ODBC driver 18 が 2022 年の最新ドライバーになりますが、下記リンクから古いドライバーインストール方法があります。

# Laravel docker-compose.yml ファイル編集

Laravel sail 使うために、docker-compose の yaml ファイルを編集

構成として

  • PHP 8.1 Laravel
  • MSSQL DB server 2022
# For more information: https://laravel.com/docs/sailversion: '3'
services:
  laravel.test:
    build:
      context: ./docker
      dockerfile: Dockerfile
      args:
        WWWGROUP: "${WWWGROUP}"
    image: sail-8.1/app
    extra_hosts:
      - "host.docker.internal:host-gateway"
    ports:
      - "${APP_PORT:-80}:80"
      - "${VITE_PORT:-5173}:${VITE_PORT:-5173}"
    environment:
      WWWUSER: "${WWWUSER}"
      LARAVEL_SAIL: 1
      XDEBUG_MODE: "${SAIL_XDEBUG_MODE:-off}"
      XDEBUG_CONFIG: "${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}"
    volumes:
      - ".:/var/www/html"
    networks:
      - sail
    depends_on:
      - mssql
  mssql:
    image: "mcr.microsoft.com/mssql/server:2022-latest"
    restart: always
    ports:
      - "${FORWARD_DB_PORT:-1433}:1433"
    environment:
      ID: "sa"
      ACCEPT_EULA: "Y"
      MSSQL_PID: "Developer"
      MSSQL_SA_PASSWORD: "${DB_PASSWORD}"
    volumes:
      - ./docker/mssql/data:/var/opt/mssql/data
      - ./docker/mssql/log:/var/opt/mssql/log
      - ./docker/mssql/secrets:/var/opt/mssql/sec
    networks:
      - sail
networks:
  sail:
    driver: bridge
volumes:
  sail-mssql:
    driver: local

# Dockerfile 編集

Sail で使われている Dockerfile をベースに Ubuntu の MSSQL インストール手順を入れます。
php.ini に設定追加して完成

COPY sqlsrv.ini /etc/php/8.1/mods-available/sqlsrv.ini
COPY pdo_sqlsrv.ini /etc/php/8.1/mods-available/pdo_sqlsrv.ini

# PHP extension に sqlsrv と pdo_sqlsrv の設定追加

sqlsrv.ini

; priority=20
extension=sqlsrv.so

pdo_sqlsrv.ini

; priority=30
extension=pdo_sqlsrv.so

# 試行錯誤の中にハマったエラーたち

インストールにエラーいっぱい起こしました、しかも関連ドキュメントが少ないので、苦労しました。

# mssql ディレクトリ作成できない

エラーメッセージ忘れましたが、mssql ディレクトリ作成できないと言われて mkdir コマンドを Dockerfile に追加して解消しました。

RUN mkdir -p -m 770 /var/opt/mssql && chgrp -R 0 /var/opt/mssql

# Command line option --allow-unauthenticatedadd-apt-repository is not understood in combination with the other options

add-apt-repository ppa:ondrej/php -y インストール時エラー

# add-apt-repository ppa:ondrej/php -y
E: Command line option --allow-unauthenticatedadd-apt-repository is not understood in combination with the other options

add-apt-repository コマンドがないといってますね

インストール

apt install software-properties-common

これで、add-apt-repository が使えるようになります。

apt updateをしてから add-apt-repository 使う

# Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80

netstat: command not found

apt install net-tools
# netstat -tulpn | grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      -
# service --status-all
 [ - ]  apache-htcacheclean
 [ - ]  apache2
 [ - ]  dbus
 [ ? ]  hwclock.sh
 [ - ]  procps
 [ + ]  supervisor
 [ - ]  unattended-upgrades

# ERROR: `make' failed

/tmp/pear/temp/sqlsrv/shared/xplat.h:30:10: fatal error: sql.h: No such file or directory
   30 | #include <sql.h>
      |          ^~~~~~~
compilation terminated.
make: *** [Makefile:208: conn.lo] Error 1
ERROR: `make' failed

対策

apt install -y unixodbc-dev

# source: not found

/bin/sh: 1: source: not found

ubuntu の/bin/sh には source コマンドがありません

. ~/.bashrc

# mssql 2022 The system directory [/.system] could not be created

権限周りディレクトリ作成失敗

docker-compose.yml に MSSQL データとログなどを外だしして保存するために、volumes 指定しましたが、Ubuntu の権限が必要でディレクトリ自動作成できません。
Ubuntu 側で権限変更して解消しました。

sudo chmod -R a+rwx docker/mssql

# 資料

Linux and macOS Installation Tutorial for the Microsoft Drivers for PHP for SQL Server (opens new window)

2022-09-26
  • mssql