上一节我们讲述了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. bzoj5253 [2018多省省队联测]制胡窜

    后缀自动机挺好毒瘤的题. 我们考虑哪些切点是不合法的.肯定是所有的匹配串都被切了. 我们考虑第一个切口的位置. 当第一个切口在第一个出现位置前时,第二个切口必须切掉所有的串. 当第一个切口在$l_{i ...

  2. BZOJ_4004_[JLOI2015]装备购买_线性基

    BZOJ_4004_[JLOI2015]装备购买_线性基 Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am) ...

  3. MATLAB R2017b安装及破解(安装详解)

    昨天知道有这个Matlab之后就开始想办法安装,今天为各位小伙伴解答昨天安装的过程,希望能够帮助到你们! 使用的镜像软件,我放在压缩包里面 如果你们感觉下载比较麻烦(可以直接发消息给我,我会发给你们的 ...

  4. springboot2.x里面访问静态资源的坑

    在spring boot的自定义配置类继承 WebMvcConfigurationSupport 后,发现自动配置的静态资源路径( classpath:/META/resources/,classpa ...

  5. 了解Scala反射

    本篇文章主要让大家理解什么是Scala的反射, 以及反射的分类, 反射的一些术语概念和一些简单的反射例子. 什么是反射 我们知道, Scala是基于JVM的语言, Scala编译器会将Scala代码编 ...

  6. .NET Core IdentityServer4实战 第二章-OpenID Connect添加用户认证

    内容:本文带大家使用IdentityServer4进行使用OpenID Connect添加用户认证 作者:zara(张子浩) 欢迎分享,但需在文章鲜明处留下原文地址. 在这一篇文章中我们希望使用Ope ...

  7. ES 10 - Elasticsearch的索引别名和索引模板

    目录 1 索引模板概述 1.1 什么是索引模板 1.2 索引模板中的内容 1.3 索引模板的用途 2 创建索引模板 3 查看索引模板 4 删除索引模板 5 模板的使用建议 5.1 一个index中不能 ...

  8. Spring Boot入门(一):使用IDEA创建Spring Boot项目并使用yaml配置文件

    由于公司最近在做技术转型(从.Net转Java),因此自己也开启了学习Java之路.学习Java怎么能不学习这几年这么火的Spring Boot框架,由于自己有总结的习惯,因此会把学习的过程以博客的形 ...

  9. 浅谈java线程池实现

    再进入主题之前,我们先了解几个概念,对读源码有所帮助,对于线程池的运行状态,有4个级别,分别是RUNNING,SHUTING,STOP,TIDING,TERMINATED 解释如下: The runS ...

  10. 解决ruby安装后无法添加淘宝gem源------------学习记录

    使用sass ,需要安装ruby,会建议移除gem源,添加淘宝的gem源,但是淘宝的镜像源已经停止维护啦!!用https://gems.ruby-china.com 代替即可. 操作如下: 1)删除原 ...