Ubuntu上のDockerにSQL Serverを構築する

Ubuntu上のDockerにSQL Serverを構築する

はじめに

本記事では、Ubuntu 上の Docker に SQL Server を構築して使用する方法をまとめています。

Ubuntu が搭載されている PC ですが、ASUS のZENBOOK UX21Aというノート PC に Ubuntu をインストールしています。

UX21A

今回は趣向を変えてリソースが余っている PC に開発環境を構築して使用してみようと思いました。

このノート PC は 2012 年に発売されたもので、10 年以上前のものですが自宅サーバや小規模な開発環境でしたら問題なく動作しています。メモリが 4GB なのであまり複数のコンテナを立ち上げることは無理かもしれませんが…。

余談ですが、この PC は他にファイルサーバや DLNA サーバとしての役割を持たせています。

構築環境

  • マシン: ZENBOOK UX21A
  • Ubuntu: 20.04.5 LTS
  • Docker: 20.10.23(build 7155243)
  • Docker Compose: 2.15.1
  • SQL Server 2022 Express

作業環境

  • Windows11: 22H2(22621.1105)
  • WSL: Ubuntu-20.04 Version 2

リモートマシン前提条件

  • SSH 接続設定済み
  • IP アドレス固定設定済み

Docker Engine のインストール

ホストマシンからノート PC の Ubuntu へ SSH 接続して Docker Engine をインストールしていきます。このあたりは WSL2 に Docker Engine をインストールするときと同じです。

"リモートマシン側での作業"
# パッケージリストの更新とインストール済のパッケージをアップグレード
sudo apt update && sudo apt upgrade -y

# 開発に必要なパッケージをインストール
sudo apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release

sudo mkdir -p /etc/apt/keyrings
# GPG鍵を追加
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 安定版のリポジトリを追加
echo \
 "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
 $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# aptのパッケージリストを更新
sudo apt-get update

# Docker Engine, containerd, Docker Compose をインストール
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

# Dockerのサービスを起動
sudo service docker start
* Starting Docker: docker   [ OK ]

# docker composeがインストールされているか確認
sudo docker compose version
Docker Compose version v2.15.1

sudo を付けなくても docker コマンドが実行出来るように設定

現状、docker コマンドを実行する度にsudoを付けて実行し、パスワードを入力しないと駄目なのでとても面倒です。sudoを付けなくてもコマンドが実行出来るように設定していきます。

docker コマンドは root ユーザー、またはインストール中に自動で作成される docker グループに所属しているユーザーのみ実行できるような権限になっているので、現在ログイン中のユーザー(user01)を docker グループに追加することにします。

"リモートマシン側での作業"
# dockerグループが存在しているか確認
getent group docker
docker:x:999:

# ターミナルを実行中のユーザーをdockerグループに追加する
sudo usermod -aG docker $USER

# グループに追加されていることを確認
getent group docker
docker:x:998:user01 # user01が追加されている

# テストで hello-world イメージを実行してみる
docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:aa0cc8055b82dc2509bed2e19b275c8f463506616377219d9642221ab53cf9fe
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

# 停止しているコンテナも確認
docker ps -a
CONTAINER ID   IMAGE         COMMAND   CREATED              STATUS                          PORTS   NAMES
6b459d9ff91e   hello-world   "/hello"  About a minute ago   Exited (0) About a minute ago           xenodochial_einstein

# 停止中のコンテナを削除する
docker rm 6b459d9ff91e
6b459d9ff91e

# 削除出来たか確認
docker ps -a
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE

# docker imageの確認
docker image ls
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    feb5d9fea6a5   16 months ago   13.3kB

# docker imageの削除
docker image rm hello-world

# imageが削除出来たか確認
docker image ls
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE

docker-compose.yml を作成

vimコマンドを使用してdocker-compose.ymlを作成していきます。詳細な設定は割愛しますが、VS Code で編集したい方はRemote SSHを使用して下さい。

適当な作業用ディレクトリを作成していきます。

"リモートマシン側での作業"
# サブディレクトリも同時に作成
mkdir -p development/sqlserver

cd development/sqlserver

vim docker-compose.yml

docker-compose.ymlの内容です。

