DockerでSQL Server開発環境を構築する方法【docker-compose対応】

Dockerのアイキャッチ

SQL Serverの開発環境ってインストーラーを走らせて、ライセンスを確認して……と、セットアップが面倒ですよね。しかもいざ構築したら「OSの設定が汚れた」「別PCで再現できない」なんて悩みも出てきます。

そんな面倒を丸ごと解決してくれるのがDockerです。コマンド数行でSQL Serverのコンテナが起動し、不要になったら跡形もなく消せます。

この記事ではDocker初心者の方に向けて、SQL Serverの開発環境をDockerで構築する手順を解説します。

目次

この記事でわかること

  • DockerでSQL Serverコンテナを起動する方法(docker run
  • Docker Composeを使った管理しやすい構築方法(おすすめ)
  • SQL Serverへの接続方法(sqlcmd・GUIツール)
  • データを永続化してコンテナ削除後もDBを守る方法
  • macOS(Apple Silicon)での注意点とトラブル対処法

結論:DockerならSQL Serverの開発環境は5分で作れる

本記事で作る開発用SQL Server環境

本記事では以下の環境を構築します。

項目内容
SQL Serverバージョン2022(Latest)
エディションDeveloper Edition(無償)
接続ポート1433
データ永続化Dockerボリューム使用
推奨構築方法Docker Compose

ローカルの開発・検証用途にちょうどよい最小構成を目指します。

DockerでSQL Serverを構築するメリット

Dockerを使う理由を簡単に整理しておきましょう。

  • 環境をすぐ作れる
    コマンド数行でSQL Serverが起動します。インストーラーのウィザードをポチポチ進める必要はありません。
  • OSを汚さない
    SQL ServerはDockerコンテナの中で動くのでホストPC(あなたのMacやWindowsマシン)の環境には一切手を加えません。「レジストリがごちゃごちゃした」「アンインストールしても残骸が残る」といった心配が不要です。
  • 削除も簡単
    コンテナとイメージを消すだけでSQL Serverごとなかったことにできます。クリーンな状態に戻すのが非常に楽です。

DockerでSQL Serverを動かす前に知っておきたいこと

SQL ServerのDockerイメージについて

Microsoft公式のSQL Server向けDockerイメージはDocker HubおよびMicrosoft Container Registry(MCR)で公開されています。

タグ(バージョン)の指定形式は2022-latest2019-latestのようになっています。

参考:Microsoft公式 Docker Hub(SQL Server)

開発用途なら「Developer Edition」で十分

SQL Serverにはいくつかのエディションがあります。開発・テスト目的であればDeveloper Editionが最適です。

エディション費用用途
Developer無償開発・テスト用(本番利用不可)
Express無償小規模本番・学習用(機能制限あり)
Standard / Enterprise有償本番環境向け

コンテナ起動時に環境変数MSSQL_PID=Developerを指定することでDeveloper Editionとして動作します。

macOSでの注意点(重要)

Apple Silicon(M1/M2/M3/M4)環境

SQL ServerのDockerイメージはx86_64(AMD64)アーキテクチャ向けに提供されています。Apple SiliconのMacはARMアーキテクチャのためそのままでは動作しません。

Rosettaによるエミュレーション

Docker Desktop for MacにはRosetta(ローゼッタ)エミュレーションの機能があり、これを有効にすることでAMD64向けイメージをApple Siliconで動作可能になります。

設定箇所:Docker Desktop → Settings → General → 「Use Rosetta for x86_64/amd64 emulation on Apple Silicon」をONにする

Rosettaの設定

またdocker-compose.yamlまたはdocker runコマンドにplatform: linux/amd64の指定が必要です(後述)。

パフォーマンスの注意点: Rosettaエミュレーションを使うとネイティブ動作と比べてパフォーマンスが落ちる場合があります。

最小構成でSQL Serverコンテナを起動する(docker run)

SQL Serverコンテナを起動するコマンド

まずはシンプルにdocker runコマンドでSQL Serverを起動してみましょう。

コマンド
docker run -e "ACCEPT_EULA=Y" \
  -e "MSSQL_SA_PASSWORD=【SAパスワード】" \
  -e "MSSQL_PID=Developer" \
  -p 1433:1433 \
  --name sqlserver-dev \
  -d mcr.microsoft.com/mssql/server:2022-latest

Apple Silicon(M1、M2…)のMacを使っている場合は先頭に--platform linux/amd64を追加してください。

コマンド – Apple Silicon用
docker run --platform linux/amd64 \
  -e "ACCEPT_EULA=Y" \
  -e "MSSQL_SA_PASSWORD=【SAパスワード】" \
  -e "MSSQL_PID=Developer" \
  -p 1433:1433 \
  --name sqlserver-dev \
  -d mcr.microsoft.com/mssql/server:2022-latest

各オプションの意味を初心者向けに解説

  • -p 1433:1433
    ホストのポート:コンテナのポートという書き方です。1433はSQL Serverのデフォルトポートです。ホスト側のポートを変えたい場合は左の数字だけ変更します(例:-p 11433:1433)。
  • MSSQL_SA_PASSWORD
    saはSQL Serverの最高権限管理者アカウントです。パスワードは大文字・小文字・数字・記号を含む8文字以上という複雑さポリシーがありますのでこれを満たす必要があります。
  • ACCEPT_EULA=Y
    MicrosoftのEnd User License Agreement(使用許諾契約)に同意することを示す指定です。Y を指定しないとコンテナが起動しません。
  • –name
    コンテナに名前をつけることで後からdocker stop sqlserver-devのように名前で操作できるようになります。省略するとランダムな名前が割り当てられます。

コンテナが起動しているか確認する

起動後は以下のコマンドでコンテナの状態を確認します。

コマンド
docker ps
コマンド – 実行結果
CONTAINER ID   IMAGE                                        STATUS         PORTS                    NAMES
xxxxxxxxxxxx   mcr.microsoft.com/mssql/server:2022-latest  Up 30 seconds  0.0.0.0:1433->1433/tcp   sqlserver-dev

STATUS列がUpになっていれば起動成功です。

Docker ComposeでSQL Serverを構築する(おすすめ)

docker runコマンドは手軽ですがオプションが増えると管理が大変になります。Docker Composeを使えば設定をファイルで管理でき、チームへの共有も簡単です。実際の開発現場でもこちらがよく使われます。

docker-compose.yaml の最小構成

プロジェクトのルートディレクトリにdocker-compose.yamlを作成し以下の内容を貼り付けてください。

docker-compose.yaml
services:
  sqlserver:
    image: mcr.microsoft.com/mssql/server:2022-latest
    platform: linux/amd64   # Apple Siliconの場合は必須、Windowsは削除してもOK
    container_name: sqlserver-dev
    ports:
      - "1433:1433"
    environment:
      ACCEPT_EULA: "Y"
      MSSQL_SA_PASSWORD: "【SAパスワード】"
      MSSQL_PID: "Developer"
    volumes:
      - sqlserver_data:/var/opt/mssql

volumes:
  sqlserver_data:

各設定項目を初心者向けに解説

  • image
    使用するDockerイメージを指定します。mcr.microsoft.com/mssql/server:2022-latestでSQL Server 2022の最新版を使用します。
  • container_name
    コンテナに固定の名前をつけます。docker stop sqlserver-devのように名前で操作できます。
  • ports
    "ホストポート:コンテナポート"の形式で指定します。"1433:1433"でホストPCの1433番ポートをコンテナに繋ぎます。
  • environment
    コンテナ内の環境変数を設定します。ACCEPT_EULAMSSQL_SA_PASSWORDMSSQL_PIDはSQL Server起動に必須の3つです。
  • volumes
    データをホストPC側に保存するための設定です。コンテナを削除してもデータが消えなくなります(詳細は後述)。

Docker ComposeでSQL Serverを起動する

docker-compose.yamlがあるディレクトリで以下のコマンドを実行します。

コマンド
docker compose up -d

-dはバックグラウンド起動のオプションです。これがないとターミナルを閉じるとコンテナも止まってしまいます。

起動確認はdocker psで行えます。

SQL Serverに接続する方法

コンテナ内から接続する(sqlcmd)

コンテナの中に入ってsqlcmdコマンドで接続する方法です。GUIツールがなくても動作確認できるので覚えておくと便利です。

コマンド – コンテナに入る

コマンド – コンテナに入る
docker exec -it sqlserver-dev bash
docker exec -it sqlserver-dev bash

コマンド – sqlcmdで接続

コマンド – sqlcmdで接続
/opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P "【SAパスワード】" -No

接続後に1>というプロンプトが表示されれば成功です。SQL文を入力して GO と打つと実行されます。

SQL
SELECT @@VERSION
GO

exitと入力するとコンテナから抜けられます。

接続情報まとめ

項目
ホストlocalhost(または 127.0.0.1)
ポート1433
ユーザーsa
パスワード設定した【SAパスワード】
認証方式SQL Server認証

GUIツールはSQL補完や視覚的なER図表示ができて便利です。A5:SQL Mk-2DBeaverは無料で使えるのでおすすめです。

データを永続化する(コンテナ削除でDBが消えないようにする)

volumesを使ったデータ永続化

Dockerコンテナはデフォルトでは使い捨てです。コンテナを削除するとその中のデータ(作成したDBやテーブル)も一緒に消えてしまいます。

これを防ぐのがDockerボリュームです。先ほどのdocker-compose.yamlに含めたvolumesの設定がこれにあたります。

docker-compose.yaml – volumesの設定部分
volumes:
  - sqlserver_data:/var/opt/mssql

/var/opt/mssql はSQL Serverがデータファイルを保存するコンテナ内のパスです。これをDockerが管理するボリューム(sqlserver_data)に紐付けることでコンテナが消えてもデータは残り続けます。

ボリュームの一覧は以下で確認できます。

コマンド
docker volume ls

永続化しない場合に起きる問題

volumesの設定をせずにコンテナを削除すると作成したデータベース・テーブル・データがすべて消えます。

「昨日まで入れていたテストデータが消えた!」という悲劇を避けるためにも開発環境であってもvolumesの設定は最初から入れておくことをおすすめします。

開発用SQL Serverコンテナの基本操作

コンテナの停止

コンテナを停止しますが削除はしません。次回docker compose startで再起動できます。

コマンド
docker compose stop

コンテナの再起動

コンテナを再起動します。設定変更後などに使います。

コマンド
docker compose restart

コンテナの削除

コマンド
docker compose down

コンテナを停止して削除します。ボリュームは残りますのでデータは消えません。

ボリュームごと削除

ボリュームごと完全に削除したい場合は-vオプションをつけます。

コマンド
docker compose down -v

よくあるトラブルと解決方法

SQL Serverが起動しない

まずdocker logsでコンテナのログを確認します。

コマンド
docker logs sqlserver-dev

エラーメッセージから原因を特定できることが多いです。よくある原因は以下の2つです。

  • パスワードがポリシーを満たしていない(次項参照)
  • ポート1433がすでに別プロセスに使われている → portsの左側の数字を変更する(例:11433:1433

SAパスワードのポリシーエラー

docker logsに以下のようなメッセージが出ている場合はパスワードが複雑さポリシーを満たしていません。

ERROR: Unable to set system administrator password

SQL Serverのパスワードポリシーは以下の条件をすべて満たす必要があります。

  • 8文字以上
  • 大文字(A-Z)を含む
  • 小文字(a-z)を含む
  • 数字(0-9)を含む
  • 記号(!@#$ 等)を含む

YourStrong!Passw0rdはこれを満たすサンプルとして公式でも紹介されています。参考にしてください。なのでいろんなトコロで使われているかも……

macOS(Apple Silicon)で起動できない場合

以下の点を確認してください。

  • Docker Desktop の Rosetta エミュレーション設定がONになっているか
  • docker-compose.yamlplatform: linux/amd64の指定があるか
  • それでも起動しない場合は Docker Desktop を最新版にアップデートしてみる

Q&A

Developer Editionは本番環境で使える?

使えません。Developer Editionは開発・テスト専用ライセンスです。本番環境ではStandard EditionまたはEnterprise Editionが必要です。

SQL Server 2019と2022の違いは?

2022は2019と比べてAzure連携機能の強化やパフォーマンス改善が含まれています。新規に構築するなら特別な理由がなければ2022(最新版)を選ぶとよいと思います。

ポート番号1433は変えられる?

変えられます。portsの左側の数字(ホスト側のポート)を変えるだけです。例えば"11433:1433"にすればホストPCからはポート11433で接続します。接続ツール側のポート番号設定も合わせて変更してください。

docker-compose.yamlのパスワードをそのまま使っていい?

開発環境であれば動作上は問題ありません。ただしGitHubなどに公開するリポジトリにパスワードをそのまま書くのは避けてください。.envファイルに切り出してGitの管理対象から外す運用がおすすめです。

他のDBでも同じようにDockerで構築できる?

できます。PostgreSQLでも同様の手順でDocker Compose環境を構築できますよ。以下で解説しています。

まとめ:Dockerを使えばSQL Serverの開発環境は一瞬で作れる

  • DockerならSQL Serverをコマンド数行で起動できて環境構築は数分で終わるよ。
  • docker runでもいいけど設定をファイルで管理できる Docker Compose が断然おすすめだよ。
  • volumesの設定を入れておけばコンテナを削除してもデータは消えないよ。
  • macOS(Apple Silicon)ではplatform: linux/amd64と Rosetta設定が必須だよ。
  • パスワードをそのままGitにコミットするのは避けて.envファイルに切り出してねEね。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次