# 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 年の最新ドライバーになりますが、下記リンクから古いドライバーインストール方法があります。
- Microsoft ODBC driver 17 for SQL Server (opens new window)
- Microsoft ODBC driver 13.1 for SQL Server (opens new window) - Microsoft ODBC driver 13 for SQL Server (opens new window)
- Microsoft ODBC driver 11 for SQL Server (opens new window)
# 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