前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >简单两例说明白 SQL Server Docker 的发布

简单两例说明白 SQL Server Docker 的发布

作者头像
Lenis
发布2019-12-25 11:03:54
6720
发布2019-12-25 11:03:54
举报
文章被收录于专栏:有关SQL有关SQL

一个简易版本的 SQL Server Docker 持续集成例子

总体来说,因为数据库文件与容器的集成度不同,发布 SQL Server Docker 有两种方式: 1 数据库文件内建于容器镜像之内 2 数据库文件游离于容器镜像之外

1 构建【数据库文件内建于容器镜像之内】的 SQL Server Docker 发布步骤如下:
1 Pull 一个最原始的 sql server docker 镜像

镜像来自于微软在 Docker Hub 上提供的初始容器。

2 编写第一版的数据库对象创建脚本

SQL 脚本:

代码语言:javascript
复制
CREATE DATABASE CRM 
GO 

USE CRM 
GO 

CREATE TABLE dbo.Account(
    AccountId INT IDENTITY(1,1),
    AccountName NVARCHAR(200) 
)

保存为 DBSchemaInit.sql

3 构建新容器镜像

构建自定义的容器镜像,最重要的是编写 Dockerfile.

代码语言:javascript
复制
[root@centos00 v1]# cat Dockerfile
FROM microsoft/mssql-server-linux
MAINTAINER Lenis Huang "huangyun_122@163.com"


ENV ACCEPT_EULA=Y
ENV SA_PASSWORD=1QAZ2WSX3EDC

EXPOSE 1433

最终似乎构建成功了:

代码语言:javascript
复制
[root@centos00 v1]# docker build -t=sqlserver/v1 .
Sending build context to Docker daemon 3.584 kB
Step 1/5 : FROM microsoft/mssql-server-linux
 ---> b2b20452a15b
Step 2/5 : MAINTAINER Lenis Huang "huangyun_122@163.com"
 ---> Running in 532a5f141f11
 ---> 182a1a9aed84
Removing intermediate container 532a5f141f11
Step 3/5 : ENV ACCEPT_EULA Y
 ---> Running in c72d741f2f8e
 ---> ee590cf78e2b
Removing intermediate container c72d741f2f8e
Step 4/5 : ENV SA_PASSWORD 1QAZ2WSX3EDC
 ---> Running in 67559621fd8d
 ---> 7d92d6155c25
Removing intermediate container 67559621fd8d
Step 5/5 : EXPOSE 1433
 ---> Running in 2bb8ee0440a4
 ---> 67f770bfdacd
Removing intermediate container 2bb8ee0440a4
Successfully built 67f770bfdacd
[root@centos00 v1]#
代码语言:javascript
复制
[root@centos00 v1]# docker images
REPOSITORY                               TAG                 IMAGE ID            CREATED             SIZE
sqlserver/v1                             latest              67f770bfdacd        36 seconds ago      1.44 GB

至此,一份崭新的可用于项目部署的 sql server docker 构建完毕。

代码语言:javascript
复制
[root@centos00 DockerNginx]# docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED              STATUS              PORTS                     NAMES
f29258559cb4        sqlserver/v1                   "/opt/mssql/bin/sq..."   About a minute ago   Up 59 seconds       0.0.0.0:32793->1433/tcp   dev_sqlv1

image

从 docker ps 执行的结果中看到运行着 sqlv1 镜像的容器,可以通过本机的 32793 端口连接到容器中 sql server 服务对应的 1433 端口。

在 Dev, STG, UAT 环境,都以 sqlv1 为蓝本,使应用都连接到在 sqlv1 容器中运行的数据库。开发测试中出现任何问题,都可以拿着 sqlv1 重建一个新的容器来运行数据库。

4 开发新一版本的数据库应用,将其应用于 sqlv1 镜像,进而构建 sqlv2 镜像
代码语言:javascript
复制

代码语言:javascript
复制
# Dockerfile

FROM sqlserver/v1
MAINTAINER Lenis Huang "huangyun_122@163.com"

ENV ACCEPT_EULA=Y
ENV SA_PASSWORD=1QAZ2wsx3EDC.
ENV PATH=${PATH}:/opt/mssql/bin:/opt/mssql-tools/bin

RUN mkdir sqlfiles

COPY DBSchemaInit.sql ./sqlfiles/DBSchemaInit.sql
COPY setup-database.sh ./sqlfiles/setup-database.sh
COPY entrypoint.sh ./sqlfiles/entrypoint.sh

RUN chmod a+x ./sqlfiles/setup-database.sh
RUN chmod a+x ./sqlfiles/entrypoint.sh

CMD bash ./sqlfiles/entrypoint.sh
代码语言:javascript
复制
# entrypoint.sh

echo 'starting database setup'
./sqlfiles/setup-database.sh &
/opt/mssql/bin/sqlservr
代码语言:javascript
复制
# setup-database.sh

echo 'please wait while database is starting up ...'

sleep 45s

echo 'try to connect to database in containder and create the sample db...'

