Mac下Docker容器运行SQL Server 2017方法讲解
首先下载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/-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 pyodbc server='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()
结果: