0. 前置き
AlmaLinux 10 と LXC で Microsoft SQL Server 2025 Express を動作させます。
最初は RHEL 10 用のリポジトリを使用したインストールを記述しましたが、直近 2 週間の間に Microsoft がリポジトリを変更したらしく、
RHEL 10 用のリポジトリで 2025 Express を選択できなくなってしまいました。
なので RHEL 9 用のリポジトリで 2025 Express をインストールします。(Preview/Evaluation 版にある 180 日間の制限はありません)
本稿は、以下のドキュメントに沿っています。
動作環境: マイクロソフトのシステム要件はここ。
項目 内容 備考 コンテナ OS (LXC) AlmaLinux release 10.1 (Heliotrope Lion) 本稿記述時の最新版 ホスト名 express - IP アドレス 10.0.3.11 - 管理者パスワード Password123 管理者 sa 用のパスワード
この文字列をこのまま使わないように
パスワードのルールを参照することホスト OS AlmaLinux release 10.1 (Heliotrope Lion) 本稿記述時の最新版 vCPU 4 - RAM 4GB MS SQL Server だけなら 2GB
Linux が動作するために 0.5GB 程度必要ストレージ 20GB OS + MS SQL Server Express なら 6.5GB
データベース等の作業領域として余裕を持たせたIP アドレス 192.168.11.111 -
1. コンテナを作成する。
ここを参考に以下の条件でコンテナを作成する。
OS AlmaLinux --release 10 --arch amd64 ホスト名 express IP アドレス 10.0.3.11
2. MS SQL Server 2025 Express のインストール
2-1. 日本語環境を整える。(これをしないと setup で日本語が表示されない)
$ ssh admin@10.0.3.112-2. MS SQL Server 本体をインストールする。(10 だけど RHEL9 のリポジトリ)
express$ su
express# dnf install -y glibc-langpack-ja
express# localectl list-locales | grep ja
express# export LANG=ja_JP.UTF-8 ; export LC_ALL=ja_JP.UTF-8
ja_JP.UTF-8
express# curl -o /etc/yum.repos.d/mssql-server.repo \2-3. MS SQL Server 本体を有効にする。(Express を選択する)
https://packages.microsoft.com/config/rhel/9/mssql-server-preview.repo
express# dnf install -y mssql-server
混雑のせいか、ダウンロードに時間がかかる。(90 分間ぐらい)express# systemctl status mssql-server | grep Active:
…省略… +--------------------------------------------------------------+ 'sudo /opt/mssql/bin/mssql-conf setup' を実行し、 Microsoft SQL Server のセットアップを完了してください +--------------------------------------------------------------+ …省略… 完了しました!
この時点でサービス登録までされている。(setup 前なので inactive)express# ls -ogh /opt/mssql/lib/mssql-conf/mssql-conf.py
Active: inactive (dead)
設定ソフト。
-rwxrwxr-x. 1 26K 9月 10 14:33 /opt/mssql/lib/mssql-conf/mssql-conf.py
express# /opt/mssql/bin/mssql-conf setup2-4. 起動チェックをする。
SQL Server のエディションを選択します: 1) Evaluation (無料、製品使用権なし、期限 180 日間) 2) Enterprise Developer (無料、製品使用権なし) 3) Standard Developer (無料、製品使用権なし) 4) Express (無料) ← これを選択する 5) Web (有料) 6) Standard (有料) 7) Enterprise (有料) - CPU core utilization restricted to 20 physical/40 hyperthreaded 8) Enterprise Core (有料) - CPU core utilization up to Operating System Maximum 9) 小売販売チャネルを介してライセンスを購入し、入力するプロダクト キーを持っています。 10) Standard (Billed through Azure) - Use pay-as-you-go billing through Azure. 11) Enterprise Core (Billed through Azure) - Use pay-as-you-go billing through Azure. エディションの詳細については、以下を参照してください https://go.microsoft.com/fwlink/?LinkId=2109348&clcid=0x411 このソフトウェアの有料エディションを使用するには、個別のライセンスを以下から取得する必要があります Microsoft ボリューム ライセンス プログラム。 有料エディションを選択することは、 このソフトウェアをインストールおよび実行するための適切な数のライセンスがあることを確認していることになります。 By choosing an edition billed Pay-As-You-Go through Azure, you are verifying that the server and SQL Server will be connected to Azure by installing the management agent and Azure extension for SQL Server. エディションを入力してください(1-10): 4 ⏎ この製品のライセンス条項は /usr/share/doc/mssql-server or downloaded from: https://aka.ms/useterms プライバシーに関する声明は、次の場所で確認できます: https://go.microsoft.com/fwlink/?LinkId=853010&clcid=0x411 ライセンス条項に同意しますか? [Yes/No]:y ⏎ SQL Server の言語の選択: (1) English (2) Deutsch (3) Español (4) Français (5) Italiano (6) 日本語 (7) 한국어 (8) Português (9) Руѝѝкий (10) 中文 – 简体 (11) 中文 (繝体) オプション 1-11 を入力: 6 ⏎ SQL Server システム管理者パスワードを入力してください: Password123 ⏎ ← 実際は表示されない SQL Server システム管理者パスワードを確認入力してください: Password123 ⏎ SQL Server を構成しています... ライセンス PID は正常に処理されました。新しいエディションは [Express Edition] です。 …省略… セットアップは正常に完了しました。SQL Server を起動しています。
express# systemctl status mssql-server | grep Active:
active が表示されること。express# exit
Active: active (running) since Wed 2025-12-10 17:39:41 JST; 3min 45s ago
express$ exit
$
3. ファイアウォールの調整
TDS はポート 1433 が標準。
$ ssh admin@10.0.3.11
express$ su
express# firewall-cmd --zone=public --add-port=1433/tcp --permanent
express# firewall-cmd --reload
express# firewall-cmd --list-ports
express# exitポート 1433 が許可された。
1433/tcp
express$ exit
$ exit
4. コマンドラインツールのインストール
4-1. リポジトリを登録する。(公式: リポジトリは 9 のものを使用する)
Microsoft の案内に従うとパスワード入力のプロンプトが表示されず、先に進めなくなる。4-2. 旧 mssql-tools を削除する。
これを回避するため sudo ではなく su してから実施する。
$ ssh admin@10.0.3.11
express$ su
express# export LANG=ja_JP.UTF-8 ; export LC_ALL=ja_JP.UTF-8
express# curl https://packages.microsoft.com/config/rhel/9/prod.repo \
| sudo tee /etc/yum.repos.d/mssql-release.repo
express# dnf remove mssql-tools unixODBC-utf16 unixODBC-utf16-devel4-3. mssql-tools18 と ODBC 開発者パッケージをインストールする。
インストールされていないのでエラーが表示される。
引数に一致する結果がありません: mssql-tools 引数に一致する結果がありません: unixODBC-utf16 引数に一致する結果がありません: unixODBC-utf16-devel 削除対象のパッケージはありません。 依存関係が解決しました。 行うべきことはありません。 完了しました!
express# dnf install -y mssql-tools18 unixODBC-devel4-4. アップデートをチェックする。
…省略… The license terms for this product can be downloaded from https://aka.ms/odbc18eula and found in /usr/share/doc/msodbcsql18/LICENSE.txt . By entering 'YES', you indicate that you accept the license terms. Do you accept the license terms? (Enter YES or NO) yes ⏎ ←「y」は不可 インストール中 : msodbcsql18-18.6.1.1-1.x86_64 2/4 …省略… The license terms for this product can be downloaded from http://go.microsoft.com/fwlink/?LinkId=746949 and found in /usr/share/doc/mssql-tools18/LICENSE.txt . By entering 'YES', you indicate that you accept the license terms. Do you accept the license terms? (Enter YES or NO) yes ⏎ ←「y」は不可 インストール中 : mssql-tools18-18.6.1.1-1.x86_64 3/4 …省略… 完了しました!
express# dnf check-update
express# dnf update mssql-tools18
express# exit
express$ exit
$
5. コマンドラインツールの使用準備と確認
5-1. 実行パスを設定する。
$ ssh admin@10.0.3.115-2. 接続を確認する。
express$ echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bash_profile
express$ source ~/.bash_profile
express$ sqlcmd -S localhost,1433 -U sa -P 'Password123' -No
(Microsoft の注意書き Note に従ってオプション -No を付加している)
express$ exitヒアドキュメントで書きたいけど「クイック スタート: データの作成とクエリ」に倣うとこうなる。
CREATE DATABASE TestDB;
SELECT Name FROM sys.databases;
GO
USE TestDB;
CREATE TABLE dbo.Inventory ( id INT, name NVARCHAR (50), quantity INT, PRIMARY KEY (id) );
INSERT INTO dbo.Inventory VALUES (1, 'banana', 150); INSERT INTO dbo.Inventory VALUES (2, 'orange', 154);
GO
SELECT * FROM dbo.Inventory WHERE quantity > 152;
GO
QUIT
$
接続の暗号化オプションについて:
Note sqlcmd の新しいバージョンは、既定でセキュリティで保護されています。
重要 これは、SQL Server 2022 (16.x) 以前のバージョンからの破壊的変更です。
sqlcmd v18.4 は標準で TLS 暗号化と証明書の検証を行う。(v17 から)
証明書が意味を持たない localhost や LAN 接続ではこれらが邪魔になるため、以下いずれかのオプションが必要になる。
オプション TLS 暗号化 証明書の検証 -No なし しない -Nm あり 発行元が不要 -Ns あり 発行元が必要 -C あり しない
環境変数では指定できない。Alias を定義しておくと吉。
express$ echo "alias sqlcmd='sqlcmd -No -C'" >> ~/.bash_profile
express$ source ~/.bash_profile
おまけ (暗号化を確認する SQL)
express$ sqlcmd -S localhost,1433 -U sa -P 'Password123' -Nm -C << EOF SET NOCOUNT ON; SELECT s.session_id, c.encrypt_option FROM sys.dm_exec_sessions AS s INNER JOIN sys.dm_exec_connections AS c ON s.session_id = c.session_id WHERE s.session_id = @@SPID; EOFオプション -Nm -C を指定しているので暗号化は TRUE になる。
session_id encrypt_option ---------- ------------------------------ 67 TRUE
6. ポート転送の設定
親 OS から LXC へポート転送する。(親:1433 → LXC:1433)
$ su
# firewall-cmd --permanent --add-forward-port=port=1433:proto=tcp:toport=1433:toaddr=10.0.3.11
# firewall-cmd --reload
# firewall-cmd --list-forward-ports
# exit
port=1433:proto=tcp:toport=1433:toaddr=10.0.3.11
$
7. Windows PC から接続
7-1. ターミナルから接続する。
7-2. DBeaver 25.3.0 と SSMS 22.1 で接続する。新しいバージョンの sqlcmd はオプション -No または -C が必要。
− □ × >_ Windows PowerShell × + | ∨
Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved. 新機能と改善のために最新の PowerShell をインストールしてください!https://aka.ms/PSWindows PS C:\> sqlcmd -S 192.168.11.111,1433 -U sa -P "Password123" -h -1 -No -Q "SELECT @@VERSION" ⏎ Microsoft SQL Server 2025 (RC1) - 17.0.925.4 (X64) Sep 9 2025 17:31:28 Copyright (C) 2025 Microsoft Corporation Express Edition (64-bit) on Linux (AlmaLinux 10.1 (Heliotrope Lion)) <X64> (1 行処理されました) PS C:\> sqlcmd -S 192.168.11.111,1433 -U sa -P "Password123" -d TestDB -No -Q "SELECT * FROM dbo.Inventory" ⏎ id name quantity ----------- -------------------------------------------------- ----------- 1 banana 150 2 orange 154 (2 行処理されました) PS C:\> exit ⏎
Windows 版 DBeaver 25.3.0 の画面
SSMS 22.1 の画面
上記 5-2 で作成したデータベース TestDB に SSMS 18.12.1 から接続すると、なぜかテーブルの値を取得できない。