アレアレ

お役立ち情報、お悩み解決情報を発信!

IT

macでSQL Server on Linuxコンテナに自動でサンプルDBを取り込む手順

macでSQL Server on Linuxコンテナに自動でサンプルDBを取り込む手順

今回は、Docker for Macで、Linux用のSQL Server 2017のコンテナを動かすのが初めての人に伝えたい情報です。

お伝えしたいのは、次の3つのサンプルDBが仕込まれた状態で、Linux用のSQL Serverのコンテナを起動するための手順です。

データベースのダウンロード

まず、Docker for Macをインストールしていない人は、そのインストールを行ってください。また、SQL Serverのコンテナを動かすにあたり、Docker for Macの設定で割り当てるメモリは「4GB以上」が推奨されています。のでその設定を行ってください。詳しくは、次の記事にあります。

Run the SQL Server 2017 container image with Docker

続いて、マイクロソフトが公開しているサンプル用のデータベースをダウンロードします。冒頭でご紹介した3つのリンク先から、それぞれのデータベースのバックアップファイル(.bak)がダウンロードできます。

Northwindは、上のリンク先のページの「Download」ボタンを押すと、「Northwind.bak.zip」と言うファイル名でダウンロードされます。それを解凍してください。

次に、AdventureWorks2014は、「adventure-works-2014-oltp-full-database-backup.zip」リンクから、zipファイルをダウンロードしてください。ダウンロード後、それを解凍してください。

最後に、Wide World Importersは、「WideWorldImporters-Full.bak」のリンクから、ファイルをダウンロードしてください。

最終的に、次の3つのファイルがローカルに用意できれば大丈夫です。

  • Northwind.bak
  • AdventureWorks2014.bak
  • WideWorldImporters-Full.bak

docker-compose用の設定ファイルを準備する

サンプル用のデータベースのバックアップファイルを用意したら、次にdocker-compose用の設定ファイルを準備します。

まず、任意の場所に作業用のフォルダを作り、その中に「backup」と言うフォルダを作ってください。そして、その「backup」フォルダ中に上でダウンロードした3つのバックアップファイルを配置します。

そして、この「backup」フォルダを入れた作業フォルダをベースに、docker-compose用の設定ファイルを準備していきます。具体的には、次のような構成のファイルを、これから作っていきます。

.
├── Dockerfile (テキストファイル)
├── backup
│   ├── AdventureWorks2014.bak
│   ├── Northwind.bak
│   └── WideWorldImporters-Full.bak
├── docker-compose.yml  (テキストファイル)
├── entrypoint.sh  (テキストファイル)
└── restore-backup.sh  (テキストファイル)

DockerのMySQL用イメージでは、「/docker-entrypoint-initdb.d/」を利用して、DBの初期化が簡単に行えます。ですが、この記事を書いている現在は、Linux用のSQL Serverのイメージでは、それが利用できません。

なので、ちょっと一手間が必要になります。

Dockerfile

では、まずDockerfileの中身を次のように記述してください。

FROM microsoft/mssql-server-linux:latest

COPY ./entrypoint.sh /usr/src/
COPY ./restore-backup.sh /usr/src/

WORKDIR /usr/src/

RUN chmod +x /usr/src/restore-backup.sh

CMD /bin/bash ./entrypoint.sh

このファイルでは、まず、そのイメージとして、Linux用のSQL Serverの最新版を指定しています。次に「entrypoint.sh」と「restore-backup.sh」のシェルスクリプトを、コンテナ側にコピーしています。

「restore-backup.sh」は、「entrypoint.sh」の中で実行するバックアップファイルをSQL Serverに復元する処理です。それを実行できるように、「chmod +x」で実行権を付与しています。

そして、最終的には、このコンテナを「entrypoint.sh」をコマンドとして、起動しています。

docker-compose.yml

続いて、docker-compose.ymlを次のように記述します。

version: "3"
services:
    db:
        build: ./
        environment:
            SA_PASSWORD: "Strong#Password1"
            ACCEPT_EULA: "Y"
            MSSQL_PID: "Developer"
        ports:
            - "1433:1433"
        container_name: "sql1"
        volumes:
            - ms-sqlserver-data:/var/opt/mssql
            - ./backup:/var/opt/mssql/data/backup
volumes:
    ms-sqlserver-data:
        driver: local

今回、起動するコンテナは、SQL Server1つです。なので、今回の目的だけであれば、docker-composeを利用して、コンテナを起動する必要はありません。

ですが、docker-composeを利用すると、複数のコンテナ起動を楽にする以外にも、「コンテナを起動するときに必要な引数を減らして簡単にできる」というメリットがあります。今回は、そのためにdocker-composeを利用しています。

このdocker-compose.ymlの内容は、非常にシンプルです。buildでは、先ほど作成したDockerfileを利用することを指定しています。environmentでは、SQL Serverのコンテナに必要な変数を定義しています。

volumesでは、まず、データをローカルで永続化できるように指定しています。また、コンテナ側に、ホスト側の「backup」フォルダをマウントすることによって、そこにあるデータベースのバックアップファイルにアクセスできるようにしています。

entrypoint.sh

続いて、このコンテナの起動時のコマンドとして呼ばれる、「entrypoint.sh」です。こちらは、次のように記述します。

