Dockerを使用してMacからSQL Serverに接続する（方法編）

# 目的・背景
　先日PCをWindowsからMacに買い替え、新しく開発環境を構築しています。

　この記事では近年普及している（らしい）、サーバ仮想化に代わるモデルであるコンテナ技術「Docker」をせっかくの機会なので利用して、SQL ServerをmacOS上で使用する方法をまとめました。


# 環境
| PC               |
|:-----------------|
| macOS |

# 構築対象
| 対象       | バージョン等 | 備考|
|:-----------------|:------------------|:------------------|
| Docker Community Edition  | Version 18.06.1-ce-mac73 |メモリ　4GB   |
|SQL Server on Linux |2017-latest  |
|Azure Data Studio   |Version 1.0.0 |SQL Operations Studioの後継  |

# 記事の範囲
1. Dockerのインストール
2. Azure Data Studio のインストール
3. Dockerを使用して SQL Server コンテナイメージをpullして実行
4. コンテナ内の SQL Server への接続
 - 【CUI】 コマンドラインツール sqlcmd を使用した接続
 - 【GUI】 Azure Data Studio を使用した接続


## 1. Dockerのインストール
下記の公式サイトの手順に従いインストールします。
[https://docs.docker.com/docker-for-mac/install/](https://docs.docker.com/docker-for-mac/install/)

SQL Server を使用する前提条件として、ディスク領域が3.25GB以上必要なため、Dockerをインストール後、[Preferences]（設定）>[Advanced] から、メモリの上限を4GBに増やします。
<img width="501" alt="Screen Shot 2018-10-11 at 21.23.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/292215/2d193838-5fec-cbbb-2859-dd7929e87e20.png">


## 2. Azure Data Studio のインストール
下記のGithubから最新版をインストールします。
[https://github.com/Microsoft/azuredatastudio/releases](https://github.com/Microsoft/azuredatastudio/releases)

- azuredatastudio-macos-1.0.0.zip

<img width="1026" alt="Screen Shot 2018-10-11 at 21.28.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/292215/6599fa9d-c95a-30d1-71f0-dda58e5c1f2e.png">

## 3. Dockerを使用して SQL Server コンテナイメージをpullして実行

下記の Dockerhub 公式サイトでコマンドを調べることができます。
[https://hub.docker.com/r/microsoft/mssql-server/](https://hub.docker.com/r/microsoft/mssql-server/)

### (1) コンテナイメージのpull
Terminalを開き、上記のサイトで取得したコマンドを入力すると、SQL Server on Linux for Docker Engineのイメージがダウンロードされます。

```bash:Terminal-bash
sudo docker pull mcr.microsoft.com/mssql/server
```


#### 実例

- コマンド入力して実行した画面。

<img width="512" alt="Screen Shot 2018-10-11 at 22.46.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/292215/ac43f9cb-3ed4-78e1-ce1d-de7d2af85ead.png">

- パスワードを求められるので、管理者権限パスワードを入力。
- ダウンロードとpullが完了した画面。完了まで30分〜1時間とけっこう時間かかりました。

<img width="503" alt="Screen Shot 2018-10-11 at 23.25.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/292215/568e7423-8f8b-090d-c67d-815072fb91af.png">


### (2) インスタンスの開始（run）
ダウンロードが完了したら、SQL Server 2017 の最新版のインスタンスを開始します。

- パスワードはSA用に強力なパスワードをつけます。テンプレートを適宜変更してください。
 - 8文字以上/大文字・小文字・数字・記号含む
 - ルールに則っていないと処理が開始されません、自分はこれでしばらくハマりました...。 

- パターン1：コンテナに名前を指定しない場合、自動的に名前がつきます。
    
```bash:Terminal-bash
docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=<YourStrong!Passw0rd>' \
   -p 1433:1433 \
   -d mcr.microsoft.com/mssql/server:2017-latest
```

- パターン2：「--name ○○」を追加すると、○○で指定した名前がコンテナにつきます。

```bash:Terminal-bash
docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=<YourStrong!Passw0rd>' \
   -p 1433:1433 --name sql1 \
   -d mcr.microsoft.com/mssql/server:2017-latest
```

#### 実例

- 名前を指定しないパターン1で、インスタンスを開始。

<img width="489" alt="Screen Shot 2018-10-11 at 23.40.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/292215/67e5e2cb-1537-ed4a-c797-bf572e433d00.png">

### (3) コンテナ情報の確認
ここで一度、現在実行されているコンテナ情報を取得し、次で説明するサーバ接続で使用するための情報を確認しておきます。

```bash:Terminal-bash 
docker ps
```

#### 実例

- 今回は コンテナID='eff2b3c79670'、コンテナ名='gracious_zhukovsky'になっていることが確認できました。
 - コンテナ名には著名人の名前がランダムで与えられるというおしゃ仕様。「zhukovsky（ジュコーフスキー）」というと、流体力学の父ニコライ・ジュコーフスキーか、ロマン派の詩人・名翻訳家のヴァシーリー・ジュコーフスキー。後者のヴァシーリーが素敵すぎます。

<img width="1069" alt="Screen Shot 2018-10-12 at 0.12.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/292215/399157fb-11cd-17ea-b4b5-c1ee78abc867.png">


## 4. コンテナ内の SQL Server への接続
###  【CUI】 コマンドラインツール sqlcmd を使用した接続
ひきつづきTerminalを使用します。

- 実行中のコンテナ内のbashシェルを起動。

```bash:Terminal-bash
docker exec -it <container_id|container_name> "bash"
```

```bash:Terminal-bash（例）
docker exec -it gracious_zhukovsky "bash"
```

- コンテナ内でsqlcmdを使用してローカル接続。

```bash:Terminal-root@コンテナID
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P <your_password>
```

```bash:Terminal-root@コンテナID（例）
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P myStrongPassword!
```

#### 実例

- `1>`が出力されたら接続できている証拠。

<img width="1078" alt="Screen Shot 2018-10-12 at 0.48.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/292215/04949451-89e7-34e1-d5b0-f1dbd151abdd.png">

- データ取得、sqlcmdセッション終了`QUIT`、コンテナ内のコマンドプロンプトbashシェル終了`exit`まで。

<img width="1078" alt="Screen Shot 2018-10-12 at 0.50.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/292215/e1f7acbc-7c9c-72e0-dfbb-ff31bf8b00cc.png">


###  【GUI】 Azure Data Studio を使用した接続

- Azure Data Studio を起動。

<img width="1382" alt="Screen Shot 2018-10-12 at 1.29.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/292215/d8ccce24-e6c8-7587-d808-25e45b3a4fd8.png">

<img width="1022" alt="Screen Shot 2018-10-12 at 1.30.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/292215/ada1f561-7add-3b12-3357-f6c7702106dd.png">

<img width="1023" alt="Screen Shot 2018-10-12 at 1.30.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/292215/32ce5bc9-c8ac-d8c4-7767-5f15f652fd01.png">


- コンテナ内で SQL Server が起動していることを確認して、ローカル接続。

<img width="1035" alt="Screen Shot 2018-10-12 at 1.46.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/292215/fc857cae-9c87-d84f-8740-36bbe2a62019.png">

- 接続を確認。

<img width="1024" alt="Screen Shot 2018-10-12 at 1.47.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/292215/d8650bb1-6e3b-ffb3-ad53-b48da23895bd.png">


# まとめ

　MacOSでの環境構築手始めに、Dockerを使用してSQL Serverをインストールし、CUIやGUIから接続をしてみました。
　WindowsPCだとMS社のウェブサイトからSQL Serverをインストールするだけだったので何も考えなかったのですが、今回試してみたおかげで今まで知らなかった世界がひらけて楽しかったです。
　Docker、コンテナ、Linux、シェル、bash、CUI、コマンドラインと全部初めてだったので...。 
　作業自体はわかればサクサクできるので、つづいて理論やしくみの理解を深めていこうかと思います。

　ちなみに、`$ docker stop <コンテナID>`ならいいのですが、`$ docker rm <コンテナID>`でコンテナ削除すると、DBの本来の役目であるデータの保持ができず全て消えてしまうので、それを回避するために`$ docker run ...`の時点で「データの永続化」のオプションをつける必要があるのですが、それはまた別の機会に。

　長々と読んでくださってありがとうございます。少しでもお役に立てていたら何よりです。
　＊もし当記事の誤認識、不備等にお気づきになられた際は、コメントなどで教えていただけると大変ありがたいです...！

# 参考サイト
- [Create C# apps using SQL Server on macOS]
(https://www.microsoft.com/en-us/sql-server/developer-get-started/csharp/macos/)
- [Install Docker for Mac](https://docs.docker.com/docker-for-mac/install/)
- [Docker Hub：Public Repository "microsoft/mssql-server/"](https://hub.docker.com/r/microsoft/mssql-server/)
- [Install Azure Data Studio](https://github.com/Microsoft/azuredatastudio/releases)