SQL Server 2022をDockerコンテナで動かす

# What's？

SQL ServerはLinux上で動作し、またDockerイメージも提供されているようなのでちょっと試してみようかなということで。

https://learn.microsoft.com/ja-jp/sql/linux/sql-server-linux-overview?view=sql-server-ver16

https://learn.microsoft.com/ja-jp/sql/linux/quickstart-install-connect-docker?view=sql-server-ver16&tabs=cli&pivots=cs1-bash

# SQL Server on Linux

SQL Server 2017から、Linuxで動作するようになったようです。

> SQL Server 2017 (14.x) から、SQL Server は Linux で動作するようになりました。 これは同じ SQL Server データベース エンジンであり、オペレーティング システムに関係なく、多くの似た機能とサービスを備えています。

https://learn.microsoft.com/ja-jp/sql/linux/sql-server-linux-overview?view=sql-server-2017

現在のバージョンである、SQL Server 2022でサポートされているOSは以下の3種類のようです。

- Red Hat Enterprise Linux 8.x Server、または 9.x Server
- SUSE Linux Enterprise Server v15 (SP1 - SP4)
- Ubuntu 20.04、または 22.04

[SQL Server on Linux のインストール ガイド / サポートされているプラットフォーム](https://learn.microsoft.com/ja-jp/sql/linux/sql-server-linux-setup?view=sql-server-ver16#supportedplatforms)

RHEL、SUSE、Ubuntuへのインストール手順。

https://learn.microsoft.com/ja-jp/sql/linux/quickstart-install-connect-red-hat?view=sql-server-ver16&tabs=rhel8

https://learn.microsoft.com/ja-jp/sql/linux/quickstart-install-connect-suse?view=sql-server-ver16 

https://learn.microsoft.com/ja-jp/sql/linux/quickstart-install-connect-ubuntu?view=sql-server-ver16&tabs=ubuntu2004

これに加えて、Dockerイメージが利用できます。

FAQ。

https://learn.microsoft.com/ja-jp/sql/linux/sql-server-linux-faq?view=sql-server-ver16

SQL Server on Linuxではサポートされていない機能もあるようです。

[Linux 上の SQL Server 2022 (16.x) のエディションとサポートされる機能 / サポートされていない機能とサービス](https://learn.microsoft.com/ja-jp/sql/linux/sql-server-linux-editions-and-components-2022?view=sql-server-ver16#unsupported-features-and-services)

# Microsoft Container Registry上のSQL Serverイメージ

SQL ServerのDockerイメージを使う場合は、Microsoft Container Registryから取得するようです。

https://learn.microsoft.com/ja-jp/sql/linux/quickstart-install-connect-docker?view=sql-server-ver16&tabs=cli&pivots=cs1-bash

ベースイメージがRHELのもの、Ubuntu Linuxのものの2種があるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/a177bbc5-c370-4e7d-9ab0-fec27ee4e8fc.png)

https://mcr.microsoft.com/catalog?cat=Databases

ドキュメントでは、Ubuntu Linuxのものが使われていますね。

https://mcr.microsoft.com/en-us/product/mssql/server/tags

## タグについて

SQL Serverのバージョニングに馴染みがないのですが、タグを見るとCUやGDRといった表現があります。

`latest`タグを見ると、CUとGDRが含まれているものを指しているようですね。

こちらを見ると、CUは累積的な更新プログラム、GDRは一般配布リリースのようです。

https://learn.microsoft.com/ja-jp/troubleshoot/sql/releases/servicing-models-sql-server

そしてRTMという用語はRelease to Manufacturing（製造へのリリース）で、Service Packや修正プログラムが適用されていないバージョンのことを指すようです。

https://learn.microsoft.com/ja-jp/troubleshoot/sql/releases/faq-acronyms

というわけで、無難に選ぶならCUとGDRの両方を含んだものの方がよいのでしょう。

たとえばこちらですね。

`mcr.microsoft.com/mssql/server:2022-CU15-GDR1-ubuntu-22.04`

# 使ってみる

というわけで、あとは使ってみます。

https://learn.microsoft.com/ja-jp/sql/linux/quickstart-install-connect-docker?view=sql-server-ver16&tabs=cli&pivots=cs1-bash

今回の環境はこちら。

```shell
$ docker version
Client: Docker Engine - Community
 Version:           27.3.1
 API version:       1.47
 Go version:        go1.22.7
 Git commit:        ce12230
 Built:             Fri Sep 20 11:42:48 2024
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          27.3.1
  API version:      1.47 (minimum version 1.24)
  Go version:       go1.22.7
  Git commit:       41ca978
  Built:            Fri Sep 20 11:41:09 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.7.22
  GitCommit:        7f7fdf5fed64eb6a7caf99b3e12efcf9d60e311c
 runc:
  Version:          1.1.14
  GitCommit:        v1.1.14-0-g2c9f560
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
```

起動。

```shell
$ docker container run -it --rm --name sql-server \
  -e ACCEPT_EULA=Y \
  -e 'MSSQL_SA_PASSWORD=P@ssw0rd' \
  mcr.microsoft.com/mssql/server:2022-CU15-GDR1-ubuntu-22.04
```

設定はこちらを参照。

- [クイック スタート:Docker を使用して SQL Server Linux コンテナー イメージを実行する / コンテナーを実行する](https://learn.microsoft.com/ja-jp/sql/linux/quickstart-install-connect-docker?view=sql-server-ver16&tabs=cli&pivots=cs1-bash#run-the-container-2)
- [Microsoft SQL Server - Ubuntu based images / Configuration](https://mcr.microsoft.com/en-us/product/mssql/server/about#configuration)

別のターミナルから接続してみます。

コンテナの中に入ります。

```shell
$ docker container exec -it sql-server bash
```

`sqlcmd`でログインを試みます。`sa`はデフォルトのシステム管理者アカウントのようです。

```shell
$ /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa
Password:
Sqlcmd: Error: Microsoft ODBC Driver 18 for SQL Server : SSL Provider: [error:0A000086:SSL routines::certificate verify failed:self-signed certificate].
Sqlcmd: Error: Microsoft ODBC Driver 18 for SQL Server : Client unable to establish connection. For solutions related to encryption errors, see https://go.microsoft.com/fwlink/?linkid=2226722.
```

こちらにこんなことが書かれていました。自己署名証明書なので、SSL接続ができないようですね。

> sqlcmd の新しいバージョンは、既定でセキュリティで保護されています。 接続の暗号化の詳細については、Windows 用「sqlcmd ユーティリティ 」および Linux および macOS 用「sqlcmdを使用した接続」をご覧ください。 接続が成功しない場合は、-No オプションを sqlcmd に追加して、暗号化が必須ではなくオプションであることを指定できます。

[クイック スタート:Docker を使用して SQL Server Linux コンテナー イメージを実行する / システム管理者のパスワードを変更する](https://learn.microsoft.com/ja-jp/sql/linux/quickstart-install-connect-docker?view=sql-server-ver16&tabs=cli&pivots=cs1-bash#sapassword)

今回は`-No`オプションをつけて接続してみます。

```shell
$ /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -No
Password:
1>
```

今度は成功しました。

確認。

```sql
1> create database test;
2> go


1> use test;
2> go
Changed database context to 'test'.


1> create table pokemon(id int, name nvarchar(50), primary key(id));
2> go


1> insert into pokemon(id, name) values(1, 'pikachu');
2> go

(1 rows affected)


1> select * from pokemon;
2> go
id          name
----------- --------------------------------------------------
          1 pikachu

(1 rows affected)
```

今回はこんなところで。

```sql
1> exit
```