blog

作成日 : 2024/05/28
更新日 : 2024/05/29

WSLのdockerコンテナ上でSQL Serverを実行し、Windowsから利用する方法

WSLのdockerコンテナ上で、SQL Server を実行し、 Windowsから利用する方法の一例を示す。 WSLのdockerコンテナ上でSQL Serverを起動後、Windows上のSSMSからSQL Serverに接続確認する。

本稿では、Windowsを利用することを前提とするが、dockerを利用しているため他のOS(Mac, Linuxなど)でも利用可能だと思われる。

前提条件 全体構成

以下の点から、参考URLのSQL Serverコンテナイメージのカスタマイズ例のように、SQL Serverのコンテナイメージをカスタマイズするのではなく、 SQLを発行するコンテナとSQL Serverのコンテナを分けている。

  • SQL Serverのコンテナイメージ起動時に、DBの作成を行うと、デフォルトのCOLLATIONが設定される前に、DBが起動する場合ある
  • SQLの発行用イメージがあるとAzure SQL Database など他の環境へのSQL発行に利用しやすい
最終的なWSL上のディレクトリ構成
.
|- compose.yml
|- dockerfiles/
   |- Dockerfile.sqlcmd
|- scripts/
   |- init_sql_local.sh
   |- sql/
     |- 10_ddl.sql
     |- 50_dml_test.sql
     |- local/
        |- 10_ddl.sql      : シンボリックリンク
        |- 50_dml_test.sql : シンボリックリンク
手順

準備

ディレクトリの準備
mkdir dockerfiles
mkdir -p scripts/sql/local
Composeファイルの準備
cat << 'EOS' > compose.yml
services:
  sql:
    # https://mcr.microsoft.com/en-us/product/mssql/server/about
    image: mcr.microsoft.com/mssql/server
    ports:
      - "1433:1433"
    environment:
      # https://learn.microsoft.com/ja-jp/sql/linux/sql-server-linux-configure-environment-variables?view=sql-server-ver16
      - ACCEPT_EULA=Y
      - MSSQL_PID=Developer
      - MSSQL_SA_PASSWORD=Password_123
      - MSSQL_COLLATION=Japanese_BIN # 必要に応じて変更
      - SQLCMDUSER=sa
      - SQLCMDPASSWORD=Password_123
    healthcheck:
      test: [ "CMD", "/opt/mssql-tools/bin/sqlcmd", "-Q", "SELECT 1" ]
  sqlcmd: # SQL Serverが正常に起動後、DBを初期設定
    build:
      context: ./dockerfiles/
      dockerfile: Dockerfile.sqlcmd
    depends_on:
      sql:
        condition: service_healthy
    volumes:
      - ./scripts:/workspace
    working_dir: /workspace
    environment:
      - SQLCMDSERVER=sql
      - SQLCMDDBNAME=sqldb-local
      - SQLCMDUSER=sa
      - SQLCMDPASSWORD=Password_123
    command: [ "bash", "-x", "init_sql_local.sh" ]
EOS
Dockerfileの準備
cat << 'EOS' > ./dockerfiles/Dockerfile.sqlcmd
FROM ubuntu:22.04

# 必要なパッケージのインストールと後処理
RUN apt-get update && apt-get install -y --no-install-recommends \
    curl \
    # 必要に応じてhttps(tls)による通信をするため
    ca-certificates \
    # 必要に応じてenvsubstを利用可能にするため
    gettext \
  && curl https://packages.microsoft.com/keys/microsoft.asc | tee /etc/apt/trusted.gpg.d/microsoft.asc \
  && curl -s https://packages.microsoft.com/config/ubuntu/22.04/prod.list | tee /etc/apt/sources.list.d/microsoft.list \
  && apt-get update \
  && apt-get install -y sqlcmd \
  && curl -sL https://aka.ms/InstallAzureCLIDeb | bash \
  # 一時的なパッケージの削除とキャッシュのクリーンアップ
  && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \
     curl \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*

WORKDIR /workspace
EOS
SQL実行用スクリプトの準備
cat << 'EOS' > ./scripts/init_sql_local.sh
#!/bin/bash

SQL_DIR=./sql/local

echo '###################### start ######################'
# ローカル用のDB作成
sqlcmd -d master -Q \
  "create database [${SQLCMDDBNAME}]"

for sqlfile in "${SQL_DIR}/*.sql"; do
  sqlcmd -i $sqlfile
done
echo '###################### end   ######################'
EOS
SQLの準備
cat << 'EOS' > ./scripts/sql/50_dml_test.sql
INSERT INTO users (username, password, email, first_name, last_name, registration_date)
VALUES
('john_doe', 'password123', 'john.doe@example.com', 'John', 'Doe', '2023-01-15'),
('jane_smith', 'securepass456', 'jane.smith@example.com', 'Jane', 'Smith', '2023-02-20'),
('bob_jones', 'strongpassword789', 'bob.jones@example.com', 'Bob', 'Jones', '2023-03-10');
EOS
cat << 'EOS' > ./scripts/sql/10_ddl.sql
CREATE TABLE users (
    user_id INT PRIMARY KEY IDENTITY(1,1),
    username NVARCHAR(50) UNIQUE NOT NULL,
    password NVARCHAR(100) NOT NULL,
    email NVARCHAR(100) UNIQUE NOT NULL,
    first_name NVARCHAR(50),
    last_name NVARCHAR(50),
    registration_date DATETIME DEFAULT GETDATE()
);
EOS
cd ./scripts/sql/local
ln -s ../*.sql .
cd -

docker composeでコンテナを起動

docker compose up -d

SSMSでの接続確認

Windowsに移動し、SSMSを起動し、以下を実施する。

サーバー名をlocalhostとすると、接続できないので、明示的にIPv4である127.0.0.1で接続する。 compose.ymlファイルの記載内容に合わせて、ログイン: sa、パスワード: Password_123とする。

[新しいクエリ]をクリック後、[sqldb-local]を選択し、以下クエリを入力後、[➧実行]をクリックする。

select * from users;
参考URL

SQL Serverコンテナイメージのカスタマイズ例

https://github.com/microsoft/mssql-docker/tree/master/linux/preview/examples/mssql-customize