开发者学堂课程【SQL Server on Linux入门教程:Mac版SQL On Linux Docker Volumes】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/386/detail/4847
Mac版SQL On Linux Docker Volumes
内容介绍
一、问题
二、References
三、Is that Ture
四、解决方法
一、问题
1、How can we save our database for persistence if we run SQL on Linux on Docker?
2、How can we do 1st problem on Mac Docker?
SQL server On Linux 跑在 Docker 里面有什么问题,按照前一章节只是一个 SQL server On Linux 实例跑在 Docker 容器里面,但它有一个问题如果在实例里面创建数据库,它的生命周期跟 Docker 容器生命周期是一起的。也就是 Docker 容器被删除,数据库也会不见。在 Docker 的基础知识里面有一个叫 volume 的东西,把 Docker 的数据保存在母体机某一个目录里面,当 Docker 销毁或回收之后volume 里的数据是会保留下来的,那么可以这种方法解决这个问题。
二、References
https://docs.microsoft.com/en-us/sqlinux/sql-server-linux setup-docker
1、NoteThe ACCEPT_ EULA and SA PASSWORD environment variables are requiredto run the image.
2、Important
Volume mapping for Docker-machine on Mac with the SQL Server on Linux image is not supported at thistime.
但是微软的官方文件SQL server On Linux 跑在 mac 版的 Docker 是不支持这一特性的。可是在测试下来是可以实现,本节主要讲解如何突破官方文档。
三、Is that Ture
docker生命周期和SQL server 生命周期一致的问题。
docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSW0RD=SQL0nLinux@123'
-
p 41433:1433 -d mic.cosaft/mssal-server-linux
这个是映射到母体机的41433端口,连接41433端口,可以查看一下服务是否起来,创建测试的数据库,在 Docker 容器里面 SQL server 实例上面创建 testdb,并且创建一个测试表,测试两条数据。代码如下:
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 dba.Test;
接下来把 Docker 容器销毁掉,输入Docker stop 8c1202ff7a33把 Docker 实例停掉,接着把 Docker 容器删除。docker stop
8c1202ff7a33
8c1202ff7a33
docker rm
8c1202ff7a33
8c1202ff7a33
再把 Docker 启动起来,再看一下数据库还在不在,如果不在说明刚才那个问题是存在的。数据库已经不见了,当 Docker 容器被回收以后,数据库就消失了,数据已经丢失了,这是面对的问题。解决之前先把实例删掉,会占用端口做测试。
docker run -e 'ACCEPT_ EULA=Y' -e 'SA_ PASSW0RD=SQL0nLinux@123' -p 41433:1433 -d miccosaft/mssql-server-linux
WHERE WAS OUR TESTING DATABASE DATA GOEN? -- it has been gone and we lost it already.
docker run -e ' ACCEPT_ EULA=Y' -e 'SA_ PASSW0RD=SQL0nLinux@123' -p 41433:1433 -V
/Users/cherish/Downloads/linuxsqldata:/var/opt/mssql -it miccosoft/mssql-server-linux
看一下微软讲的是不是正确的,有一个-V的参数Docker容器里面的目录映射在母体机的这个目录去/Users/cherish/Downloads/linuxsqldata
,就是数据库文件存放在/var/opt/mssql
,实际上是存放在母体机的目录里面,当 Docker 容器被回收以后,母体机的目录数据是不会被回收的,这样就达到一个数据被保留下来的目的。看一下 mac 版的 Docker 是不是支持这个功能。可以看这个目录里面有没有东西,可以看到错误已经抛出来了,让去检查这个日志/var/opt/mssql/
log
,就是微软讲的 mac 版是不支持的。
四、解决方法
解决 SQL server On Linux 跑在 mac 版的 Docker 并且让 docker 生命周期和 SQL server 生命周期不一致。
首先创建一个 volume,目录,命名为sql41433data,创建完成。
docker create -V/var/opt/mssql--name sql41433data miccosoft/mssql-server-linux
用这条语句,就是加了一条参数,并且给 Docker 容器取了一个名字。docker run -e 'ACCEPT_EULA=Y'-e'SA_PASSW0RD=SQL0nLinux@123' -p 41433:1433 --volumes-from sql41433data -it--name linuxsql41433 miccosoft/mssql- server-Linux
启动完成后,创建测试的数据库,数据库已经存在测试表。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
);
NSERT INTO dbo.Test
SELECT 'A' UNION ALL SELECT'B';
SELECT * FROM dba.Test;
先把停止Docker
d
ocker stop
销毁 Docker 容器locker rm
再次启动 Docker 容器,之后再去检查测试数据库是不是存在,表是不是存在,存在就说明已经解决了这个问题。locker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSW0RD=SQL0nLinux@123' -p 41433:1433 --volumes-niccosoft/mssql-server-linux
总结:SQL server 跑在 Linux 平台的 Docker 上,Docker 容器生命周期和 Docker容器里面实例的数据库是一样的,一旦 Docker 容器消失或者被删除,SQL server 实例上所有的数据库就不见了,数据就丢失了,如果要解决这个问题,就要引入 volume 这个技术,但是根据微软官方文章的说法 volume 技术在 mac 版上是不支持的,这事例去讲怎么 mac 版怎么去支持 volume 技术,最终达到 Docker 容器生命周期与数据库生命周期隔离开的问题,解决这个问题就可以解决 Docker 容器的数据库没有了,要想把用户的数据库保留下来,只需要把用户的 volume 的目录的数据库指到以前没有的实例上面对应的 volume 的目录,这样用户的数据库就一直在里面了。