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计费方式还不清晰