问题引入

这天老鸟火急火燎的找到菜鸟:“鸟儿啊,按照你之前的文章SQL on Linux Run on Docker,当我销毁SQL on Linux Docker容器以后,我容器中的所有数据库数据丢失啦,怎么办,怎么办啊?”。
菜鸟一脸懵逼:“我是参照微软官方文档来的啊?难道这帮XX连这个问题都没有想到?”。于是,菜鸟开始了问题的重现和解决方法。

问题重现

按照上一篇文件启动的Docker容器,SQL on Linux实例中的数据库文件真的会随着Docker容器的销毁而消失,造成数据丢失的灾难吗?这一节进行问题重现和复盘。

启动Docker容器

使用Docker Run命令启动SQL on Linux服务,映射到母体机41433端口上。

$ docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=SQLOnLinux@123' -p 41433:1433 -d microsoft/mssql-server-linux

创建测试对象

使用SSMS连接到Docker母体机41433端口上,执行下面的测试代码:创建测试数据库、创建测试表、初始化两条数据和查询测试表。

IF DB_ID('TestDb') IS NULL    CREATE DATABASE TestDb;
GOUSE TestDbGOIF OBJECT_ID('dbo.Test', 'U') IS NOT NULLDROP TABLE dbo.TestGOCREATE TABLE dbo.Test(RowID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY,Name VARCHAR(20) NOT NULL);INSERT INTO dbo.TestSELECT 'A' UNION ALL SELECT 'B';SELECT * FROM dbo.Test;

结果如下图展示:

销毁Docker容器

接下来模拟Docker容器销毁过程:我们需要使用Docker Stop停止SQL on Linux容器,然后使用Docker rm删除这个容器,接下来再次启动Docker容器,最后检查测试数据库、测试表和数据是否存在。如果不存在,说明Docker容器中的数据已经丢失。

$ docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                     NAMES8c1202ff7a33        microsoft/mssql-server-linux   "/bin/sh -c /opt/m..."   2 minutes ago       Up 2 minutes        0.0.0.0:41433->1433/tcp   suspicious_liskov
...
$ docker stop 8c1202ff7a338c1202ff7a33
$ docker rm 8c1202ff7a338c1202ff7a33
$ docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=SQLOnLinux@123' -p 41433:1433 -d microsoft/mssql-server-linux83cd4ca5cdf3d370118c10d8b783b204f86aa7b50fd7e334a27542d2cf7a1230

检查测试对象

再次使用SSMS连接到Docker母体机41433端口,查看测试数据库,展示如下图:

从这个结果来看,测试数据库已经丢失。说明Docker容器与容器中的数据库是命运共同体、同生死共命运。如果Docker容器销毁,容器中的数据库数据也随之丢失。这个是用户数据的灾难,我们需要迫切解决这个问题。看来老鸟说的大实话啊。

解决问题

SQL on Linux对Mac Docker Volume的限制

要解决这个问题,我们需要引入Docker的Volume技术。简单的说,这个技术的核心思想就是在启动Docker容器的时候,将Docker容器中的目录映射到母体机的目录,Docker容器对这个目录的所有操作会反映到母体机的这个映射目录里面。当Docker容器销毁的时候,母体机的这个映射目录会被保留下来。这样,我们的数据库数据文件不会随着容器的销毁而消失了,继而就解决了这个问题。但是,偏偏目前SQL on Linux不支持Mac操作系统的Docker Volume特性。详情参见微软官方文档:Run the SQL Server Docker image on Linux, Mac, or Windows
关键的地方,截图如下展示:

Mac系统Docker就真的不支持SQL on Linux Docker容器的Volume吗?让我们来试试看:

$ docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=SQLOnLinux@123' -p 41433:1433 -v /Users/cherish/Downloads/linuxsqldata:/var/opt/mssql -it microsoft/mssql-server-linux
Configuring Microsoft(R) SQL Server(R)...
Microsoft(R) SQL Server(R) setup failed with error code 1. Please check the setup log in /var/opt/mssql/log for more information.

的确启动Docker容器的过程中就会报告错误,详细的错误日志信息如下:

