上一节我们讲述了SQL Server容器化实践(注意,SQL Server现在也支持跨平台),本节将讲述如何持久保存数据,并且接下来将逐步讲解其他数据库(MySql、Redis、Mongodb等等)的容器化实践,中间再穿插一些知识点和实践细节。由于实践需要花费大量的时间,而目目前业务繁忙,只能加班来进行一些实践并编写,如果编写比较慢,请多多海涵。

目录

如何持久保存数据?

默认情况下,在容器内创建的所有文件都存储在可写容器层中。这意味着:

· 当该容器不再存在时,数据不会持久存在,并且如果另一个进程需要,则可能很难从容器中获取数据。

· 容器的可写层紧密耦合到运行容器的主机。数据迁移很麻烦。

· 写入容器的可写层需要存储驱动程序来管理文件系统。存储驱动程序使用Linux内核提供统一的文件系统。与直接写入主机文件系统相比,这种额外的抽象降低了性能 。

因此,如果我们使用容器命令docker rm删除了容器,那么容器中的所有内容均将丢失,包括 SQL Server 和数据库文件。对于数据库(不仅仅是SQL Server)来说,了解 Docker 中的数据持久性至关重要那么我们如何在docker中持久保存我们的数据呢,即使关联的容器已经删除的情况下?

使用数据卷持久保存数据库文件

卷是保存Docker容器中的数据的首选机制。虽然绑定挂载依赖于主机的目录结构,但卷完全由Docker管理。主要有如下好处:

· 易于备份或迁移。

· 可以使用Docker CLI命令或Docker API管理卷。

· 适用于Linux和Windows容器。

· 可以在多个容器之间更安全地共享卷。

· 卷驱动程序允许在远程主机或云提供程序上存储卷,加密卷的内容或添加其他功能。

· 新卷可以通过容器预先填充内容。

因此,通常情况下,卷相对于容器的可写层中的持久数据来说是更好的选择,因为卷不会增加容器的大小,并且卷的内容存在于给定容器的生命周期之外。接下来,我们就一起来实践。

方式一,使用主机目录

首先,我们可以将主机目录加载为容器的数据卷,用来存储数据库文件。例如,我们可以通过-v <host directory>:/var/opt/mssql命令参数来完成需求:

PowerShell:

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

-p 1433:1433 --name mySqlServer `

-v d:/temp/data:/var/opt/mssql `

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

bash:

docker run -e 'ACCEPT_EULA=Y' \

-e 'SA_PASSWORD=123456abcD' \

-p 1433:1433 \

--name mySqlServer \

-v /temp/data:/var/opt/mssql \

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

注意:-v参数应该在-d参数之前。

-v or –volume用于映射卷,冒号“:”前面的目录是宿主机目录,冒号后面的目录是容器内目录。

执行成功后,我们可以看到容器已正常运行,并且主机目录已绑定:

我们启动SSMS工具创建一个数据库,然后打开本地资源管理器即可看到:

接下来,我们删除容器,然后来验证数据库文件是否任然保留:

PowerShell:

set-location D:\temp\data\data

docker stop mySqlServer

docker rm mySqlServer

ls

执行结果如下所示:

值得注意的是,SQL Server会自动从目录/var/opt/mssql挂载数据库,我们可以使用以下步骤来验证:

第一步:

PowerShell:

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

-p 1433:1433 --name mySqlServer `

-v d:/temp/data:/var/opt/mssql `

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

docker exec -it mySqlServer "bash"

第二步:

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

第三步:

SELECT Name from sys.Databases

GO

注意:SQL Server容器启动时需要一些时间,启动完成后才能连接。

方式二,使用数据卷

我们可以使用docker volume命令来创建卷,然后

PowerShell:

docker volume create my-data

docker volume ls

docker run -e "ACCEPT_EULA=Y" `

-e "MSSQL_SA_PASSWORD=123456abcD" `

-p 1433:1433 --name mySqlServer `

-v my-data:/var/opt/mssql `

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

我们可以使用以下命令来检查数据卷:

docker volume inspect my-data

同样的,我们也可以使用上一节的命令删除容器并再次创建来验证数据是否丢失。这里我们就不做演示了。

