假如我们应用程序需要一台 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 都是非常实用的持久化介质。

最新文章

  1. ReactJS webpack实现JS模块化使用的坑
  2. C/C++ 网络库介绍
  3. phpize 动态添加 PHP 扩展的错误及解决方案
  4. PHP设计模式——代理模式
  5. libtiff库使用
  6. PHP拓展配置redis、phalcon
  7. 异步 JavaScript 之 macrotask、microtask
  8. Swift 编译时间优化
  9. curl zip上传并且解压
  10. Android应用程序后台加载数据
  11. Windows 2008 r2上安装MySQL
  12. 虚拟机时间同步14 Aug 04:09:18 ntpdate[2941]: no server suitable for synchronization found
  13. 第六节:详细讲解Java中的装箱与拆箱及其字符串
  14. ubuntu下修改网卡名称
  15. c++入门之关于cin,cout以及数据流的认识
  16. 《Linux内核分析》期终总结
  17. CI 数据库操作总结
  18. 【Java并发编程】2、无锁编程:lock-free原理;CAS;ABA问题
  19. sql语句 update 字段=字段+字符串
  20. 数据类型-DataFrame

热门文章

  1. Linux基础命令2
  2. @CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy
  3. pdf下载速度
  4. Github上36893颗星!这个被称为下一代企业级应用首选技术你学了么?
  5. Linux进程PRI与NI值
  6. .htaccess使用方法介绍
  7. Spring Boot入门 and Spring Boot与ActiveMQ整合
  8. puppeteer(三)常用API
  9. 跨站访问如何保证session的正常使用
  10. IT题库8-死锁