日程Fit|「いつ空いてますか?」の往復はもう不要。候補日を選んでURLを送るだけ|登録不要|今すぐ無料で使う →

Azure SQL開発で使うSQL Server Docker Linuxコンテナーの変更点と確認事項

Azure SQLやSQL Server系アプリの開発・検証でDockerを使っている場合、まず確認すべきポイントは「起動コマンド」だけではありません。実行できるホスト環境、使用するコンテナーイメージのタグ、SA_PASSWORDからMSSQL_SA_PASSWORDへの移行、mssql-tools18へのパス変更、データ永続化、ライセンス指定まで見直す必要があります。

今回の公式情報は、Azure SQL Databaseそのもののサービス変更ではなく、SQL Server on LinuxのDockerコンテナーを使うためのクイックスタートと周辺運用に関する内容です。Azure SQL Database向けの開発・移行検証でSQL Serverコンテナーを使う場合は、ローカル検証環境として便利な一方、Azure SQL DatabaseとSQL ServerにはT-SQLやインスタンスレベル機能の差異があるため、本番反映前にAzure側での検証も必要です。(Microsoft Learn)

日程Fit。無料・登録不要。「いつ空いてる?」を、ひとつのリンクで。リンクを送って、○△×でかんたん日程調整。無料で日程を作る。
目次

Azure SQL利用者にとっての位置づけ

「Docker: Run Containers for SQL Server on Linux」は、DockerでSQL Server Linuxコンテナーイメージを取得し、起動し、sqlcmdで接続するためのクイックスタートです。対象はMicrosoft Learn上で「SQL Server on Linux」とされており、Azure SQL Databaseの設定変更やAzureポータルの新機能ではありません。(Microsoft Learn)

ただし、Azure SQLを使う開発者にとって無関係ではありません。たとえば、次のような場面でSQL Server Dockerコンテナーは役立ちます。

活用シーン使いどころ注意点
ローカル開発アプリからSQL接続、テーブル作成、基本的なT-SQL実行を素早く試すAzure SQL Databaseの完全な再現環境ではない
CI/CDのテストGitHub Actionsなどで一時的なDBを起動し、マイグレーションや統合テストを実行するlatestタグ任せにせず、検証済みタグを固定する
移行前の整理SQL Server系スキーマやアプリの動作確認を行うAzure SQL Databaseで非対応のT-SQL構文は別途確認する
チーム共通環境Dockerコマンドで同じDB環境を再現するボリューム、パスワード、ポート番号を標準化する

Azure SQL Databaseでは多くのT-SQL機能がSQL Serverと同様に動作しますが、インスタンスレベルの機能、OSやファイルシステムに依存する構成、高可用性関連の一部構文などは異なります。Docker上で動いたからといって、Azure SQL Databaseでそのまま動くとは限りません。(Microsoft Learn)

何が変わるのか:押さえるべき主な変更点

今回の確認ポイントは、新しい派手な機能追加というより、既存のDocker運用で見落としやすい前提条件と非推奨設定の整理です。特に、古いサンプルコマンドを社内WikiやCI設定に貼ったまま使っている場合は注意が必要です。

確認項目現在のポイント影響を受けやすい人
対象バージョンSQL Server 2017、2019、2022、2025のLinuxコンテナー手順が整理されている複数バージョンを検証する開発チーム
実行ホストSQL Serverコンテナーイメージは、Intel/AMD x86-64 CPU上のLinuxホストでの利用が前提Apple Silicon、Arm環境、エミュレーション環境の利用者
パスワード環境変数SA_PASSWORDは非推奨。MSSQL_SA_PASSWORDを使う古いDockerコマンドやCI定義を使っている人
mssql-tools18SQL Server 2022 CU14、SQL Server 2019 CU28以降のコンテナーイメージでは新しいmssql-tools18パッケージが含まれるsqlcmdのパスを固定しているスクリプト
データ永続化コンテナーを停止・削除すると、コンテナー内のデータが失われる可能性があるテストDBを残したい開発者、検証環境管理者
ライセンス指定クイックスタートの既定はDeveloper Edition。運用エディションではMSSQL_PIDと有効なライセンス確認が必要本番・準本番でコンテナーを使う管理者
sqlcmdの暗号化新しいsqlcmdはセキュアな接続を既定にするため、検証環境で接続オプションの調整が必要になる場合がある接続エラーを切り分ける開発者

