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

简介: 这篇文章解决了Docker容器中SQL on Linux实例数据库与容器本身同生死同命运的问题,提出了当Docker容器销毁后,容器中的数据库文件得以保留的方法。

问题引入

这天老鸟火急火燎的找到菜鸟:“鸟儿啊,按照你之前的文章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;
GO

USE TestDb
GO
IF OBJECT_ID('dbo.Test', 'U') IS NOT NULL
    DROP TABLE dbo.Test
GO

CREATE TABLE dbo.Test(
RowID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY
,Name VARCHAR(20) NOT NULL
);

INSERT INTO dbo.Test
SELECT 'A' UNION ALL SELECT 'B';

SELECT * FROM dbo.Test;

结果如下图展示:
01.png

销毁Docker容器

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

$ docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                     NAMES
8c1202ff7a33        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 8c1202ff7a33
8c1202ff7a33
$ docker rm 8c1202ff7a33
8c1202ff7a33
$ docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=SQLOnLinux@123' -p 41433:1433 -d microsoft/mssql-server-linux
83cd4ca5cdf3d370118c10d8b783b204f86aa7b50fd7e334a27542d2cf7a1230

检查测试对象

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

从这个结果来看,测试数据库已经丢失。说明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
关键的地方,截图如下展示:
03.png
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-linux
2e1deac3c2bffa5f6cd97dfdc3683c59628538550ea9010d16214906c299cf54

$ 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                     NAMES
596f3bfebb8a        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 596f3bfebb8a
596f3bfebb8a
$ docker rm 596f3bfebb8a
596f3bfebb8a
$ docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=SQLOnLinux@123' -p 41433:1433 --volumes-from sql41433data -it --name linuxsql41433 microsoft/mssql-server-linux

最后检查测试对象,截图如下:
04.png
其实,从启动过程的日志,我们也可以看到TestDb已经启动。
05.png
说明这个解决方法切实有效。

最后总结

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

目录
相关文章
|
11月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
Linux Docker 容器
Centos安装docker(linux安装docker)——超详细小白可操作手把手教程,包好用!!!
本篇博客重在讲解Centos安装docker,经博主多次在不同服务器上测试,极其的稳定,尤其是阿里的服务器,一路复制命令畅通无阻。
22070 5
Centos安装docker(linux安装docker)——超详细小白可操作手把手教程,包好用!!!
|
存储 安全 数据中心
Docker 容器凭借轻量级和高效的特性,成为应用部署的重要工具
Docker 容器凭借轻量级和高效的特性,成为应用部署的重要工具。本文探讨了 Docker 如何通过 Namespace 和 Cgroups 实现 CPU、内存、网络和存储资源的隔离,提高系统安全性和资源利用率,以及面临的挑战和应对策略。
252 1
|
存储 数据管理 Docker
docker中数据卷的特性
【10月更文挑战第10天】
234 2
|
安全 Linux 虚拟化
10-26|我现在加了,在容器内也可以改时间了,但是我在容器内改了,为什么会影响到linux机子啊
10-26|我现在加了,在容器内也可以改时间了,但是我在容器内改了,为什么会影响到linux机子啊
|
Linux 程序员 Python
python-office支持Mac和Linux吗?自动化办公用这个就够了
大家好,我是程序员晚枫。今天解答关于`python-office`是否支持Mac和Linux的问题。起初因需调用Office功能,该项目不完全支持这两个系统。现已通过拆分子项目解决了这一限制,例如`poexcel`可在多平台上运行Excel相关功能。只需简单修改导入语句,如使用`import poexcel`替代`import office`,即可在Mac和Linux上顺利执行。学习或使用中有任何疑问,欢迎留言交流!
290 5
|
Ubuntu Linux 数据安全/隐私保护
Linux系统使用Docker部署Cloudreve云盘并实现远程访问
Linux系统使用Docker部署Cloudreve云盘并实现远程访问
451 0
|
安全 关系型数据库 开发者
Docker Compose凭借其简单易用的特性,已经成为开发者在构建和管理多容器应用时不可或缺的工具。
Docker Compose是容器编排利器,简化多容器应用管理。通过YAML文件定义服务、网络和卷,一键启动应用环境。核心概念包括服务(组件集合)、网络(灵活通信)、卷(数据持久化)。实战中,编写docker-compose.yml,如设置Nginx和Postgres服务,用`docker-compose up -d`启动。高级特性涉及依赖、环境变量、健康检查和数据持久化。最佳实践涵盖环境隔离、CI/CD、资源管理和安全措施。案例分析展示如何构建微服务应用栈,实现一键部署。Docker Compose助力开发者高效驾驭复杂容器场景。
313 1
|
Kubernetes Linux Docker
【Azure 应用服务】使用Docker Compose创建App Service遇见"Linux Version is too long. It cannot be more than 4000 characters"错误
【Azure 应用服务】使用Docker Compose创建App Service遇见"Linux Version is too long. It cannot be more than 4000 characters"错误
234 0
|
Kubernetes Linux API
在Linux中,LVS-DR模型的特性是什么?
在Linux中,LVS-DR模型的特性是什么?