Docker最全教程——数据库容器化之持久保存数据(十一)的更多相关文章

  1. Docker最全教程——数据库容器化(十)

    终于按时完成第二篇.本来准备着手讲一些实践,但是数据库部分没有讲到,部分实践会存在一些问题,于是就有了此篇以及后续——数据库容器化.本篇将从SQL Server容器化实践开始,并逐步讲解其他数据库的容 ...

  2. Docker最全教程——Redis容器化以及排行榜实战(十三)

    前言 容器教程的路还很长,笔者尽量根据实践来不断地完善.由于在编写的过程中还会有完善和补充,后续可能会以番外来补充. 接下来会分享TeamCity.树莓派等内容,节奏可能会有点跳脱. 另外,长沙.NE ...

  3. Docker最全教程——MongoDB容器化(十二)

    MongoDB容器化 MongoDB是一个免费的.开源的.跨平台分布式面向文档存储的数据库,由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和 ...

  4. Docker最全教程

    摘自雪雁大佬的博客,地址:https://www.cnblogs.com/codelove/default.html 目录: Docker最全教程——从理论到实战(一) Docker最全教程——从理论 ...

  5. Docker最全教程之使用Node.js搭建团队技术文档站(二十三)

    前言 各种编程语言均有其优势和生态,有兴趣的朋友完全可以涉猎多门语言.在平常的工作之中,也可以尝试选择相对适合的编程语言来完成相关的工作. 在团队技术文档站搭建这块,笔者尝试了许多框架,最终还是选择了 ...

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

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

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

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

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

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

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

    终于按时完成第二篇.本来准备着手讲一些实践,但是数据库部分没有讲到,部分实践会存在一些问题,于是就有了此篇以及后续——数据库容器化.本篇将从SQL Server容器化实践开始,并逐步讲解其他数据库的容 ...

随机推荐

  1. POJ_3304_Segments_线段判断是否相交

    POJ_3304_Segments_线段判断是否相交 Description Given n segments in the two dimensional space, write a progra ...

  2. B20J_1419_Red Is Good_期望DP

    B20J_1419_red is good_期望DP 题意:有R张红牌和B张黑牌,一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元.可以随时停止翻牌,在最优策略下平均能得到多少钱. 分析:期望DP ...

  3. BZOJ_3261_最大异或和_可持久化trie

    BZOJ_3261_最大异或和_可持久化trie Description 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x, ...

  4. OutputStream与PrintWriter的使用与区别

    1.OutputStream 使用步骤: 获取输出流 设置中文 将字符串转换成字节数组 调用outputStream.write() 这里只贴出doGet方法的内容: protected void d ...

  5. Spark学习之数据读取与保存总结(二)

    8.Hadoop输入输出格式 除了 Spark 封装的格式之外,也可以与任何 Hadoop 支持的格式交互.Spark 支持新旧两套Hadoop 文件 API,提供了很大的灵活性. 要使用新版的 Ha ...

  6. 读书笔记:深入理解java虚拟机(二)创建对象的时候需要访问哪几块内存

    @TOC 对象在内存中如何储存 对象访问在java语言中无处不在,是最普通的程序行为,但即使是最简单的访问,也会涉及到java栈,java堆,方法去三个最重要的内存区域的关联关系,比如下面这段代码: ...

  7. Qt之表格控件蚂蚁线

    一.蚂蚁线 摘自互动百科:在图像影像软件中表示选区的动态虚线,因为虚线闪烁的样子像是一群蚂蚁在跑,所以俗称蚂蚁线.在Poshop,After Effect等软件中比较常见. 背景:用过excel的同学 ...

  8. 3D数学 矩阵常用知识点整理

    1.矩阵了解 1)矩阵的维度和记法 (先数多少行,再数多少列) 2)矩阵的转置 行变成列,第一行变成第一列...矩阵的转置的转置就是原矩阵            即        3)矩阵和标量的乘法 ...

  9. 中小研发团队架构实践之生产环境诊断工具WinDbg

    生产环境偶尔会出现一些异常问题,WinDbg或GDB是解决此类问题的利器.调试工具WinDbg如同医生的听诊器,是系统生病时做问题诊断的逆向分析工具,Dump文件类似于飞机的黑匣子,记录着生产环境程序 ...

  10. 那些年我们一起踩过的Dubbo"坑"

    前言 微服务架构在如今的9102年已经不是什么新鲜的话题了,但是怎么做好微服务架构,却又是一个永恒的话题.比如服务粒度的划分,怎么控制好粗细?服务划分后,对于项目的部署会有什么改变?...  这会是一 ...