Microsoft Learnでは、SQL ServerコンテナーイメージがLinux上のDocker Engine 1.8以降で使用できること、SA_PASSWORDではなくMSSQL_SA_PASSWORDを使うこと、mssql-tools18の新しいパスが/opt/mssql-tools18/binであることが示されています。(Microsoft Learn)

管理者・開発者が最初に確認すべき設定

DockerでSQL Serverを起動できるかどうかよりも、継続的に安全に使える設定になっているかを確認してください。特にAzure SQLへの移行検証やチーム開発で使う場合、個人PCで一度動いた設定をそのまま共有すると、後から接続エラーやデータ消失が起きやすくなります。

確認項目推奨される判断基準確認方法の例
イメージタグ本番・CIではlatest任せにせず、検証済みタグを使うdocker pull mcr.microsoft.com/mssql/server:<image_tag>
CPU/ホストサポート対象のLinuxホスト、Intel/AMD x86-64 CPUで動かすホストOS、CPUアーキテクチャを確認
パスワード8文字以上かつ大文字・小文字・数字・記号のうち3種類以上を含めるコンテナー起動後にdocker logsを確認
ポートローカルSQL Serverや別コンテナーと1433番が競合しないようにする-p 1400:1433のようにホスト側ポートを変更
永続化/var/opt/mssqlまたはdata/log/secretsをボリュームに保存するdocker volume ls、ホスト側ディレクトリを確認
sqlcmdパス古い/opt/mssql-tools/bin固定を避ける/opt/mssql-tools18/bin/sqlcmdを使う
ライセンスDeveloper Editionを本番用途に使わないMSSQL_PIDとライセンス条件を確認

SQL Serverコンテナーの前提条件には、Docker Engine、overlay2ストレージドライバー、最新のsqlcmd、少なくとも2GBのディスク領域と2GBのRAMが含まれます。メモリ不足やパスワードポリシー違反は、コンテナーがすぐ終了する典型的な原因です。(Microsoft Learn)

最小構成でSQL Server Linuxコンテナーを起動する

開発検証でまず動作を確認するなら、以下のような最小構成から始めます。SQL Server 2025を試す場合の例です。既存システムがSQL Server 2022相当で動いているなら、検証対象に合わせて2022-latestや特定CUのタグに変更してください。

docker pull mcr.microsoft.com/mssql/server:2025-latest

docker run -e "ACCEPT_EULA=Y" \
  -e "MSSQL_SA_PASSWORD=<強力なパスワード>" \
  -p 1433:1433 \
  --name sql1 \
  --hostname sql1 \
  -d mcr.microsoft.com/mssql/server:2025-latest

起動後は、コンテナーの状態とログを確認します。

docker ps -a
docker logs sql1

STATUSUpで、SQL Serverのエラーログに接続可能になったことを示すメッセージが出ていれば、接続準備はできています。公式手順でも、docker ps -aSTATUS列とSQL Serverエラーログを確認する流れが示されています。(Microsoft Learn)

コンテナー内からsqlcmdで接続する場合は、mssql-tools18のパスを意識します。

docker exec -it sql1 /opt/mssql-tools18/bin/sqlcmd \
  -S localhost \
  -U sa \
  -P "<強力なパスワード>" \
  -Q "SELECT @@VERSION"

古い手順では/opt/mssql-tools/bin/sqlcmdが使われていることがあります。今後のスクリプト更新では、/opt/mssql-tools18/binを前提に見直すのが安全です。(Microsoft Learn)

データを失わないための永続化設計

SQL Server Dockerコンテナーで最も多い失敗は、「テストデータを入れたあとにコンテナーを削除してしまい、DBが消えた」というものです。docker stopdocker startで再起動するだけならコンテナー内のデータは残りますが、docker rmでコンテナーを削除すると、コンテナー内のSQL Serverやデータベースも削除されます。(Microsoft Learn)

開発環境でも、チームで使うなら最初からボリュームを使いましょう。