/opt/mssql-tools/bin/sqlcmd -S localhost,1433 -U sa -P 1QAZ2wsx3EDC. -d master -i ./sqlfiles/DBSchemaInit.sql

echo 'sample db have been created!'

作为数据库部署,每次构建新容器,要关注的便是编写增量部署脚本,以替代第一次的数据库初始化脚本 DBSchemaInit.sql.

5 如此循环达到持续集成和发布

在这种发布流程中,要思考的问题是,如何在生产环境发布。

按照 docker 发布数据库的这套流程,能发现和规避的问题是:

数据库发布脚本的一致性。

在dev, stg, uat,prod 都是使用了同一套脚本,并且脚本有错误可以及时调整。不至于在单发生产环境的时候,由于在 dev,stg, uat 测试环境发布时,没有及时校验出脚本逻辑上错误,或者因为环境的影响,比如大家随意的在 dev,stg,uat 环境创建数据库对象,而导致发布脚本本身没有得以验证正确性与完整性。

数据库发布的快捷性。

原本需要dev,stg,uat,prod 都重新部署一台新的服务器。之后,应用数据库发布脚本。现在只要竭尽全力构建一台正确可用的 docker 镜像,基于这份镜像,可以实现多个平台同时部署。而应用只需要指定相应的 doker 名即可。在多台集群环境中,这种部署手法给运维带来极大便利。还记得 Linux 的 ssh shell 嘛,发明远程无密登录就是为了能让运维在多个服务器之间穿梭,而不用一台台去安装软件了。在大数据当道,时不时要求上千台集群服务器的时下,docker 可以看做是一剂良药。

而这套流程,需要考虑的地方在于,生产环境的发布稍微不同。同样的发布脚本,但是数据库文件是游离于容器之外的。所以严格来说,不能以这样的方式去发布生产环境。必须从头至尾的,将数据库文件隔离于容器。在构建容器之时,先附加数据库文件到镜像,再应用发布脚本,最终构建发布版本的容器镜像。这样的构建脚本(Dockerfile)才具有可移植性。
2 构建【数据库文件游离于容器镜像之外】的 SQL Server Docker 发布步骤如下:

有了上面的经验,这次就简单很多了,就是对 Dockerfile 增加 Volume 指令的修改。本质上,是用 Volume 中的磁盘空间来存储数据库文件。

唯一不同的便是 dockerfile 的编写 和指定挂载的本地文件

代码语言:javascript
复制
# Dockerfile 

FROM sqlserver/v1
MAINTAINER Lenis Huang "huangyun_122@163.com"

ENV ACCEPT_EULA=Y
ENV SA_PASSWORD=1QAZ2wsx3EDC.
ENV PATH=${PATH}:/opt/mssql/bin:/opt/mssql-tools/bin

RUN mkdir sqlfiles

COPY DBSchemaInit.sql ./sqlfiles/DBSchemaInit.sql
COPY setup-database.sh ./sqlfiles/setup-database.sh
COPY entrypoint.sh ./sqlfiles/entrypoint.sh

RUN chmod a+x ./sqlfiles/setup-database.sh
RUN chmod a+x ./sqlfiles/entrypoint.sh

VOLUME /sql/data

CMD bash ./sqlfiles/entrypoint.sh

加了 VOLUME 指令用来指定所有挂载的本地文件都被挂载到 /sql/data 上。

代码语言:javascript
复制
[root@centos00 v4]# mkdir -p /sql/data
[root@centos00 v4]# docker run -p 1433 --rm --name=dev_sqlv5 -v sqlvolume:/sql/data sqlserver/v5
代码语言:javascript
复制
[root@centos00 data]# docker volume inspect sqlvolume
[
    {
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/sqlvolume/_data",
        "Name": "sqlvolume",
        "Options": {},
        "Scope": "local"
    }
]

在 sqlvolume 指定的目录下面,我们可以看到任何被放在 docker 中 /sql/data 目录下的文件。当然我们也可以自己创建一个 volume 挂载上去。


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-09-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 有关SQL 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 构建【数据库文件内建于容器镜像之内】的 SQL Server Docker 发布步骤如下:
    • 1 Pull 一个最原始的 sql server docker 镜像
      • 3 构建新容器镜像
        • 4 开发新一版本的数据库应用,将其应用于 sqlv1 镜像,进而构建 sqlv2 镜像
          • 5 如此循环达到持续集成和发布
            • 按照 docker 发布数据库的这套流程,能发现和规避的问题是:
              • 而这套流程,需要考虑的地方在于,生产环境的发布稍微不同。同样的发布脚本,但是数据库文件是游离于容器之外的。所以严格来说,不能以这样的方式去发布生产环境。必须从头至尾的,将数据库文件隔离于容器。在构建容器之时,先附加数据库文件到镜像,再应用发布脚本,最终构建发布版本的容器镜像。这样的构建脚本(Dockerfile)才具有可移植性。
              • 2 构建【数据库文件游离于容器镜像之外】的 SQL Server Docker 发布步骤如下:
              相关产品与服务
              容器服务
              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档