终于按时完成第二篇。本来准备着手讲一些实践,但是数据库部分没有讲到,部分实践会存在一些问题,于是就有了此篇以及后续——数据库容器化。本篇将从SQL Server容器化实践开始,并逐步讲解其他数据库的容器化实践,中间再穿插一些知识点和实践细节。在编写的过程中,我一直处于一种矛盾的心理,是一笔带过呢?还是尽可能的将实践细节全部讲到位呢?最后,我选择了后者,虽然要花费更多的精力,但是既然开始了本次教程,就尽量写到位吧。

目录

数据库容器化

什么是数据库?

数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。因此,所谓“数据库”是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。

目前主流的数据库分为关系型数据库和非关系型数据库(NoSQL)。

关系型数据库和非关系型数据库对比

主流的数据库

关系型数据库:

· Microsoft SQL Server(Microsoft)

· MySQL(开源)

· Oracle(甲骨文)

· MariaDB(MySQL的代替品)

· PostgreSQL(开源)

· DB2(IBM)

非关系型数据库:

· MongoDB(面向文档)

· CouchDB(面向文档,Apache基金会)

· Redis(键值对数据库)

· MemcacheDB(键值对数据库)

· Hypertable

· Hadoop HBase

数据库容器化

随着Docker的流行,主流的数据库厂商均提供了相关的Docker镜像,因此我们能够非常方便的将数据库托管到容器之中,用于测试和开发环境(现阶段)

注意,现阶段我们不推荐在容器中托管正式环境的数据库,目前数据库容器化还存在一些问题、不适应性以及质疑,并且还缺乏成熟的案例和方案(已经有很多厂商在做这块的探索了,包括阿里、京东)。

数据库容器化绝不是一个伪命题,数据库容器化是值得我们来探索的一个方向,而且应是一种必然的趋势。在本篇中,我们不做过多探讨。

接下来,笔者将逐步和大家分享如何将主流的数据库托管到容器之中。

Sql Server容器化

SQL Server是由Microsoft开发和推广的关系数据库,其在操作数据库管理系统 (ODBMS) 领域处于领先水平,目前已经提供SQL Server 2019预览版。其中,SQL Server 2017 跨出了重要的一步,它力求通过将 SQL Server 的强大功能引入 Linux、基于 Linux 的 Docker 容器和 Windows,使用户可以在 SQL Server 平台上选择开发语言、数据类型、本地开发或云端开发,以及操作系统开发。

因此,在本篇教程中,我们将使用SQL Server 2017来进行演示。

镜像说明

官方镜像分为Windows版本和Linux版本,官方镜像说明页为:

https://hub.docker.com/r/microsoft/mssql-server

这里我们主要介绍Linux版本的镜像。

环境要求

· Docker Engine 1.8+。

· Docker overlay2存储驱动程序。

· 至少2 GB的磁盘空间。

· 至少2 GB 的 RAM。如果您在Docker for Mac或Windows上运行,请确保为Docker VM分配足够的内存。

· Linux 上的 SQL Server 的系统要求。

环境变量

必填项:

· ACCEPT_EULA = Y(表示接受最终用户许可协议,否则无法启动)

· SA_PASSWORD = <强密码> (密码必须符合复杂密码要求,包含大小写字母以及数字或特殊符号,长度不能少于8个字符,否则无法启动)

注意项:

· MSSQL_PID = <your_product_id | edition_name>(用于设置产品ID(PID)或版本,默认值:Developer)

值范围支持Developer、Express、Standard 、Enterprise、EnterpriseCore、产品密钥 ,一般情况下,我们使用Developer即可,即开发版本,其包含企业版所有的功能,足够我们用于开发和测试。

其他:

运行 SQL Server 容器镜像

PowerShell运行

在Windows系统之上,我们可以使用PowerShell来运行SQL Server镜像。脚本如下所示:

docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=123456abcD" `