docker volume create sqlvolume

docker run -e "ACCEPT_EULA=Y" \
  -e "MSSQL_SA_PASSWORD=<強力なパスワード>" \
  -p 1433:1433 \
  --name sql1 \
  --hostname sql1 \
  -v sqlvolume:/var/opt/mssql \
  -d mcr.microsoft.com/mssql/server:2025-latest

より運用に近い形で分けるなら、data、log、secretsを個別にマウントします。

docker run -e "ACCEPT_EULA=Y" \
  -e "MSSQL_SA_PASSWORD=<強力なパスワード>" \
  -p 1433:1433 \
  --name sql1 \
  --hostname sql1 \
  -v /path/to/mssql/data:/var/opt/mssql/data \
  -v /path/to/mssql/log:/var/opt/mssql/log \
  -v /path/to/mssql/secrets:/var/opt/mssql/secrets \
  -d mcr.microsoft.com/mssql/server:2025-latest

/var/opt/mssql/secretsには証明書やキーなど重要なファイルが置かれる場合があります。ホスト側にマウントする場合は、mssqlユーザーやrootユーザー以外が不用意にアクセスできないよう、権限設計を確認してください。(Microsoft Learn)

Azure SQLへの移行・展開で注意すべき点

SQL ServerコンテナーはAzure SQL Databaseの完全な代替ではない

SQL Serverコンテナーは、T-SQLや接続処理、アプリケーションのDB依存部分を素早く検証するには有効です。一方で、Azure SQL DatabaseはPaaSとして高可用性やファイル管理などをサービス側で担うため、SQL Serverとは一部構文や機能が異なります。(Microsoft Learn)

特に、次のような要素を使っている場合はAzure SQL Databaseでの互換性確認が必要です。

確認対象Docker上のSQL Serverで動いても注意すべき理由
CREATE DATABASEALTER DATABASEの詳細オプションSQL Server固有のファイル配置やサービス設定がAzure SQL Databaseでは異なる
SQL Server Agent依存の処理Azure SQL Databaseでは同じ前提で使えない
FILESTREAM、FileTableAzure SQL Databaseではサポートされない機能に該当する
Always On関連構文Azure SQL Databaseでは高可用性がサービス側で管理される
サーバーレベル権限、ログイン、トリガーデータベースレベルの設計に置き換える必要がある場合がある

ローカルのSQL Serverコンテナーで通ったマイグレーションSQLを、そのままAzure SQL Databaseに流すのではなく、Azure SQL Database向けの構文差分チェックを必ず挟んでください。

本番利用ではDeveloper Editionのままにしない

クイックスタートの既定ではDeveloper Editionのコンテナーが作成されます。開発・検証用途なら便利ですが、本番用途でEnterprise、Standardなどのエディションを使う場合は、有効なライセンスを確認し、MSSQL_PIDでエディションを指定する必要があります。(Microsoft Learn)

例として、Enterprise Coreを指定する場合は次のようになります。

docker run --name sqlenterprise \
  -e "ACCEPT_EULA=Y" \
  -e "MSSQL_SA_PASSWORD=<強力なパスワード>" \
  -e "MSSQL_PID=EnterpriseCore" \
  -p 1433:1433 \
  -d mcr.microsoft.com/mssql/server:2022-latest

注意したいのは、sqlcmd create mssqlによる作成手順では、現時点でMSSQL_PIDパラメーターがサポートされない点です。任意のライセンスでコンテナーを作成したい場合は、CLIのdocker run手順で明示的に指定します。(Microsoft Learn)

アップグレードは「実行中コンテナーを更新」ではなく「新しいコンテナーへ移す」

Dockerで新しいイメージをpullしても、実行中のSQL Serverコンテナー自体が自動的に更新されるわけではありません。新しいイメージを使って別コンテナーを作成し、永続化されたデータやバックアップを使って移行・検証する流れになります。(Microsoft Learn)

実務では、次の順序にすると失敗しにくくなります。

