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
--安裝Docker
Install-Package -Name docker -ProviderName DockerMsftProvider -Verbose
--重啟生效
Restart-Computer -Force
--利用Windows 2016的OneGet(PackageManagement)找到最後我們需要的Docker
--前兩個步驟可以看出OneGet實際更像是一個管理包管理的工具
--已安裝的包
get-package
這裏對比Linux Docker有不同,Linux Docker中base image可以自己做但Windows上目前隻能從官方獲取
--base image
microsoft/windowsservercore
microsoft/nanoserver
SQLServer
microsoft/mssql-server-windows
--拉取鏡像
docker pull microsoft/mssql-server-windows
這個過程需要一些時間主要是鏡像源在國外,所以測試中我使用的是香港的ECS盡量快些
如果想自己構建安裝參考 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
測試中使用的是NAT模式,其它網絡模式參考 Windows Container Networking
容器內部訪問
#Windows 賬號認證登錄
docker exec -it <DOCKER_CONTAINER_ID> sqlcmd
#SQL 賬號認證登錄
docker exec -it <DOCKER_CONTAINER_ID> sqlcmd -S. -Usa
容器外部-宿主機訪問
宿主機通過 SQL Server Management Studio (SSMS)訪問,這一客戶端程序在2016後已經作為單獨的組件提供,對應安裝包已經不再集成 NEW SSMS
#獲取到的信息包括剛才的密碼,需要注意
docker inspect 86bb05abfd3d28187742ebb60b2a6fefb80596644b1469c94099ada408217602
#根據template隻解析容器的私網ip
docker inspect -f '{{ .NetworkSettings.Networks.nat.IPAddress }}' 86bb05abfd3d28187742ebb60b2a6fefb80596644b1469c94099ada408217602
容器外部-跨機訪問
#鏈接容器宿主機的外網IP
從SQLServer上也可以明顯的看出幾種訪問方式不同
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做了授權
問題
-
對於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