-p 1433:1433 --name mySqlServer `

-d mcr.microsoft.com/mssql/server:2017-latest

相关参数说明如下所示:

参数

描述

-e “ACCEPT_EULA=Y”

将 ACCEPT_EULA 变量设置为任意值,以确认接受最终用户许可协议。 SQL Server 映像的必需设置。

-e “SA_PASSWORD =123456abcD”

指定至少包含 8 个字符且符合 SQL Server 密码要求的强密码。 SQL Server 映像的必需设置。

-p 1433:1433

建立主机环境(第一个值)上的 TCP 端口与容器(第二个值)中 TCP 端口的映射。 在此示例中,SQL Server 侦听容器中的 TCP 1433 并公开的端口 1433,在主机上。

--name sql1

为容器指定一个自定义名称,而不是使用随机生成的名称。 如果运行多个容器,则无法重复使用相同的名称。

mcr.microsoft.com/mssql/server:2017-latest

SQL Server 2017 Linux 容器映像。

注意:密码应符合 SQL Server 默认密码策略,否则容器无法设置 SQL Server,将停止工作。 默认情况下,密码必须至少为 8 个字符长,且包含三个以下四种字符集的字符:大写字母、 小写字母、 十进制数字和符号。 你可以通过执行 docker logs 命令检查错误日志。

执行之后(镜像不存在会自动拉取,大家也可以使用拉取命令下拉取镜像,比如:docker pull mcr.microsoft.com/mssql/server:2017-latest),会默认创建一个使用 SQL Server 2017 开发人员版的容器,端口为1433,密码为123456abcD。

 

镜像拉取完成之后成功启动:

 

当然,大家也可以通过命令行查看:

docker ps -a

如果“状态(STATUS)”列显示“UP”,则 SQL Server 将在容器中运行,并侦听“端口”列中指定的端口。

Bash Shell运行

如果是Linux系统,我们可以通过Bash Shell执行以下命令:

sudo docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=123456abcD' \

-p 1433:1433 --name mySqlServer \

-d mcr.microsoft.com/mssql/server:2017-latest

管理SQL Server

使用SQL Server Management Studio来管理SQL Server

SQL Server Management Studio (SSMS)是 Microsoft 免费提供为开发和管理需求的 SQL 工具套件的一部分。 SSMS 是一个集成的环境,若要访问、 配置、 管理、 管理和开发 SQL Server 的所有组件。 它可以连接到任何平台上运行这两个在本地,在 Docker 容器中和云中的 SQL Server。 它还连接到 Azure SQL 数据库和 Azure SQL 数据仓库。 SSMS 将大量图形工具与丰富的脚本编辑器相结合,各种技术水平的开发人员和管理员都能访问 SQL Server。

SSMS 提供适用于 SQL Server 的大量开发和管理功能,包括执行以下任务的工具:

· 配置、 监视和管理单个或多个 SQL Server 实例

· 部署、 监视和升级数据层组件,如数据库和数据仓库

· 备份和还原数据库

· 生成和执行 T-SQL 查询和脚本,并查看结果

· 生成数据库对象的 T-SQL 脚本

· 查看和编辑数据库中的数据

· 以可视方式设计 T-SQL 查询和数据库对象,如视图、 表和存储的过程

下载地址:

https://docs.microsoft.com/zh-cn/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-2017

安装完成之后,我们就可以启动SSMS来进行管理我们的数据库了。

设置

描述

服务器类型

默认为数据库引擎;请勿更改此值。

服务器名称

输入目标计算机的名称或IP 地址。

身份验证

对于 Linux 上的 SQL Server,请使用SQL Server 身份验证

登录

输入数据库服务器上具有访问权限的用户的名称 (例如,默认值SA安装过程中创建的帐户)。

密码

指定的用户输入的密码 (对于SA帐户,则此安装过程中创建)。

如图所示,我们输入上述内容,以及刚才我们通过环境变量设置的密码“123456abcD”,点击连接,可以看到如下图所示的界面:

 

我们可以通过界面来管理我们的数据库以及执行相关的查询:

 

使用sqlcmd管理数据库

我们可以在容器内部使用 SQL Server 命令行工具 sqlcmd 来连接和管理SQL Server。

1. 使用 docker exec -it 命令在运行的容器内部启动交互式 Bash Shell

PowerShell:

docker exec -it mySqlServer "bash"

bash:

sudo docker exec -it mySqlServer "bash"

2. 使用 sqlcmd 进行本地连接。 默认情况下,sqlcmd 不在路径之中,因此需要指定完整路径。

命令:

/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '123456abcD'

成功的话,就会显示 sqlcmd 命令提示符 1> 。

3. 执行SQL脚本。

比如,我们创建一个MyDb数据库,可以执行以下脚本:

CREATE DATABASE MyDB

SELECT Name from sys.Databases

GO

第一行为创库脚本,第二行执行查询,查询服务器上所有数据库的名称,第三行为执行。

注意:只有输入GO才会立即执行之前的命令。

执行结果如上图所示。我们通过SSMS可以查看到我们刚才创建的数据库:

除了以上方式,我们也可以在容器外使用sqlcmd连接数据库:

sqlcmd -S localhost,1433 -U SA -P "123456abcD"

注意:退出SQLCMD命令为:QUIT

其他管理工具

除了以上的连接管理工具,大家还可以使用以下工具进行连接:

· Visual Studio Code

 

· Azure Data Studio(跨平台数据库工具,适用于在Windows,MacOS和Linux上使用Microsoft系列内部部署和云数据平台的数据专业人员)

 

· mssql-cli(SQL Server的新的交互式命令行查询工具,支持跨平台,开源,提供智能提示和语法高亮等)

https://cloudblogs.microsoft.com/sqlserver/2017/12/12/try-mssql-cli-a-new-interactive-command-line-tool-for-sql-server/

作者:雪雁
出处:http://www.cnblogs.com/codelove/

Docker最全教程——从理论到实战(十)的更多相关文章

  1. Docker最全教程——从理论到实战(八)

    在本系列教程中,笔者希望将必要的知识点围绕理论.流程(工作流程).方法.实践来进行讲解,而不是单纯的为讲解知识点而进行讲解.也就是说,笔者希望能够让大家将理论.知识.思想和指导应用到工作的实际场景和实 ...

  2. Docker最全教程——从理论到实战(七)

    在本系列教程中,笔者希望将必要的知识点围绕理论.流程(工作流程).方法.实践来进行讲解,而不是单纯的为讲解知识点而进行讲解.也就是说,笔者希望能够让大家将理论.知识.思想和指导应用到工作的实际场景和实 ...

  3. Docker最全教程——从理论到实战(六)

    托管到腾讯云容器服务 托管到腾讯云容器服务,我们的公众号“magiccodes”已经发布了相关的录屏教程,大家可以结合本篇教程一起查阅.   自建还是托管? 在开始之前,我们先来讨论一个问题——是自建 ...

  4. Docker最全教程——从理论到实战(五)

    往期内容链接 Docker最全教程——从理论到实战(一) Docker最全教程——从理论到实战(二) Docker最全教程——从理论到实战(三) Docker最全教程——从理论到实战(四) 本篇教程持 ...

  5. Docker最全教程——从理论到实战

    Docker最全教程——从理论到实战(一) Docker最全教程——从理论到实战(二) Docker最全教程——从理论到实战(三) Docker最全教程——从理论到实战(四) Docker最全教程—— ...

  6. Docker最全教程——从理论到实战(一)

    容器是应用走向云端之后必然的发展趋势,因此笔者非常乐于和大家分享我们这段时间对容器的理解.心得和实践. 本篇教程持续编写了2个星期左右,只是为了大家更好地了解.理解和消化这个技术,能够搭上这波车. 你 ...

  7. Docker最全教程---从理论到实战

    目录 前言 随着生产力的发展尤其是弹性架构的广泛应用(比如微服务),许多一流开发者都将应用托管到了应用容器上,比如Google.微软.亚马逊.腾讯.阿里.京东和新浪. 从未来的发展方向来看,容器引擎将 ...

  8. Docker最全教程——从理论到实战(二十二)

    前言 最近正在抽时间编写k8s的相关教程,很是费时,等相关内容初步完成后,再和大家分享.对于k8s,还是上云更为简单.稳定并且节省成本,因此我们需要对主流云服务的容器服务进行了解,以便更好地应用于生产 ...

  9. Docker最全教程——从理论到实战(十五)

    前言 Java是一门面向对象的优秀编程语言,市场占有率极高,但是在容器化实践过程中,发现官方支持并不友好,同时与其他编程语言的基础镜像相比(具体见各语言镜像比较),确实是非常臃肿. 本篇仅作探索,希望 ...

  10. Docker最全教程——从理论到实战(四)

    往期内容链接 https://www.cnblogs.com/codelove/p/10030439.html https://www.cnblogs.com/codelove/p/10036608. ...

随机推荐

  1. com.google.gson json字符串的序列化与反序列化

    经常做协议的时候用到json,个人习惯是定义协议文档,很少在这中场景中定义类,使用对象. 这里使用一个人物有名字,性别,有一个物品列表做个简单示例记录. 序列化 JsonObject jo=new J ...

  2. P1197 [JSOI2008]星球大战 [删边求连通块个数]

    展开 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的 ...

  3. SSH自动断开后重连的解决方案

    注:本文出自博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 本文源链接:https://www.cnblogs.com/chloneda/p/ssh-conn ...

  4. 二次剩余的判定及Cipolla算法

    二次剩余 ppp是奇素数.所有的运算都是在群Zp∗Z_{p}^{*}Zp∗​中的运算.方程x2=a≠0x^2=a \neq 0x2=a̸​=0问是否有解,以及解是什么?若有解,aaa就是模ppp的二次 ...

  5. Java Web 笔记(3)

    8.JSP 8.1.什么是JSP Java Server Pages : Java服务器端页面,也和Servlet一样,用于动态Web技术! 最大的特点: 写JSP就像在写HTML 区别: HTML只 ...

  6. python数据类型(第三弹)

    本文着重介绍python语言的两种数据类型——列表和元组 列表 相比于整型.浮点型等数据类型,列表是一个复合数据类型,它更像一个容器,可以容纳多种不同类型的数据. 如上图:列表a中装进去了字符串&qu ...

  7. NodeJS_0001:关于install的方式

    最近在写Node程序的时候,突然对 npm install 的-save和-save-dev 这两个参数的使用比较混乱.其实博主在这之前对这两个参数的理解也是模糊的,各种查资料和实践后对它们之间的异同 ...

  8. linux安装Nginx 以及 keepalived 管理Nginx

    linux安装Nginx 1.1将Nginx素材内容上传到/usr/local目录(pcre,zlib,openssl,nginx)(注意:必须登录用对这个文件具有操作权限的) 1.2安装pcre库 ...

  9. JS基础-语法+流程控制语句+函数+内置对象【数组】

    JS语法: Javascript基本数据类型:undefined/null/Boolean/number/string 复杂数据类型:object typeof用来检测变量的数据类型 typeof的使 ...

  10. CF575A Fibonotci [线段树+矩阵快速幂]

    题意 \(s\{\}\) 是一个循环数列 循环节为 \(n\),你可以改掉 \(m\) 项,这 \(m\) 项独立,且不影响循环节 考虑线段树维护矩阵,单点修改最多m次,每次矩阵快速幂就完事了 // ...