Mac下Docker容器运行SQL Server 2017

来源:互联网 发布:如果当时 知乎 编辑:程序博客网 时间:2024/06/05 19:25

首先下载SQL Server2017的最新镜像:

为了运行,需要调整Docker的运行RAM大小最小为4GB:

启动一个容器(注意,命令的参数中,在Linux/Mac平台下是单引号,而在Windows平台下是双引号):

docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -e 'MSSQL_PID=Developer' -p 1433:1433 --name sql_server2017 -d microsoft/mssql-server-linux:2017-latest

(初始密码必须为<YourStrong!Passw0rd>,否则启动后失败退出容器,后面再修改密码即可)

SQL Server2017容器已经启动好了。

为了可以持久化数据,实际使用需要加-v参数来映射数据卷到/var/opt/mssql

修改SA用户的密码

 docker exec -it sql_server2017 /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '<YourStrong!Passw0rd>' -Q 'ALTER LOGIN SA WITH PASSWORD="******"'

如果密码过于简单会报如下错误,我们设复杂一点的即可:

连接到SQL Server容器

docker exec -it sql_server2017 "sh"    --> 从启动的容器信息看到,使用的shell是/bin/sh,因此需要使用"sh"

进入容器后,连接到数据库:

/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'jin*******'

登录数据库后会出现提示符:'1>'

再输入命令后,需要执行go才会执行上面输入的语句。


上面是在容器内进行的,下面回到宿主机,这里是Mac系统进行编程连接,首先,需要安装Homebrew:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

接着安装ODBC驱动和针对SQL Server的SQL命令行工具

brew tap microsoft/mssql-release https://github.com/Microsoft/homebrew-mssql-release

brew update

ACCETP_EULA=y brew install --no-sandbox msodbcsql mssql-tools

安装成功后,现在来连接容器的数据库,命令如下:

sqlcmd -S 127.0.0.1 -U sa -P ****    (此时,该命令是在宿主机下执行的了)

查看下数据库版本:

正常连接。现在基于python来测试下,首先需要安装针对sql server的python驱动: pip install virtualenv,然后依次执行如下命令:

注意,此时使用的是venv目录下的python:

为了测试,建立一个测试的数据库:

sqlcmd -S 127.0.0.1 -U sa -P **** -Q "CREATE DATABASE IHouse;"

创建一个表:

sqlcmd -S 127.0.0.1 -U sa -P jingtian,nuli9 -Q "use IHouse; CREATE TABLE test(id int, name varchar(10));"

编写python测试脚本:

import pyodbcserver='127.0.0.1' # localhost会连接超时,需要为IP地址database='IHouse'username='sa'password='*****'cnxn=pyodbc.connect('DRIVER={ODBC Driver 13 for SQL Server};SERVER='+server+';PORT=1433;DATABASE='+database+';UID='+username+';PWD='+password)cursor=cnxn.cursor()print('insert data...')tsql = "INSERT INTO test (id, name) VALUES(?,?);"with cursor.execute(tsql, 1, 'Jim'):    print ('Insert OK.')    print('Read data...')tsql = "SELECT * FROM test;"with cursor.execute(tsql):    row = cursor.fetchone()    while row:        print(str(row[0]) + " " + str(row[1]))        row = cursor.fetchone()
结果: