閱讀644 返回首頁    go 阿裏雲 go 技術社區[雲棲]


SQLServer IN Windows Container初探

SQLServer IN Windows Container初探

背景

微軟早在14年就宣布與Docker合作把容器技術搬到Windows上,終於在去年9月Windows Server 2016
中落地了這一承諾,推出了能與Docker相容的Container技術.

關於Windows Container具體也有2種類型Windows Containers

Windows Server Containers – provide application isolation through process and namespace isolation technology. A Windows Server container shares a kernel with the container host and all containers running on the host.

Hyper-V Containers – expand on the isolation provided by Windows Server Containers by running each container in a highly optimized virtual machine. In this configuration the kernel of the container host is not shared with the Hyper-V Containers.

簡單理解Server Containers更像是Linux上的Docker容器-共享kernel,而Hyper-V Containers則是有自己獨立的kernel,其它關於隔離性、安全性等區別也基於此擴展開。

後續的實驗部分我們都是在阿裏雲ECS上使用Windows Server Containers做測試

--ECS OS Versin
Windows Server 2016 Datacenter <X64>

--SQLServer Versin  
Microsoft SQL Server vNext (CTP1.4) - 14.0.405.198 (X64) 

Docker

--可用的providers    
get-packageprovider
Install-Module -Name DockerMsftProvider -Repository PSGallery -Force

1.png

--安裝Docker
Install-Package -Name docker -ProviderName DockerMsftProvider -Verbose

3.png

--重啟生效
Restart-Computer -Force

--利用Windows 2016的OneGet(PackageManagement)找到最後我們需要的Docker
--前兩個步驟可以看出OneGet實際更像是一個管理包管理的工具

--已安裝的包
get-package

4.png

這裏對比Linux Docker有不同,Linux Docker中base image可以自己做但Windows上目前隻能從官方獲取

--base image
microsoft/windowsservercore
microsoft/nanoserver

more microsoft image

SQLServer

microsoft/mssql-server-windows

--拉取鏡像
docker pull microsoft/mssql-server-windows

6.png

這個過程需要一些時間主要是鏡像源在國外,所以測試中我使用的是香港的ECS盡量快些

7.png

如果想自己構建安裝參考 mssql-server-windows/dockerfile 從這裏申請下載SQLServer安裝 SQL Server vNext Community Technology Preview

#啟動SQLServer
docker run -d -p 1433:1433 -e sa_password=*** -e ACCEPT_EULA=Y microsoft/mssql-server-windows

#容器網絡配置
GET-VMSwitch

GET-NetNat

Get-ContainerNetwork

10.png

測試中使用的是NAT模式,其它網絡模式參考 Windows Container Networking

15.png

容器內部訪問

#Windows 賬號認證登錄
docker exec -it <DOCKER_CONTAINER_ID> sqlcmd

#SQL 賬號認證登錄
docker exec -it <DOCKER_CONTAINER_ID> sqlcmd -S. -Usa

8.png

容器外部-宿主機訪問

宿主機通過 SQL Server Management Studio (SSMS)訪問,這一客戶端程序在2016後已經作為單獨的組件提供,對應安裝包已經不再集成 NEW SSMS

#獲取到的信息包括剛才的密碼,需要注意
docker inspect 86bb05abfd3d28187742ebb60b2a6fefb80596644b1469c94099ada408217602

#根據template隻解析容器的私網ip
docker inspect -f '{{ .NetworkSettings.Networks.nat.IPAddress }}' 86bb05abfd3d28187742ebb60b2a6fefb80596644b1469c94099ada408217602

9.png

容器外部-跨機訪問

#鏈接容器宿主機的外網IP

12.png

從SQLServer上也可以明顯的看出幾種訪問方式不同

14.png

session51是容器內Windows認證訪問,client address解析為local machine

session52、53是容器內SQL認證訪問,client address解析為容器的私網IP

session54是 容器外部-跨機訪問,client address解析為來源公網IP

session55是 容器外部-宿主機訪問,client address解析為宿主機的虛網卡地址,對每個容器來說相當於一個vSwitch,容器的vNIC都會鏈接到這個Hyper-V Virtual Switch

注意:跨機訪問時保證windows防火牆不要block鏈接,阿裏雲安全組規則也要設置正確,本例是對特定IP做了授權
13.png

問題

  • 對於Container隔離性的選擇

    從安全上講hyper-v container更合適公有雲;Server Container 更適合私有雲內部使用,適合可信多租戶、應用間彼此相互信任、應用在容器中不違反隔離邊界,這裏可以分解為2點:

    • 應用安全性
    • 隔離有效性
  • 業內實際案例

    Azure自然提供了對應的公有雲服務且是基於hyper-v container的,對於業務場景來說目前隻看到攜程有實際案例Windows Container在攜程的應用

  • SQLServer在Container中的表現能否滿足用戶需求

    這個在後續會給出一些測試

  • Licence問題

    在Windows Container中提供SQLServer服務具體的Licence計費方式還不清晰

最後更新:2017-04-20 16:00:41

  上一篇:go c/c++測試函數的運行時間(八種方法)
  下一篇:go iCocos