blog
作成日 : 2024/05/28
更新日 : 2024/05/28
更新日 : 2024/05/28
WSLのdockerコンテナ上でSQL Serverを実行し、Windowsから利用する方法
WSLのdockerコンテナ上で、SQL Server を実行し、 Windowsから利用する方法の一例を示す。 WSLのdockerコンテナ上でSQL Serverを起動後、Windows上のSSMSからSQL Serverに接続確認する。
本稿では、Windowsを利用することを前提とするが、dockerを利用しているため他のOS(Mac, Linuxなど)でも利用可能だと思われる。
前提条件- Windowsを利用
- Windows上に、SSMSをインストール 済み
- WSLインストール 済み
- WSL上に、docker, docker composeインストール 済み
以下の点から、参考URLのSQL Serverコンテナイメージのカスタマイズ例のように、SQL Serverのコンテナイメージをカスタマイズするのではなく、 SQLを発行するコンテナとSQL Serverのコンテナを分けている。
- SQL Serverのコンテナイメージ起動時に、DBの作成を行うと、デフォルトのCOLLATIONが設定される前に、DBが起動する場合ある
- SQLの発行用イメージがあるとAzure SQL Database など他の環境へのSQL発行に利用しやすい
.
|- 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/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
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
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;
SQL Serverコンテナイメージのカスタマイズ例
https://github.com/microsoft/mssql-docker/tree/master/linux/preview/examples/mssql-customize