如何使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跨平台或扫描二维码关注
如何使Mac Docker支持SQL on Linux容器Volume特性相关推荐
- php 获取路由器mac地址,php如何获取网卡MAC地址(支持WIN与LINUX系统)
/** 获取网卡的MAC地址:目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址 **/ class GetMacAddr{ var $return_array = array(); / ...
- 迁移数据库到SQL on Linux Docker
问题引入 前一篇文章,菜鸟找到了SQL on Linux Docker容器销毁后,容器中的数据库文件可以得以保留的方法,老鸟非常开心.所以,今天又提出了新的问题:"鸟儿,如果我想把我的数据库 ...
- 基于事件驱动架构构建微服务第5部分:容器化(Web Api Core 和 SQL Server Linux)
原文链接:https://logcorner.com/building-microservices-through-event-driven-architecture-part5-dockerizat ...
- Linux 容器 (LXC) 介绍
自云计算兴起以来,微服务一直在稳步流行.亚马逊和 Netflix 等公司正在使用云平台来提供他们最需要的服务.容器是此类云原生应用程序的核心.容器是一个隔离的环境,可促进微服务并提供卓越的扩展性和快速 ...
- Docker安装 下载镜像 部署容器 备份 创建私服
Docker 学习目标: 掌握Docker基础知识,能够理解Docker镜像与容器的概念 完成Docker安装与启动 掌握Docker镜像与容器相关命令 掌握Tomcat Nginx 等软件的常用应用 ...
- SQL on Linux Run on Docker
摘要 SQL Server 2016以及SQL on Linux版本已经支持跑在Docker容器中,也展示微软拥抱开源的决心和勇气.这篇博文就是以SQL on Linux为例,看看如何将SQL Ser ...
- linux win im,IM即时通讯软件“喧喧”介绍:支持Windows、Linux、Mac系统
喧喧是一款免费.开源.安全的IM即时通信软件,它支持Windows.Linux.Mac系统,Linux平台提供64位/32位的.tar.gz..deb..rpm软件包下载,兼容Ubuntu和CentO ...
- 修改Mac默认设置使Mac支持NTFS硬盘的读写
前言 NTFS (New Technology File System),是 Windows环境的文件系统,当然,MacOS系统也支持,只不过因为竞品和专利的原因,Mac上的NTFS读写功能被隐藏了. ...
- 有没有一种文件系统可以支持所有的操作系统(Win+Linux+Mac)而且支持大文件而且不需要辅助软件呢?
有没有一种文件系统可以支持所有的操作系统(Win+Linux+Mac)而且支持大文件而且不需要辅助软件呢? 在Mac, Linux, Windows下,没有一种文件系统能够同时支持他们三者,还能支持大 ...
最新文章
- 教你使用IOS内置的排错命令
- SpringBoot+Mybatis 框架之 @SelectProvider注解方式搭建
- 前端学习(2848):鼠标点击事件
- 西瓜哥:公有云也“All-Flash”?
- fx5u mc协议_SLMP协议和MC协议
- 微信小程序--引用外部字体(云开发实现)
- 英语不规则动词变化时态变化表
- 计算机主板维修,计算机主板维修从业技能全程通(70M)*
- 25行Java代码将普通图片转换为字符画图片和文本
- 2022考公务员难还是考研难?
- 【优秀论文解读】UV-SLAM: Unconstrained Line-based SLAM Using Vanishing Points for Structural Mapping
- 科幻电影虚拟世界中的8大服务器
- ESP32 报错is installed, but the tool failed to run
- python class tynu()_Pisanie pierwszej aplikacji Django, część 4.
- GitHub 安装及使用
- php通过api获取天气信息,调用API获取城市天气信息
- My设置密码报错:ERROR 1819 (HY000): Your password does not satisfy the current policy requir
- 抢单软件开发原理_软件开发原理
- matlab疑难问题笔记
- 怎么在网页上嵌入新浪微博页面