假如我们应用程序需要一台 mssql 数据库来持久化数据,我们将 mssql 数据库运行于 Docker 容器中:

docker run -d -p 1433:1433 -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<数据库SA账户的密码>" --mount type=volume,src=mssqlvol,dst=/var/opt/mssql --name mssql mcr.microsoft.com/mssq l/server

注意:-v 或者 --volume 标志适用于独立容器,--mount 标志适用于 Swarm 服务。但是在 Docker 17.06 版本之后, --mount 标志同样适用于独立容器。

执行上面的指令,如果 mssqlvol 不存在的话,会创建一个 mssqlvol 数据卷。它指向 mssql 容器的 /var/opt/mssql 目录, 此目录也是 mssql 数据库默认的数据存放目录。

备份

使用命令:

docker run --rm -volumes-from mssql --mount type=bind,src=$(pwd),dst=/backup ubuntu tar cvf /backup/backup.tar /var/opt/mssql

解析:

  1. 启动一个新的容器并且从 mssql 容器进行挂载数据卷 (设置了此容器自动移除 --rm )
  2. 此容器挂载本地主机的文件夹 ($(pwd) 会输出当前终端的工作目录)作为容器的 /backup 目录
  3. 执行 tar cvf /backup/backup.tar /var/opt/mssql 来对 /var/opt/mssql 目录压缩为 backup.tar

因为此临时容器挂载了本地目录作为 /backup 目录, 所以当我们执行完上面的命令之后, 我们会发现本地目录,也就是当前工作目录下会有 backup.tar 文件产生。至此备份完毕。

还原

在创建一个 mssql 容器作为测试:

docker run -d -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<数据库SA账户的密码>" -p 1434:1433 --mount type=volume,src=mssql-vol2,dst=/var/opt/mssql --name mssql2 mcr.microsoft.com/mssq l/server

运行临时容器将备份文件解压缩至指定目录:

docker run --rm --volumes-from mssql2 --mount type=bind,src=$(pwd),dst=/backup ubuntu bash -c "tar xf /backup/backup.tar -C / && ls /var/opt/mssql/data -l"

执行完上述指令之后, 我们会看到数据库文件已经存在于 /var/opt/mssql/data 文件夹下,至此,还原操作已经完成。

下面是拓展内容:

我们上面使用的是 mssql 数据库, 这里文件的直接覆盖是不能完成附加操作的, 下面我们需要手动附加数据库:

docker exec -it mssql2 /bin/bash

/opt/mssql-tools/bin/sqlcmd -S . -U sa -P '<账户sa密码>'

使用 SELECT NAME FROM sys.Databases 来查看所有数据库名(需要键入 GO 才会执行)

sp_attach_db @dbname='需要附加的数据库名', @filename1='/var/opt/mssql/data/还原的数据库文件名'

执行完之后, 再使用 SELECT NAME FROM sys.Databases 就可以看到我们还原的数据库了

另外,官方网站上也给出了一种数据库备份还原的方式。

总结

应用数据的备份还原对于系统来说是至关重要的, Volume 与 Bind Mount 都是非常实用的持久化介质。

Docker 学习笔记(持久化数据的备份,还原)的更多相关文章

  1. Redis学习——Redis持久化之AOF备份方式保存数据

    新技术的出现一定是在老技术的基础之上,并且完善了老技术的某一些不足的地方,新技术和老技术就如同JAVA中的继承关系.子类(新技术)比父类(老技术)更加的强大! 在前面介绍了Redis学习--Redis ...

  2. Docker学习笔记总结

    Docker学习笔记 https://yeasy.gitbooks.io/docker_practice/content/   一 环境搭建 Ubuntu安装 .添加软件源的GPG密钥 curl -f ...

  3. Docker学习笔记之--.Net Core项目容器连接mssql容器(环境:centos7)

    前一节演示在docker中安装mssql,地址:Docker学习笔记之--安装mssql(Sql Server)并使用Navicat连接测试(环境:centos7) 本节演示 .Net Core项目容 ...

  4. Docker学习笔记 — 配置国内免费registry mirror

    Docker学习笔记 — 配置国内免费registry mirror Docker学习笔记 — 配置国内免费registry mirror

  5. docker学习笔记1 -- 安装和配置

    技术资料 docker中文官网:http://www.docker.org.cn/ 中文入门课程:http://www.docker.org.cn/book/docker.html docker学习笔 ...

  6. Docker学习笔记之一,搭建一个JAVA Tomcat运行环境

    Docker学习笔记之一,搭建一个JAVA Tomcat运行环境 前言 Docker旨在提供一种应用程序的自动化部署解决方案,在 Linux 系统上迅速创建一个容器(轻量级虚拟机)并部署和运行应用程序 ...

  7. Windows phone 8 学习笔记(2) 数据文件操作

    原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方 ...

  8. docker~学习笔记索引

    回到占占推荐博客索引 使用docker也有段时间了,写了不少文章与总结,下面把它整理个目录出来,方便大家去学习与检索! docker~学习笔记索引 docker~linux下的部署和基本命令(2017 ...

  9. Docker学习笔记 - Docker容器内部署redis

    Docker学习笔记(2-4)Docker应用实验-redist server 和client的安装使用 一.获取redis容器(含客户端和服务端) 二.创建服务端容器 1.在终端A中运行redis- ...

随机推荐

  1. LG1484 种树

    题意 \(N\)个数,至多选\(k\)个,相邻两数不能同时选,问最大价值. 思路 一种假的思路:直接扔进对里面,每次都选最大的可以选的,再把两边和自己标记为不能选,一直贪心下去.是不是很有道理? 假在 ...

  2. JavaScript 中 return,return true,return false

    1.return: ①return + 表达式,调用函数,并返回表达式的值 ②return,终止函数 ③当代码执行到return语句时,函数返回一个结果就结束运行了,return后面的语句根本不会执行 ...

  3. VS Code mac版全局搜索失效最简单解法

    网上百度到的一些说法,说是添加以下命令行 "search.exclude": { "system/": true, "!/system/**/*.ps ...

  4. 【Mac】-NO.161.Mac.1 -【MacOS Error running 'Tomcat 8.5.371': Cannot run program Permission denied】

    Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...

  5. 获取地址栏url

    Url=${window.location.protocol}//${window.location.host}${window.location.pathname}

  6. java面试题 wait和sleep区别

    sleep() 方法是线程类(Thread)的静态方法,让调用线程进入睡眠状态,让出执行机会给其他线程,等到休眠时间结束后,线程进入就绪状态和其他线程一起竞争cpu的执行时间 wait()是Objec ...

  7. andorid开发build.gradle 增加几种产品的方法

    因为需要有些ndk的开发,cmakelists里需要定义不同的变量,这个在网上搜索解决方案,不是很容易就直接找到答案. 尝试了不少,最后找到解决方案.升级Gradle3.0,这个文章价值高. 在ras ...

  8. 又见thrift异常之TApplicationException: Internal error processing..

    客户端调用获取商户提现产品手续费的接口,出现异常org.apache.thrift.TApplicationException: Internal error processing getMercha ...

  9. spark-shell的Scala的一些方法详解

    Tom,DataBase,80 Tom,Algorithm,50 Tom,DataStructure,60 Jim,DataBase,90 Jim,Algorithm,60 Jim,DataStruc ...

  10. PHP 面向对象之单例模式-有些类也需要计划生育

    一个类只有一个实例对象 1.含义 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局的提供这个实例.它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用. 2 ...