Docker最全教程——数据库容器化之持久保存数据(十一)
上一节我们讲述了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最全教程——数据库容器化(十)
终于按时完成第二篇.本来准备着手讲一些实践,但是数据库部分没有讲到,部分实践会存在一些问题,于是就有了此篇以及后续——数据库容器化.本篇将从SQL Server容器化实践开始,并逐步讲解其他数据库的容 ...
- Docker最全教程——Redis容器化以及排行榜实战(十三)
前言 容器教程的路还很长,笔者尽量根据实践来不断地完善.由于在编写的过程中还会有完善和补充,后续可能会以番外来补充. 接下来会分享TeamCity.树莓派等内容,节奏可能会有点跳脱. 另外,长沙.NE ...
- Docker最全教程——MongoDB容器化(十二)
MongoDB容器化 MongoDB是一个免费的.开源的.跨平台分布式面向文档存储的数据库,由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和 ...
- Docker最全教程
摘自雪雁大佬的博客,地址:https://www.cnblogs.com/codelove/default.html 目录: Docker最全教程——从理论到实战(一) Docker最全教程——从理论 ...
- Docker最全教程之使用Node.js搭建团队技术文档站(二十三)
前言 各种编程语言均有其优势和生态,有兴趣的朋友完全可以涉猎多门语言.在平常的工作之中,也可以尝试选择相对适合的编程语言来完成相关的工作. 在团队技术文档站搭建这块,笔者尝试了许多框架,最终还是选择了 ...
- Docker最全教程——从理论到实战(二十二)
前言 最近正在抽时间编写k8s的相关教程,很是费时,等相关内容初步完成后,再和大家分享.对于k8s,还是上云更为简单.稳定并且节省成本,因此我们需要对主流云服务的容器服务进行了解,以便更好地应用于生产 ...
- Docker最全教程——从理论到实战(七)
在本系列教程中,笔者希望将必要的知识点围绕理论.流程(工作流程).方法.实践来进行讲解,而不是单纯的为讲解知识点而进行讲解.也就是说,笔者希望能够让大家将理论.知识.思想和指导应用到工作的实际场景和实 ...
- Docker最全教程——从理论到实战(六)
托管到腾讯云容器服务 托管到腾讯云容器服务,我们的公众号“magiccodes”已经发布了相关的录屏教程,大家可以结合本篇教程一起查阅. 自建还是托管? 在开始之前,我们先来讨论一个问题——是自建 ...
- Docker最全教程——从理论到实战(十)
终于按时完成第二篇.本来准备着手讲一些实践,但是数据库部分没有讲到,部分实践会存在一些问题,于是就有了此篇以及后续——数据库容器化.本篇将从SQL Server容器化实践开始,并逐步讲解其他数据库的容 ...
随机推荐
- 【bzoj 3233】[Ahoi2013]找硬币 ——搜索
Description 小蛇是金融部部长.最近她决定制造一系列新的货币.假设她要制造的货币的面值为x1,x2,x3… 那么x1必须为1,xb必须为xa的正整数倍(b>a).例如 1,5,125, ...
- BZOJ_1823_[JSOI2010]满汉全席_2-sat+tarjan
BZOJ_1823_[JSOI2010]满汉全席_2-sat 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1823 分析:一道比较容易看出来的 ...
- P2P综述
原文参见:http://www.lotushy.com/?p=113 [TOC] 什么是P2P P2P全称是Peer-to-peer.P2P计算或P2P网络是一种分布式应用架构.它将任务或负载分发给P ...
- Shell 脚本中调用另一个 Shell 脚本的三种方式
主要以下有几种方式: Command Explanation fork 新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 ...
- 一份完整的阿里云 Redis 开发规范,值得收藏!
来源:yq.aliyun.com/articles/531067 作者:付磊-起扬 本文主要介绍在使用阿里云Redis的开发规范,从下面几个方面进行说明. 键值设计 命令使用 客户端使用 相关工具 通 ...
- 大数据技术之_19_Spark学习_03_Spark SQL 应用解析小结
========== Spark SQL ==========1.Spark SQL 是 Spark 的一个模块,可以和 RDD 进行混合编程.支持标准的数据源.可以集成和替代 Hive.可以提供 J ...
- Linux三剑客-grep || awk || sed
grep是一个强大的文本搜索工具 命令格式: grep [option] pattren file -a 将二进制文档以文本方式处理 -c 计算找到的符合行的次数 -i 忽略大小写 -n 顺便 ...
- visual studio code .net 开发
Visual Studio确实是相当好用,各种简化操作什么的简直不要太舒服.但其容量太大,有时不是很方便,所以今天简单介绍一下另一个工具--Visual Studio Code. 虽然相比于老大哥Vi ...
- 在个人博客中优雅的使用Gitalk评论插件
在上一篇博客<程序员如何从0到1搭建自己的技术博客>中,我们了解了如何快速的从0到1搭建一个个人博客. 其实细心的你会发现,该博客用到了一个评论插件,这个插件就是Gitalk. 如果想要在 ...
- Android-原笔迹手写的探索与开发
前言 这篇文章主要是关于移动端原笔迹的开发,让平板上的手写效果达到笔迹光滑且有笔锋. 介绍关于原笔迹的算法思路. 项目github地址 算法思路分析 曲线拟合算法 利用曲线拟合算法增加虚拟的点,使得 ...