上一节我们讲述了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最全教程——从理论到实战(一)

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

Docker最全教程——从理论到实战(三)

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

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

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

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

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

Docker最全教程——从理论到实战(九)

Docker最全教程之使用Tencent&nbsp;Hub来完成CI(十)

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

原文地址:https://www.cnblogs.com/nasha/p/10260158.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

Docker最全教程——数据库容器化之持久保存数据(十二)相关推荐

  1. Docker最全教程——数据库容器化之持久保存数据(十一)

    Docker最全教程--数据库容器化之持久保存数据(十一) 原文:Docker最全教程--数据库容器化之持久保存数据(十一) 上一节我们讲述了SQL Server容器化实践(注意,SQL Server ...

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

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

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

    上一节我们讲述了数据库容器化之持久保存数据,本节将讲诉MongoDB容器化实践,并且接下来将逐步讲解其他数据库(MySql.Redis等等)的容器化实践,然后将讲诉一些分布式架构的项目实践.由于实践需 ...

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

    Docker最全教程--Redis容器化以及排行榜实战(十三) 原文:Docker最全教程--Redis容器化以及排行榜实战(十三) 前言 容器教程的路还很长,笔者尽量根据实践来不断地完善.由于在编写 ...

  5. docker 虚拟机搭建mongodb一主一从一复制_Docker最全教程——MongoDB容器化(十三)...

    上一节我们讲述了数据库容器化之持久保存数据,本节将讲诉MongoDB容器化实践,并且接下来将逐步讲解其他数据库(MySql.Redis等等)的容器化实践,然后将讲诉一些分布式架构的项目实践.由于实践需 ...

  6. Docker最全教程之使用 Visual Studio Code玩转Docker(二十一)

    VS Code是一个年轻的编辑器,但是确实是非常犀利.通过本篇,老司机带你使用VS Code玩转Docker--相信阅读本篇之后,无论是初学者还是老手,都可以非常方便的玩转Docker了!所谓是&qu ...

  7. Docker最全教程之使用.NET Core推送钉钉消息(二十)

    前言 上一篇我们通过实战分享了使用Go推送钉钉消息,由于技痒,笔者现在也编写了一个.NET Core的Demo,作为简单的对照和说明. 最后,由于精力有限,笔者希望有兴趣的朋友可以分享下使用CoreR ...

  8. Docker最全教程之使用TeamCity来完成内部CI、CD流程(十七)

    本篇教程主要讲解基于容器服务搭建TeamCity服务,并且完成内部项目的CI流程配置.教程中也分享了一个简单的CI.CD流程,仅作探讨.不过由于篇幅有限,完整的DevOps,我们后续独立探讨. 为了降 ...

  9. Docker最全教程之树莓派和Docker(十六)

    前言 树莓派(Raspberry Pi)是一台卡片电脑(只有信用卡大小),我们可以使用树莓派做很多事情,比如智能家居的中控.航空器.BT下载器.挖矿机.智能机器人.小型服务器(花生壳+网站)等等. 目 ...

最新文章

  1. bash shell 合并文件
  2. 机器学习5种特征选择的方法!
  3. iOS一些推荐的学习路径发展
  4. 你知道css单位fr吗?
  5. junit测试报告生成_这是东西:jUnit:动态测试生成
  6. java开发一款模拟写字板系统
  7. 最全编程语言在线 API 文档
  8. 并发库之CountDownLatch
  9. 实现一个闹钟_iPhone 闹钟停止时,如何自动播放你喜欢的音乐
  10. linux怎么打开rdp文件,Linux运维知识:linux实现rdp访问
  11. 异常:Invalid or unexpected token
  12. router阻止telnet自身的两种方法
  13. 迭代求解最优化问题——步长确定
  14. 小D课堂 - 零基础入门SpringBoot2.X到实战_第2节 SpringBoot接口Http协议开发实战_7、开发必备工具PostMan接口工具介绍和使用...
  15. iis支持java吗_如何让iis支持jsp,servlet
  16. 《Spring揭秘》学习部分总结
  17. [RQNOJ]PID34 / 紧急援救
  18. 使用xshell上传文件
  19. samba报错:smbd dead but pid file exists
  20. 使用Senparc.Weixin SDK搭建微信公众号服务程序

热门文章

  1. vue项目将token存在(vuex)store和localstorage中
  2. python应用POP3、IMAP、SMTP 协议,获取邮箱验证码
  3. 修复删除/var/lib/dpkg目录后,无法使用apt-get命令问题
  4. ES6入门之Symbol
  5. 《移动App测试的22条军规》—第1章1.2节移动App的生命周期
  6. Spring Boot 入门小目标 3 --- 先来试着热部署
  7. java jar包收集
  8. 在终端(Terminal)中用颜色显示不同类型文件
  9. group client policy无法登录,谢绝访问
  10. Solarwinds的NetFlow Traffic Analyzer中的Cisco设备配置