我的开发环境一直是 Mac,最近一个项目要用到 MSSQL,因此开始尝试直接在 Docker for Mac 下运行 MSSQL for Linux 版本(之前只能在 Windows 环境下安装 MSSQL,单机开发需要用到虚拟机,带来了开发和测试的复杂性)。
首先按照官方的 安装步骤 安装,发现该容器运行一下之后,MSSQL 服务就会报错退出,这里讨论了错误的 来龙去脉。简单说,由于 Docker for Mac 自身实现的不完整,缺省的直接 Mapping 本地目录到 MSSQL 容器是不能运行的。
第一步: 创建一个数据卷容器 (Data Volume Container)
[Data Volume Container] (https://docs.docker.com/engine/tutorials/dockervolumes/#creating-and-mounting-a-data-volume-container) 的概念。
docker create -v /var/opt/mssql --name mssql \
microsoft/mssql-server-linux \
/bin/true
-v /var/opt/mssql
表示,如果将来其他容器如果挂载这个 Data Volume Container,那么将挂载到自己的/var/opt/mssql
目录下,
--name mssql
是这个 Container 的名字。
因为该数据卷自身没有可运行的程序,因此基于 microsoft/mssql-server-linux
Image 来创建,这样将来真正的 mssql 容器也是基于这个 Image 来创建,可以重用 Layers 信息。
第二步: 创建并运行一个 MSSQL for Linux 容器,挂载 mssql
Container 来保存数据库数据
docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=Test@123'\
-p 1433:1433 \
--volumes-from mssql \
-d --name sql-server \
microsoft/mssql-server-linux
同样是基于 microsoft/mssql-server-linux
Image,但是其数据卷来自于之前创建的 mssql
Data Volume Container。这个容器的名字是 sql-serve
。
这部完成之后,如果没有意外,你已经可以通过 localhost:1433
来连接数据库了,或者直接运行 sql-server
容器内的 sqlcmd
:
docker exec -it sql-server /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P Test@123
在交互模式下输入:
select Name from sys.databases;
go
就可以看到包含 master
数据库的 mssql 缺省数据库的名字。
如果觉得每次输入这么长的命令太繁琐,不如做个 Shell 的 Alias:
alias sqlcmd="docker exec -it sql-server /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P Test@123"
今后在终端里就输入 sqlcmd
好了。
你可以用 Windows 版本的 SQLServer Management Studio 连接管理这个 MSSQL for Linux,也可以用 Mac 下的 SQLPro for MSSQL 来连接。