手順作業内容失敗しやすいポイント
現行確認現在のイメージタグ、SQL Serverバージョン、ボリューム名を記録するlatestだけで管理していて実体が分からない
バックアップDBバックアップをコンテナー外に保存するバックアップファイルまでコンテナー内に置いて削除してしまう
新イメージ取得対象のタグを指定してdocker pullする本番相当で未検証のタグを使う
新コンテナー作成永続化ボリュームまたは復元用バックアップを使って起動する古いsaパスワードがボリューム側に残っている
検証接続、クエリ、アプリ連携、Azure SQL差分を確認するDocker上の成功だけでAzure SQL対応済みと判断する
切り替え名前、ポート、接続文字列を整理する旧コンテナーを削除してから不備に気付く

既存ボリュームを再利用する場合、MSSQL_SA_PASSWORDを変えても、ボリューム内に保存済みのsaパスワードが使われます。接続できないときは、新しい環境変数ではなく、既存データに紐づくパスワードを確認してください。(Microsoft Learn)

よくあるトラブルと切り分け

SQL Server Dockerコンテナーは起動が簡単な反面、エラーの原因がDocker、SQL Server、接続ツール、ポート、認証のどこにあるのか分かりにくいことがあります。まずは以下の表で切り分けます。

症状主な原因確認・対応
コンテナーがすぐExitedになるパスワードポリシー違反、メモリ不足、起動時エラーdocker logs sql1でエラーログを確認
1433が使えないホスト側でSQL Serverや別コンテナーが同じポートを使用中-p 1400:1433のようにホスト側ポートを変更
Dockerコマンドが権限エラーになるDockerデーモンへのアクセス権がないLinuxではsudo実行やdockerグループ設定を確認
sqlcmdで接続できないコンテナー未起動、ポート指定漏れ、暗号化設定docker ps -aPORTS列、接続先ポートを確認
ボリューム再利用後にログインできない既存データ側のsaパスワードが使われている新しい環境変数ではなく、ボリューム作成時のパスワードを使う
可用性グループ検証で通信できないレプリカ通信用ポート未公開、ホスト名未設定-p 5022:5022と明示的なホスト名を確認

公式トラブルシューティングでは、Dockerサービスの状態、docker logsdocker ps -a、ポートマッピング、SQL Serverの/var/opt/mssql/log配下のログ確認が推奨されています。(Microsoft Learn)

セキュリティ面で見直すべきポイント

SQL Server 2019以降のコンテナーは非rootで起動しますが、SQL Server 2017コンテナーは既定でrootとして起動します。古い検証環境を使い続けている場合は、非root実行や権限設定を見直してください。(Microsoft Learn)

特に、次の3点はチーム開発でも本番相当検証でも重要です。

項目実務上の注意
saパスワード環境変数に平文で残るため、運用環境では起動後の変更やシークレット管理を検討する
永続化ディレクトリdata、log、secretsの権限を分け、不要なユーザーが読めないようにする
接続暗号化ローカル検証で接続を緩める場合も、本番では証明書と暗号化方針を別途設計する

MSSQL_SA_PASSWORDps -eax出力や環境変数として見える可能性があるため、実稼働環境では起動後にSAパスワードを変更することも公式手順で触れられています。(Microsoft Learn)

次に取るべき行動

Azure SQLやSQL Server系アプリでDockerを使っているなら、まず既存のDockerコマンド、CI設定、社内手順書を確認してください。見るべき箇所は明確です。

  • SA_PASSWORDを使っている場合は、MSSQL_SA_PASSWORDへ置き換える
  • /opt/mssql-tools/bin/sqlcmdを固定している場合は、/opt/mssql-tools18/bin/sqlcmdへの変更を検討する
  • latestタグだけで運用している場合は、検証済みの具体的なタグを使う
  • docker rmでデータが消えないよう、ボリュームとバックアップを用意する
  • Azure SQL Databaseへ移行・展開する場合は、T-SQL差分とAzure側の本番検証を必ず行う

Docker上のSQL Serverは、Azure SQL開発の初期検証を速くする強力な選択肢です。ただし、使い方を誤ると、データ消失、接続エラー、ライセンス不備、Azure SQLとの差分見落としにつながります。まずは起動コマンドを最新化し、永続化とタグ固定を標準化し、そのうえでAzure SQL Database上の最終検証へ進めるのが安全です。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次