SQL on Linux Run on Docker

摘要

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拥抱开源的尝试,也是微软开源策略的全新尝试。

时间: 2024-10-28 01:08:17

SQL on Linux Run on Docker的相关文章

如何使Mac Docker支持SQL on Linux容器Volume特性

问题引入 这天老鸟火急火燎的找到菜鸟:"鸟儿啊,按照你之前的文章SQL on Linux Run on Docker,当我销毁SQL on Linux Docker容器以后,我容器中的所有数据库数据丢失啦,怎么办,怎么办啊?". 菜鸟一脸懵逼:"我是参照微软官方文档来的啊?难道这帮XX连这个问题都没有想到?".于是,菜鸟开始了问题的重现和解决方法. 问题重现 按照上一篇文件启动的Docker容器,SQL on Linux实例中的数据库文件真的会随着Docker容器的

迁移数据库到SQL on Linux Docker

问题引入 前一篇文章,菜鸟找到了SQL on Linux Docker容器销毁后,容器中的数据库文件可以得以保留的方法,老鸟非常开心.所以,今天又提出了新的问题:"鸟儿,如果我想把我的数据库从SQL on Windows迁移到SQL on Linux Docker,如何才能做到呢?". 菜鸟一听这个问题,头脑迅速反应出数据库迁移的两种方法:备份还原和分离附加.就让我们来试试吧.详细的过程可以参见我录制的Youku视频:12_SQLonLinux_Docker_Migration 构建S

《Docker容器:利用Kubernetes、Flannel、Cockpit和Atomic构建和部署》——第2章 搭建容器运行时环境 2.1标准Linux系统的Docker配置

第2章 搭建容器运行时环境 自构建之初,Docker就运行在Linux之上.但与虚拟机不同,虚拟机包含了整个操作系统,而容器本身只是依靠单独的操作系统为其提供运行环境.这就是说,我们有诸多可选的方式来创建Docker的工作环境.具体方式包括以下这些. 标准Linux:多个主要的Linux发行版已将Docker打包在其中.如需最新的Docker特性,只要安装相应Linux发行版的最新版本即可.切记,Docker与操作系统有着密切的联系,因此,Linux的早期版本可能并不包含Docker运行所需的全

《Docker容器:利用Kubernetes、Flannel、Cockpit和Atomic构建和部署》——2.2 容器式Linux系统的Docker配置

2.2 容器式Linux系统的Docker配置 我们使应用程序容器化,不遗余力地使其变小和变高效,但如果最终要将这些容器部署到缓慢.臃肿的操作系统中,那将使一切努力失去意义.在不断演进的容器模型中,既然容器已包含运行应用程序所需的可执行文件.库以及其他组件,宿主操作系统完全可以简化到只保留运行容器所需的功能. Project Atomic和CoreOS这两个项目的目标是提供专为运行容器而优化的操作系统.这样的操作系统既能够直接运行在硬件上,也能运行在公有云(如亚马逊的EC2或者Google Co

Begin automatic SQL Tuning Advisor run for special tuning task "SYS_AUTO_SQL_TUNING_TASK"

hu May 29 22:00:00 2014 Setting Resource Manager plan SCHEDULER[0x310A]:DEFAULT_MAINTENANCE_PLAN via scheduler window Setting Resource Manager plan DEFAULT_MAINTENANCE_PLAN via parameter Thu May 29 22:00:00 2014 Starting background process VKRM Thu M

SQL SERVER LINUX

以前在Linux平台上访问SQL Server时常用的方式有:http://www.freetds.org/https://sourceforge.net/projects/jtds/这方面的资料已经很多了,java方面还有微软官方的jdbc驱动 现在在微软的开放战略下,使用起来更方便了 #mssql jdbchttps://github.com/Microsoft/mssql-jdbcjdbc开源了 #Linux上运行的服务端这个是docker上运行的服务端,牛气,直接在Linux上运行htt

linux中让 Docker 使用 HTTPS的教程

Docker 启动监听端口后,使用的是 http,可以远程来管理 Docker 主机. 这样的场景存在弊端,API 层面是没有提供用户验证.Token 之类身份验证功能,任何人都可以通过地址加端口来控制 Docker 主机,为了避免这样的情况发生,Docker 官方也支持 https 方式,不过需要我们自己来生成证书. 通过 OpenSSL 命令来生成 CA 证书.服务器私钥.客户端证书.签名,openssl 命令比较复杂,我用脚本直接生成: # cat certgen.sh set -ex [

linux下设置Docker运行时根目录

因第一次玩 Docker,装系统的时候没有分配 /var 分区,而500多G的剩余空间都分给了 /home. 当玩起 Docker,才发现这货默认存放位置是在 /var/lib/docker. 解决方法有二: 一是重装系统,这也太不人性化了,忽略...下次部署 Docker 宿主机的时候得好好分区下. 二是改变 Docker 默认存放路径. 查了下手册发现: -g, --graph="/var/lib/docker" 设置Docker运行时根目录 使用 --graph 参数:docke

sql server-qt linux 连接sqlserver

问题描述 qt linux 连接sqlserver 求大神指教~ 我用的是ubuntu14.04-32bit的操作系统,看过网好多的相关的配置, 都是用通过unixodbc+freetds来连接,在Qt中却一直找不到数据源, 通过终端用命令通过freetds去连接windows的Sqlserver是可以连接上的, 求真正实践过的大神指教,小弟都配置都配置过很多次还是未成功,本人的系统是在虚拟机中的!谢谢~~~ 解决方案 用C等包一个库来调用freetds,然后给qt来调用