/opt/mssql/bin/sqlservr & /usr/src/restore-backup.sh & /opt/mssql/bin/sqlservr

これは、一度、「/opt/mssql/bin/sqlservr」を起動し、「restore-backup.sh」のバックアップの復元処理を実行後、再度、「/opt/mssql/bin/sqlservr」を実行しています。

まず、「restore-backup.sh」は、コンテナ上にSQL Serverが動いていないと実行できません。SQL Serverにデータを復元する処理を行うからです。なので、最初に「/opt/mssql/bin/sqlservr」を実行し、その後、「restore-backup.sh」を実行します。

再度、「/opt/mssql/bin/sqlservr」を実行する理由は、そうしないと、Dockerの仕様で「restore-backup.sh」の復元処理が終わったタイミングで、コンテナが終了してしまうからです。コンテナを維持するために、再度、「/opt/mssql/bin/sqlservr」を実行するわけです。

restore-backup.sh

最後のファイルとなる、「restore-backup.sh」は、次のように記述します。

sleep 10s

/opt/mssql-tools/bin/sqlcmd -H localhost -U SA -P Strong#Password1 -Q "RESTORE DATABASE Northwind FROM DISK = '/var/opt/mssql/data/backup/Northwind.bak' WITH MOVE 'Northwind' TO '/var/opt/mssql/data/Northwind.mdf', MOVE 'Northwind_Log' TO '/var/opt/mssql/data/Northwind_Log.ldf'"

/opt/mssql-tools/bin/sqlcmd -H localhost -U SA -P Strong#Password1 -Q "RESTORE DATABASE AdventureWorks2014 FROM DISK = '/var/opt/mssql/data/backup/AdventureWorks2014.bak' WITH MOVE 'AdventureWorks2014_data' TO '/var/opt/mssql/data/AdventureWorks2014.mdf', MOVE 'AdventureWorks2014_Log' TO '/var/opt/mssql/data/AdventureWorks2014.ldf'"

/opt/mssql-tools/bin/sqlcmd -H localhost -U SA -P Strong#Password1 -Q 'RESTORE DATABASE WideWorldImporters FROM DISK = "/var/opt/mssql/data/backup/WideWorldImporters-Full.bak" WITH MOVE "WWI_Primary" TO "/var/opt/mssql/data/WideWorldImporters.mdf", MOVE "WWI_UserData" TO "/var/opt/mssql/data/WideWorldImporters_userdata.ndf", MOVE "WWI_Log" TO "/var/opt/mssql/data/WideWorldImporters.ldf", MOVE "WWI_InMemory_Data_1" TO "/var/opt/mssql/data/WideWorldImporters_InMemory_Data_1"'

この処理では、最初に「sleep 10s」と10秒待たせています。これは、コンテナ上にSQL Serverが起動するのを待っています。利用するマシンのスペックによっては、足りない場合も考えられます。ので、その場合は、長めに取るなどし調整してください。

その後に行っている処理は、単純です。「/opt/mssql-tools/bin/sqlcmd」を利用し、「/var/opt/mssql/data/backup」にマウントした3つのバックアップファイルをそれぞれ復元しているだけです。

ただ、その復元する処理の引数として、mdfやldfの保存先を、コンテナ上のパス(つまり、Linux形式のパス)に指定する必要があります。これを指定しないと、元々設定されていたWindows上のパスに復元しようとしてエラーになります。

コンテナの起動の仕方

以上のdocker-compose用のファイルの準備ができたら、ターミナルから次のコマンドを実行することで、コンテナを起動できます。

docker-compose up -d

起動後、次のコマンドを実行してください。

docker ps

その出力として、次のような結果が得られれば、コンテナの起動に成功しています。

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
dba9cc3ed934        sqlcompose_db       "/bin/sh -c '/bin/..."   17 seconds ago      Up 16 seconds       0.0.0.0:1433->1433/tcp   sql1

そして、コンテナの起動後、ちょっと(この記事通りのままで10秒)待つと、バックアップの復元処理が実行されます。ちなみに、次のコマンドで、コンテナの出力結果を見ることで、バックアップがちゃんと進んでいるかを確認できます。

docker logs sql1

データベースへの接続

ここまでできたら、起動したSQL Serverのコンテナに接続し、復元したサンプルのデータを表示させてみてください。

macの場合、無料で使えるSQL Serverのクライアントして便利なのが、Visual Studio Codeです。

このエディタに、こちらも無料のmssql for Visual Studio Codeという拡張機能を追加することで、SQL Serverに接続し、SQLを実行した結果を取得できるようになります。

Visual Studio CodeにSQL Serverに接続できる拡張機能を入れた例

上の図は、冒頭で紹介した3つのサンプルDBの1つである、Wide World Importersのデータベースに対して、そのエディタ上でSQLを実行し、その結果を表示させている例です。

ちなみにAdventureWorks2014やWide World Importersでは、「Sales.Customers」のようにテーブル名の前にスキーマを指定して、SQLを実行する必要があります。その点にご注意ください。

コンテナの終了の仕方

以上で起動したSQL Serverのコンテナは、次のコマンドで終了できます。

docker-compose down -v

ちなみに、ここで、「-v」と指定しているのは、ローカルに永続化したデータを削除するためです。コンテナの起動時に初期データが作られるので、「データを削除しても構わないだろう」という考えから、この引数を指定しています。

Return Top