摘要
SQL Server 2016以及SQL on Linux版本已经支持跑在Docker容器中,也展示微软拥抱开源的决心和勇气。这篇博文就是以SQL on Linux为例,看看如何将SQL Server实例部署在Docker容器中。
背景
大概在两个月之前,在SQL On Linux刚发布预览版本的时候,我写过一篇文章,讲如何将SQL Server on Linux (vNext)部署到CentOS 7.2上,详情参见:Happy Birthday to MSSQL On Linux
这篇文章则是谈谈如何将SQL on Linux实例部署在Docker容器中,包含以下几个方面内容:
几个前提
SQL on Linux Run on Docker
连接Docker容器中的SQL实例
多实例部署场景
几个前提
SQL on Linux要能够成功部署到Docker容器里,需要满足以下三个前提条件。
Docker引擎需要1.8以上版本
$ docker version
Client:
Version: 1.13.0
API version: 1.25
Go version: go1.7.3
Git commit: 49bf474
Built: Wed Jan 18 16:20:26 2017
OS/Arch: darwin/amd64
Server:
Version: 1.13.0
API version: 1.25 (minimum version 1.12)
Go version: go1.7.3
Git commit: 49bf474
Built: Wed Jan 18 16:20:26 2017
OS/Arch: linux/amd64
Experimental: true
至少4GB存储空间
至少4GB内存空间:使用以下方法修改:Docker icon on Menu Bar => Preferences => Advanced => Change the Memory to 4GB => Apply & Restart。
SQL on Linux Run on Docker
首先,我们使用docker search mssql查找Docker Hub上的mssql-server-linux镜像模板;
接着,我们使用docker pull把这个microsoft/mssql-server-linux镜像拉到本地;
然后,我们使用docker run命令启动sql on linux的实例,这个过程(相当于SQL on Linux的安装)大概不到2秒钟就完成了。这里需要注意几个参数:终端用户的许可协议Y;SA的密码;docker容器母体机映射的端口1433;SQL on Linux在docker容器中的端口1433;docker镜像的名字microsoft/mssql-server-linux。
最后,我们使用docker ps查看这个Docker容器进程信息。
$ docker search mssql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
microsoft/mssql-server-linux Official images for Microsoft SQL Server o... 148
rsmoorthy/mssql MSSQL Database (version SQL2000) 6 [OK]
ppoffice/mssql-odbc Dockerfile of Ubuntu Trusty with Microsoft... 3 [OK]
swapnillinux/mssql Microsoft SQL Server (mssql) vNext CTP 1.1... 2 [OK]
...
$ docker pull microsoft/mssql-server-linux
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
microsoft/mssql-server-linux latest 54df779d52d7 2 weeks ago 1.05 GB
$ docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=SQLOnLinux@123' -p 1433:1433 -d microsoft/mssql-server-linux
7f275e4a31e1876e90d8ef02d321c8351ae89373d8273d75656eee7b8fecb80a
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7f275e4a31e1 microsoft/mssql-server-linux "/bin/sh -c /opt/m..." 10 seconds ago Up 8 seconds 0.0.0.0:1433->1433/tcp festive_saha
连接Docker容器中的SQL实例
SQL on Linux实例已经在Docker容器中部署完毕,接下来就是如何连接到我们的SQL Server实例,这个和我们平时使用SSMS连接常规SQL Server实例没有任何两样。但需要注意SSMS连接的Server Name应该是Docker容器母体机的IP和映射到的端口,用户名为Sa,密码是启动Docker容器时给定的密码,比如:
执行以下测试代码:
IF DB_ID('TestDb') IS NULL
CREATE DATABASE TestDb;
GO
USE TestDb
GO
IF OBJECT_ID('dbo.Test', 'U') IS NOT NULL
DROP TABLE dbo.Test
GO
CREATE TABLE dbo.Test(
RowID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY
,Name VARCHAR(20) NOT NULL
);
INSERT INTO dbo.Test
SELECT 'A' UNION ALL SELECT 'B';
SELECT * FROM dbo.Test;
执行情况如下:
多实例部署
由于直接将SQL on Linux部署在Linux系统平台,SQL Server只支持一个系统部署一个SQL on Linux实例。那么,如何将多实例的SQL on Linux部署在一个系统里面呢?那么,就是要借助于我们的Docker了,我们只需要在Docker母体机上多起几个SQL Server模板的Docker容器,映射到母体机不同的端口号上即可。比如,我这里再部署两个SQL on Linux实例,分别映射到41433和51433端口上。
$ docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=SQLOnLinux@123' -p 41433:1433 -d microsoft/mssql-server-linux
$ docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=SQLOnLinux@123' -p 51433:1433 -d microsoft/mssql-server-linux
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d03512ce3d70 microsoft/mssql-server-linux "/bin/sh -c /opt/m..." 6 seconds ago Up 4 seconds 0.0.0.0:51433->1433/tcp competent_golick
b9418ce94a09 microsoft/mssql-server-linux "/bin/sh -c /opt/m..." 57 seconds ago Up 55 seconds 0.0.0.0:41433->1433/tcp elegant_spence
7f275e4a31e1 microsoft/mssql-server-linux "/bin/sh -c /opt/m..." 6 minutes ago Up 6 minutes 0.0.0.0:1433->1433/tcp festive_saha
$ docker stop d03512ce3d70
d03512ce3d70
$ docker stop b9418ce94a09
b9418ce94a09
在几秒过后,连接到多个实例,截图如下:
总结
SQL on Linux运行在Docker之上可以在秒级别新建、启动SQL Server实例,非常的方便快捷;并且还可以突破SQL on Linux在Linux系统只能够安装一个实例的限制。这是SQL Server拥抱开源的尝试,也是微软开源策略的全新尝试。