"設定ファイルの内容"
services:
  mssql:
    image: mcr.microsoft.com/mssql/server:2022-latest
    container_name: mssql-test
    # ホストのネットワークドライバーを使用する
    network_mode: host
    # SQL Serverに関する設定
    environment:
      # 使用許諾契約書の承諾を設定
      - ACCEPT_EULA=Y
      # SA_PASSWORDの環境変数は非推奨
      # SA ユーザーのパスワードを構成(パスワードポリシーを満たさないとコンテナが起動しない)
      - MSSQL_SA_PASSWORD=Hn_Pgtech1234
      # SQL Serverのエディションを指定(Enterprise、Standard、Web、Developer、Expresから選択)
      - MSSQL_PID=Express
      # ロケーションを指定
      - MSSQL_LCID=1041
      # 照合順序を指定
      - MSSQL_COLLATION=Japanese_CI_AS
    volumes:
      - sqlvolume:/var/opt/mssql

volumes:
  sqlvolume:
    # 任意のボリューム名を指定
    name: my-sqlserver-volume

MSSQL_PID=Expressは、SQL Server のエディションに関する設定です。今回は無料で使用できるExpressを指定しています。

MSSQL_LCID=1041ではロケーションに関する設定を行っています。

サポートしている照合順序を確認して設定します。照合順序では、テキストデータの並べ替えや比較のルールを定義します。Japanese_CI_ASの特徴は以下のとおりです。

  • _CI:大文字と小文字を区別しません。例えば、Aaは同じものとして扱われる。
  • _AS:アクセントの有無を区別します。例えば、aáは異なるものとして扱われる。
  • Japanese:日本語の文字セット(例えば、ひらがな、カタカナ、漢字)に対応していることを示す(Shift-JIS 形式

注意点

開発環境なのでパスワードの設定を123456789と適当に設定していたのですが、コンテナ起動時にエラーが発生して停止してしまう事象が発生しました。

docker compose up

# ~ 中略 ~

Password validation failed. The password does not meet SQL Server password policy requirements because it is not complex enough.
The password must be at least 8 characters long and contain characters from three of the following four sets: Uppercase letters,
Lowercase letters, Base 10 digits, and Symbols.

以下、DeepLでの直訳です。

パスワードの検証は失敗しました。パスワードが十分に複雑でないため、パスワードは SQL Server パスワードポリシーの要件を満たしません。 パスワードは少なくとも 8 文字で、次の 4 つのセットのうち 3 つの文字を含まなければなりません。 大文字、小文字、基本 10 桁、および記号です。

基本 10 桁というのは 10 進数のことで、数字を指定していれば OK です。

この要件を満たすようにパスワードを設定して下さい。

ネットワークの設定

今回は別 PC に立てたコンテナに直接アクセスしたかったので、ホストマシンと同じ IP でアクセスできるようにしたいと考えていました。

Docker のネットワークの設定はデフォルトではbridgeで動作するので、明示的にhostを指定してホストマシンの IP アドレスでコンテナ上の SQL Server にアクセスできるようにします。

注意点としてhostネットワークを使用した場合、そのホストマシンに複数のコンテナを立ち上げた場合に同じポートを使用することは出来ません。また、ポートマッピングも使用することが出来ません。

今回、SQL Server は 1 つしか起動する予定が無いので特にポートは指定しません。SQL Server はデフォルトで1433番ポートを使用します。

# ホストのネットワークドライバーを使用する
network_mode: host

SSMS から接続する

SQL Server を管理する SQL Server Management Studio をインストールします。現在のバージョンは 19 で公式ページからダウンロー出来ます。

注意点として、以下の画像のリンクからインストーラーをダウンロードすると英語版がダウンロードされてしまいます。

SSMS-ENG-LINK

SSMS-ENG

少しスクロールして日本語版をダウンロードします。 SSMS

インストーラーを実行して SSMS をインストールします。

SSMS の設定

SSMS を起動して SQL Server にログインします。ログイン時のパスワードはdocker-compose.ymlに記述していますが、ユーザー名はsaというユーザーを指定します。

ちなみにsaと言うのは、System Administrator の略で、SQL Server 認証用の管理者アカウントとして登録されているユーザーのようです。

IP アドレスはサーバの IP を指定し、認証は SQL Server 認証を指定して下さい。

SSMS-Login-01

問題なく接続できると、下の画像のような画面になります。

SSMS-Login-02

データベースの作成

データベースという項目を右クリックしてポチポチ操作をしていきます。

create-database

テーブルの作成

データの型などは適宜設定するようにして下さい。

sql-server-02

主キーの設定

sql-server-03

取り敢えず使えるようにはなりました。

まとめ

今回は Docker 上で SQL Server を動作させるところまで構築しました。

Linux 環境化でも動作し Windows に依存しないのは便利だな~と感じました。

サクッと検証環境出来るので是非試してみて下さい。

参考