如何使Mac Docker支持SQL on Linux容器Volume特性

问题引入

这天老鸟火急火燎的找到菜鸟:“鸟儿啊,按照你之前的文章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跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript学习总结(二)——逻辑Not运算符详解

转载自 JavaScript学习总结(二)——逻辑Not运算符详解 在JavaScript 中,逻辑NOT运算符与C和Java中的逻辑 NOT 运算符相同,都由感叹号(!)表示。与逻辑 OR 和逻辑 AND 运算符不同的是,逻辑 NOT 运算符返回的一定是 Boo…

赫夫曼树+图解

图解 代码实现 package com.atguigu.huffmanTree;import javax.swing.*; import java.awt.geom.RoundRectangle2D; import java.util.ArrayList; import java.util.Collections; import java.util.List;/*** 创建人 wdl* 创建时间 2021/3/26* 描述*/ public class HuffmanTree…

四足爬行机器人运动_有自我意识机器人横空出世,还能自我复制,专家表示需警惕其失控...

有自我意识是什么样的?人类自身其实就是有自我意识的生命体,那作为有自我意识的生命体,你想过自我意识是指哪些特征吗?指尖科技说小编先跟你探讨一下:1.主动做事情。就是说在没有其他人控制的情况下,它可以…

微软AirSim,一个无人机和机器人的模拟器

微软开发并开源了AirSim,一个用于模拟无人机在全世界的飞行的工具。这个模拟器基于虚幻引擎(Unreal Engine)构建,微软很快会增加对机器人和其它类型移动设备的支持。 微软在内部开发了航空信息系统和机器人平台,这个研…

JavaScript学习总结(四)——逻辑OR运算符详解

转载自 JavaScript学习总结(四)——逻辑OR运算符详解 在JavaScript中,逻辑OR运算符用||表示 var bTrue true;var bFalse false;var bResult bTrue || bFalse; 下面的真值表描述了逻辑AND运算符的行为: 运算数 1运算数 2结果truetruetruetruefalsetruefals…

LEANSOFT领航员 – 基于Docker的DevOps实战培训

2016年,LEANSOFT推出了一系列广受开发人员欢迎的培训,包括《构建高效DevOps团队》,《基于Azure的容器化DevOps数据中心》和《Docker基础培训》。在这些培训中,我们得到了很多反馈,大家对使用Docker来支持DevOps的场景有…

高德地图路线规划 时间_路线准、播报拥堵及时,这次自驾出行高德地图可算是帮了大忙...

在我们日常生活中,自驾已经成为一种很普遍的出行方式,不仅在时间上灵活,特别是一家人出行也比较方便。伴随自驾出行的除了爱车外,一款靠谱的地图导航软件也成为了必不可少的旅行伙伴。目前比较常用的地图导航软件当属高德、百度和腾讯,不少人手机里都会有这三款软件中的其中一个…

JavaScript学习总结(七)——JavaScript函数(function)

转载自 JavaScript学习总结(七)——JavaScript函数(function) 一、函数基本概念 为完成某一功能的程序指令(语句)的集合,称为函数。 二、JavaScript函数的分类 1、自定义函数(我们自己编写的函数),如:function funName(){} 2、系统函数(J…

JavaScript学习总结(八)——JavaScript数组

转载自 JavaScript学习总结(八)——JavaScript数组 JavaScript中的Array对象就是数组,首先是一个动态数组,无需预先制定大小,而且是一个像Java中数组、ArrayList、Hashtable等的超强综合体。 一、数组的声明 常规方式声明: 1、…

命令点无效怎么处理_CAD执行修改命令,你试过重复选择对象吗?

你在执行命令的时候,是习惯先选择对象还是之后才选择对象的呢?不知道细心的你有没有发觉,明明已经先选择对象了才执行命令,为什么之后还要重复选择对象?这里可以分几种情况来讨论一下。CAD版本:中望CAD 202…

一起脱去小程序的外套和内衣 - 微信小程序架构解析

作者介绍: 渠宏伟,腾讯高级工程师,从事Web前端开发5年,先后负责企鹅电竞、腾讯视频VIP、腾讯OA开发框架、腾讯微信HR助手等项目。对Web前端架构、.NET架构有丰富的经验。 | 导语 微信小程序的公测掀起了学习小程序开发的浪潮&…

JavaScript学习总结(九)——Javascript面向(基于)对象编程

转载自 JavaScript学习总结(九)——Javascript面向(基于)对象编程 一、澄清概念 1.JS中"基于对象面向对象" 2.JS中没有类(Class),但是它取了一个新的名字叫“原型对象”,因此"类原型对象" 二、类(原型对象)和对象(实例)的区别与联…

将Springboot项目放在服务器上一直运行

nohup java -jar hz-sms-0.0.1-SNAPSHOT.jar >/www/wwwroot/...-0.0.1-SNAPSHOT.out 2>&1 &

迁移数据库到SQL on Linux Docker

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

Spring IoC 容器

转载自 Spring IoC 容器 IoC 容器 Spring 容器是 Spring 框架的核心。容器将创建对象,把它们连接在一起,配置它们,并管理他们的整个生命周期从创建到销毁。Spring 容器使用依赖注入(DI)来管理组成一个应用程序的组…

字段缺失_区分Protobuf 3中缺失值和默认值

来自公众号:新世界杂货铺这两天翻了翻以前的项目,发现不同项目中关于Protobuf 3缺失值和默认值的区分居然有好几种实现。今天笔者冷饭新炒,结合项目中的实现以及切身经验共总结出如下六种方案。增加标识字段众所周知,在Go中数字类…

当初怎么就入了VS的坑

使用Turbo C和Turbo Pascal开始学习编程貌似也是一代人的集体记忆。这方面我也没什么忌讳,毕竟Borland Turbo C在九十年代末的PC上面还是一个运行效率不错的开发工具。然而启蒙老师的水平限制,那个时候所学习的编写和调试技术都不过关,一个超…

Mysql截取字段中 用逗号分割 省市县镇街道社区小区

Mysql截取字段中 用逗号分割 省市县镇街道社区小区 select id , name, substring_index(name,,,0) as province0, substring_index(name,,,1) as province1, substring_index(name,,,2) as province2, substring_index(name,,,3) as province3, substring_index(name,,,4) as…

如何导出Navicat的数据库连接配置

如何导出Navicat的数据库连接配置 如何导出Navicat的数据库连接配置_石头wang的博客-CSDN博客_navicat 导出配置 如何导出Navicat的数据库连接配置 背景 我们可能会在不同的电脑安装Navicat,这些连接的配置如何从一台电脑迁移到另外一条?自行备份是比较…