Skip to content

一:拉取镜像

plain
docker pull mcr.microsoft.com/mssql/server:2017-latest

二.创建容器

plain
docker run  -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=Mm@123456" -p 1433:1433   
--memory 2000M --name sqlserver -d mcr.microsoft.com/mssql/server:2017-latest

命令详解:

-e "ACCEPT_EULA=Y" :
代表同意SQL SERVER使用条框,否则无法使用。注意双引号

-e "MSSQL_SA_PASSWORD=Mm@123456" :
设置SA用户的密码,要求密码长度必须至少为8个字符,并包含以下四组中的三组字符:大写字母、小写字母、以10为基数的数字和符号。注意密码强度不够,会出现容器启动就停止,密码需要大小写字母+数字+特殊符号

-p 1433:1433 :
将宿主机1443与容器1443端口进行映射

--memory 2000M :
sqlserver 的容器运行时,内存要>=2000MB,所以创建容器的时候可以设置一下

-d 后台运行

三.破解docker安装sqlserver内存2g限制

我们使用docker run之后会发现容器根本跑不起来,使用docker logs <containerid> 查看日志会看到:
sqlservr: This program requires a machine with at least 2000 megabytes of memory.
也就是可用内存没有2g所以报错,启动不了。

破解思路:把内存限制被修改为 512m在启动即可
正常情况下我们可以进入docker内部去修改文件,但是这里由于启动不了docker容器,所以也就进不去,我们可以把docker内部的文件复制到宿主机,修改后在复制回去宿主机即可。当然也可以挂载docker内部的文件在宿主机这样也很方便修改,我们这里说一下第一种方法

把docker内部的文件拷贝到宿主机:
语法:docker cp [容器id]:docker容器中配置文件路径 主机路径
实例:docker cp [容器id]:/opt/mssql/bin/sqlservr "/home/sqlservr" 这样就可以把docker内部的sqlservr文件拷贝出来到home文件夹下了

然后修改从docker内部复制出来的文件
先使用mv命令改一下文件名,后面修改后原始文件就还在相当于备份一下文件:mv sqlservr sqlservr.old

使用python修改内存限制代码(注意这里貌似只能使用python2,使用python3好像有点问题,centos7.6自带python2.7)

plain
oldfile = open("sqlservr.old", "rb").read() 
newfile = oldfile.replace("\x00\x94\x35\x77", "\x00\x80\x84\x1e") 
open("sqlservr", "wb").write(newfile) 
exit()


改完后就变成两个文件了一个新的一个旧的,一个修改后的一个修改前的

复制到docker之前修改一下文件权限
命令:chmod 777 sqlservr
不然直接复制进去在启动容器可能会报权限相关的错

把修改后的文件复制到docker内部
语法:docker cp 主机文件路径 容器id:docker容器中配置文件路径
实例:docker cp /home/sqlservr 容器id:/opt/mssql/bin/sqlservr 这样就可以把刚刚修改内存限制的文件重新拷贝进去了

都搞定后然后重新启动容器即可
sqlserver就被成功运行起来了,当然想要外部连接可能你还向外开启一个对应的端口

四.使用bak还原数据

还原数据库需要把bak放到宿主机上,这里我们是使用docker装的sqlserver,所以需要把bak拷贝到对应的docker容器。

第一步:把bak拷贝到装docker服务器
我这里是使用的linux服务器,这步就不说了,随便使用filezilla这类的工具很方便的实现

第二步:把linux服务器的bak文件拷贝到docker内部

然后使用正常的方式还原即可,上面还能看到docker装的sqlserver默认找的路径就是docker内部的/var/opt/mssql/data,我们前面我们就是拷贝到的找个路径