$ cat ~/Downloads/linuxsqldata/log/errorlog
2017-02-09 13:20:06.62 Server      Microsoft SQL Server vNext (CTP1.2) - 14.0.200.24 (X64) Jan 10 2017 19:15:28 Copyright (C) 2016 Microsoft Corporation. All rights reserved.on Linux (Ubuntu 16.04.1 LTS)
2017-02-09 13:20:06.76 Server      UTC adjustment: 0:00
2017-02-09 13:20:06.80 Server      (c) Microsoft Corporation.
2017-02-09 13:20:06.84 Server      All rights reserved.
2017-02-09 13:20:06.88 Server      Server process ID is 4116.
2017-02-09 13:20:06.92 Server      Logging SQL Server messages in file 'C:\var\opt\mssql\log\errorlog'.
2017-02-09 13:20:06.98 Server      Registry startup parameters: -d C:\var\opt\mssql\data\master.mdf-l C:\var\opt\mssql\data\mastlog.ldf-e C:\var\opt\mssql\log\errorlog
2017-02-09 13:20:07.09 Server      Command Line Startup Parameters:--setup--sa-password
2017-02-09 13:20:07.58 Server      Error: 17113, Severity: 16, State: 1.
2017-02-09 13:20:07.58 Server      Error 87(The parameter is incorrect.) occurred while opening file 'C:\var\opt\mssql\data\master.mdf' to obtain configuration information at startup. An invalid startup option might have caused the error. Verify your startup options, and correct or remove them if necessary.

解决方案

巴嘎,这里就又引入了另外一个问题,如何解决Mac系统上SQL on Linux的Docker容器不支持Volume的问题?不要惊慌,淡定,当然是有办法的,这个解决方法便是这篇文章存在的意义。解决方法如下:

$ docker create -v /var/opt/mssql --name sql41433data microsoft/mssql-server-linux2e1deac3c2bffa5f6cd97dfdc3683c59628538550ea9010d16214906c299cf54$ docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=SQLOnLinux@123' -p 41433:1433 --volumes-from sql41433data -it --name linuxsql41433 microsoft/mssql-server-linux

大概30秒后,Docker容器中的SQL实例服务起来以后,首先,参照问题重现中创建测试对象,然后销毁Docker容器,接下来再次启动Docker容器。

$ docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                     NAMES596f3bfebb8a        microsoft/mssql-server-linux   "/bin/sh -c /opt/m..."   57 seconds ago      Up 56 seconds       0.0.0.0:41433->1433/tcp   linuxsql41433
...
$ docker stop 596f3bfebb8a596f3bfebb8a
$ docker rm 596f3bfebb8a596f3bfebb8a
$ docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=SQLOnLinux@123' -p 41433:1433 --volumes-from sql41433data -it --name linuxsql41433 microsoft/mssql-server-linux

最后检查测试对象,截图如下:

其实,从启动过程的日志,我们也可以看到TestDb已经启动。

说明这个解决方法切实有效。

最后总结

这篇文章解决了Docker容器中SQL on Linux实例数据库与容器本身同生死同命运的问题,使得用户数据在容器被销毁时得以保留。更加详细的过程和步骤,可以参看youku视频:http://v.youku.com/v_show/id_XMjUwNDE5MTA3Mg==.html

相关文章:

  • SQL Server 急救包(First Responder Kit)入门教程

  • SQL Server on Linux 理由浅析

  • SQLServer On Linux Package List on CentOS

  • SQL Server on Linux的文件和目录结构

  • 个性化配置你的SQL Server on Linux

  • SQL on Linux Run on Docker

原文地址:https://yq.aliyun.com/articles/69517


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

如何使Mac Docker支持SQL on Linux容器Volume特性相关推荐

  1. php 获取路由器mac地址,php如何获取网卡MAC地址(支持WIN与LINUX系统)

    /** 获取网卡的MAC地址:目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址 **/ class GetMacAddr{ var $return_array = array(); / ...

  2. 迁移数据库到SQL on Linux Docker

    问题引入 前一篇文章,菜鸟找到了SQL on Linux Docker容器销毁后,容器中的数据库文件可以得以保留的方法,老鸟非常开心.所以,今天又提出了新的问题:"鸟儿,如果我想把我的数据库 ...

  3. 基于事件驱动架构构建微服务第5部分:容器化(Web Api Core 和 SQL Server Linux)

    原文链接:https://logcorner.com/building-microservices-through-event-driven-architecture-part5-dockerizat ...

  4. Linux 容器 (LXC) 介绍

    自云计算兴起以来,微服务一直在稳步流行.亚马逊和 Netflix 等公司正在使用云平台来提供他们最需要的服务.容器是此类云原生应用程序的核心.容器是一个隔离的环境,可促进微服务并提供卓越的扩展性和快速 ...

  5. Docker安装 下载镜像 部署容器 备份 创建私服

    Docker 学习目标: 掌握Docker基础知识,能够理解Docker镜像与容器的概念 完成Docker安装与启动 掌握Docker镜像与容器相关命令 掌握Tomcat Nginx 等软件的常用应用 ...

  6. SQL on Linux Run on Docker

    摘要 SQL Server 2016以及SQL on Linux版本已经支持跑在Docker容器中,也展示微软拥抱开源的决心和勇气.这篇博文就是以SQL on Linux为例,看看如何将SQL Ser ...

  7. linux win im,IM即时通讯软件“喧喧”介绍:支持Windows、Linux、Mac系统

    喧喧是一款免费.开源.安全的IM即时通信软件,它支持Windows.Linux.Mac系统,Linux平台提供64位/32位的.tar.gz..deb..rpm软件包下载,兼容Ubuntu和CentO ...

  8. 修改Mac默认设置使Mac支持NTFS硬盘的读写

    前言 NTFS (New Technology File System),是 Windows环境的文件系统,当然,MacOS系统也支持,只不过因为竞品和专利的原因,Mac上的NTFS读写功能被隐藏了. ...

  9. 有没有一种文件系统可以支持所有的操作系统(Win+Linux+Mac)而且支持大文件而且不需要辅助软件呢?

    有没有一种文件系统可以支持所有的操作系统(Win+Linux+Mac)而且支持大文件而且不需要辅助软件呢? 在Mac, Linux, Windows下,没有一种文件系统能够同时支持他们三者,还能支持大 ...

最新文章

  1. 教你使用IOS内置的排错命令
  2. SpringBoot+Mybatis 框架之 @SelectProvider注解方式搭建
  3. 前端学习(2848):鼠标点击事件
  4. 西瓜哥:公有云也“All-Flash”?
  5. fx5u mc协议_SLMP协议和MC协议
  6. 微信小程序--引用外部字体(云开发实现)
  7. 英语不规则动词变化时态变化表
  8. 计算机主板维修,计算机主板维修从业技能全程通(70M)*
  9. 25行Java代码将普通图片转换为字符画图片和文本
  10. 2022考公务员难还是考研难?
  11. 【优秀论文解读】UV-SLAM: Unconstrained Line-based SLAM Using Vanishing Points for Structural Mapping
  12. 科幻电影虚拟世界中的8大服务器
  13. ESP32 报错is installed, but the tool failed to run
  14. python class tynu()_Pisanie pierwszej aplikacji Django, część 4.
  15. GitHub 安装及使用
  16. php通过api获取天气信息,调用API获取城市天气信息
  17. My设置密码报错:ERROR 1819 (HY000): Your password does not satisfy the current policy requir
  18. 抢单软件开发原理_软件开发原理
  19. matlab疑难问题笔记
  20. 怎么在网页上嵌入新浪微博页面

热门文章

  1. C++的enum hack
  2. 公司服务器iSCSI网络硬盘连接故障
  3. 微软:Vista SP2是最安全的操作系统
  4. 本科 8年经验,20k的Offer,接还是不接?
  5. Linq 下的 Take() 方法内部机制是怎样的?
  6. 【Redis】有序集合的交集与并集
  7. 【翻译】WPF 中附加行为的介绍 Introduction to Attached Behaviors in WPF
  8. 初识ABP vNext(9):ABP模块化开发-文件管理
  9. 使用过滤器模式,让客户关怀中的代码更加干净整洁
  10. Kubernetes是容器化微服务的圣杯么?