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

SQLServer IN Windows Container初探

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

SQLServer IN Windows Container初探


--重启生效
Restart-Computer -Force

--利用Windows 2016的OneGet(PackageManagement)找到最后我们需要的Docker
--前两个步骤可以看出OneGet实际更像是一个管理包管理的工具

--已安装的包
get-package

SQLServer IN Windows Container初探

这里对比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

SQLServer IN Windows Container初探

这个过程需要一些时间主要是镜像源在国外,所以测试中我使用的是香港的ECS尽量快些

SQLServer IN Windows Container初探

如果想自己构建安装参考 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

SQLServer IN Windows Container初探

测试中使用的是NAT模式,其它网络模式参考 Windows Container Networking

SQLServer IN Windows Container初探

容器内部访问


#Windows 账号认证登录
docker exec -it <DOCKER_CONTAINER_ID> sqlcmd

#SQL 账号认证登录
docker exec -it <DOCKER_CONTAINER_ID> sqlcmd -S. -Usa

SQLServer IN Windows Container初探

容器外部-宿主机访问

宿主机通过 SQL Server Management Studio (SSMS)访问,这一客户端程序在2016后已经作为单独的组件提供,对应安装包已经不再集成 NEW SSMS



#获取到的信息包括刚才的密码,需要注意
docker inspect 86bb05abfd3d28187742ebb60b2a6fefb80596644b1469c94099ada408217602

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

SQLServer IN Windows Container初探

容器外部-跨机访问

#链接容器宿主机的外网IP

SQLServer IN Windows Container初探

从SQLServer上也可以明显的看出几种访问方式不同

SQLServer IN Windows Container初探

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做了授权
SQLServer IN Windows Container初探

问题

  • 对于Container隔离性的选择

    从安全上讲hyper-v container更合适公有云;Server Container 更适合私有云内部使用,适合可信多租户、应用间彼此相互信任、应用在容器中不违反隔离边界,这里可以分解为2点:

    • 应用安全性
    • 隔离有效性
  • 业内实际案例

    Azure自然提供了对应的公有云服务且是基于hyper-v container的,对于业务场景来说目前只看到携程有实际案例Windows Container在携程的应用

  • SQLServer在Container中的表现能否满足用户需求

    这个在后续会给出一些测试

  • Licence问题

    在Windows Container中提供SQLServer服务具体的Licence计费方式还不清晰

上一篇:独家揭秘阿里云SQL Server AlwaysOn集群版重大突破


下一篇:SQLServer如何获取客户端IP