動手玩Windows 10 Docker(6) - 用Docker來玩MSSQL資料庫, 在Linux上也有MSSQL?!

Windows 10 Docker 是2016年度更新後很大的一個進步但(好像)被很多人忽略沒有話題性

這個系列是我的學習筆記也順便推廣這好用的東西

大家好, 已經玩過很多基本的指令了, Docker最有趣的地方我覺得是方便

真的是太方便了, 那當然是以測試環境來說...如果真正要把產品投產的話

Docker其實沒有比較簡單, 我們還是要跟以往的流程一樣去調整

但在我接觸了docker後, 第一個想玩的就是MSSQL, 以往在一台Windows上要弄好一個mssql

設定跟安裝少有30分鐘才能弄好, 安裝還是其次, 如果我們只是想做做測試

做完了測試要反安裝還要慢慢把一個個部件卸載下來...這也花不少時間啊...

如果要用docker又如何? 拿個image, run一下,用完就remove了, 實在讓測試人員省不少時間

我們可以在一台Windows 10上輕易地擁有一個MSSQL服務, 想想也都令人興奮.

而SQL服務在很多情況上效能要求是比較嚴謹的, 我也想在這篇研究Docker在效能方面的資料

我們看看微軟有提供甚麼關於MSSQL的Docker image

可以看到有幾個版本, 首3位的是

microsoft/mssql-server-linux  (https://hub.docker.com/r/microsoft/mssql-server-linux/)

microsoft/mssql-server-windows-express (https://hub.docker.com/r/microsoft/mssql-server-windows-express/)

microsoft/mssql-server-windows (https://hub.docker.com/r/microsoft/mssql-server-windows/)

很多人都偏向選擇把mssql放到linux上, 一共有132顆星星

看來Linux的使用者都熱設期待著他們可以在Linux上使用微軟的產品

那我這篇就把兩個平台的MSSQL都安裝一次, 試試效果

微軟有說明在MSSQL on windows container 上由於是安裝在Server Core的

所以它的功能跟在一台Server Core安裝的MSSQL其實沒有分別

詳細的資料可以在這裡找到

https://msdn.microsoft.com/en-us/library/hh231669.aspx

我們可以看到它的系統需求都沒有差別的,

分別是我們用的docker image已經為我們安裝好所有的前置, 例如.Net Framework 2/3/4...

Windows版本的SQL你可以找到SQL Serber 2014, 2016及預設的vNext CTP 1.1的版本

而Linux版本也是vNext CTP 1.1的版本

SQL Server next version Community Technology Preview 1.1

https://blogs.technet.microsoft.com/dataplatforminsider/2016/12/16/sql-server-next-version-community-technology-preview-1-1-now-available/

我們先看看Windows Container, default的tag是安裝CTP版本的SQL Server

安裝文檔有3.7 GB+ 878MB +... 不少的數字, 最漫長的要算是這個下載的時間了

完成後一共是12.8 GB...

沒有運行Windows Container MSSQL時的系統狀態是這樣的

記憶體用量大約相差了1.1 GB

執行了首個Windows Container MSSQL後的系統, 我叫它winMSSQL

注意這個sa密碼必須符合SQL賬號密碼複雜性原則

https://msdn.microsoft.com/en-us/library/ms161959.aspx?f=255&MSPPError=-2147217396

docker run -d --name winMSSQL -p 1433:1433 -e sa_password=xxxxx -e ACCEPT_EULA=Y microsoft/mssql-server-windows

接下來我要用SQL Management Studio來連接看看

今日為止要連接到vNEXT 版本的SQL我們需要下載SQL Server Management Studio (17.0 RC1)

這個版本可以支援從SQL 2008到Azure SQL到vNEXT CTP的SQL Server, 

但由於還在測試階段, 微軟不建議我們安裝到投產環境, 在下載安裝時記僅要下載符合自己Windows語言的版本

安裝程式好像會自動偵測你的系統語言, 但在我的電腦上用Chrome會偵測錯誤...

https://msdn.microsoft.com/en-us/library/mt238290.aspx

只有17.0 RC1才會安裝支援vNEXT版本的部件

我們先看看這台winMSSQL取得了甚麼IP 地址來進行連線

docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' winMSSQL

以下是這台Docker SQL Server的基本資料, 只有17.0 RC1才能顯示所有正確的資訊

留意如果你要投產的話要購買授權

可以執行如建立新Table的動作

也可以丟東西進去, 就跟一台正常的SQL Server沒兩樣

我們來用用一個新的docker指令 docker stats

這個指令好比我們開啟了Docker的效能指針, 會根據工作兩一直跳出實時資料

例如如果我把100萬筆資料寫進Table時它的CPU%和磁碟機讀寫I/O會跳高 

插入百萬筆資料耗時4:27

又例如我想把線程使用率到提到最高的時候,執行以下的SQL Script...

在docker stats上可以看到CPU使用率在12.5%, 在主機上顯示兩個CPU處於100%使用狀況

這是因為這個SQL Server只用到到2個CPU來操作 (這個之後會說明如何轉變Docker可以使用的系統資源)

玩了一下, 我們來玩玩linux版本的, 先停止運行這台winMSSQL, 好歹這是台Windows的SQL噢...

docker stop winMSSQL轉用Linux Containers...

一陣子我們再用docker version來檢查是不是已經轉過去linux了

再去拿Linux版本的MSSQL下來, 說實在, 大家喜歡Linux版本其中一個很大的原因是它真的超迷你啊...

整個image的大少只有965 MB...實在太神奇了

運行我們一個叫linuxMSSQL的Container

docker run --name linuxMSSQL -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=DOTsblogswater11!' -p 1433:1433 -d microsoft/mssql-server-linux

你可能會遇到Container運行後查看狀況它立即就Exited,

這時你應該到Docker的Setting頁, 看看Advanced, 是不是只分配2 GB記憶體及Docker

因為MSSQL for Linux on Docker需要最少4 GB記憶體分配才能啟動

 

解決這個問題後應該能夠保持container在運行狀態了
同樣的我們以SQL management Studio 連線進去看看, 留意這次Platform顯示是Linux 

但當檢查Docker stats時...唔, 出了問題


https://forums.docker.com/t/docker-stats-questions/811/6

查找了一下狀況, 在Linux Container上, 如果顯示的CPU使用率超過了100%是使用了超過1個CPU核心的意思

那..好像不可以和Windows Container直接比較比我還是做做相同的實驗

同樣插入100萬條資料的系統使用狀況如下...可以看到CPU好像是平均地在使用的


最後耗時是5:35, 好像沒有比較快的速度

同樣做CPU繁忙測試, CPU使用率也跟Windows Container的組合不太一樣

看來Linux和Windows Container的核心Kernal 在Docker for Windows上有顯著的分別

不過詳細的分別還需要再進一步研究

這篇我們看到同一個產品在Linux和Windows Container上有甚麼分別

下一篇我們再來研究效能方面的其他資料!