Docker 快速搭建 MSSQL 实验环境
系统:Fedora
软件:Docker 20.10.23
一、 运行及配置
1、拉取镜像
# docker pull mcr.microsoft.com/mssql/server:2019-latest
2、运行容器
# docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=93i7f5^#Wpe98G6$" \
--restart=always \
-p 1433:1433 --name sql1 -h sql1 \
-d mcr.microsoft.com/mssql/server:2019-latest
备注:密码应符合 SQL Server 默认密码策略,否则容器无法设置 SQL Server,将停止工作。 默认情况下,密码的长度必须至少为 8 个字符,并且必须包含以下四种字符中的三种:大写字母、小写字母、十进制数字和符号。 你可以通过执行 docker logs 命令检查错误日志。
默认情况下,这会创建一个使用 SQL Server 2019 开发人员版的容器。
3、查看容器运行状态
# docker ps | grep sql1
4、进入容器
# docker exec -it sql1 bash
5、测试连接
# /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "<YourNewStrong@Passw0rd>"
二、更改 SA 密码
创建 SQL Server容器后,通过在容器中运行 echo $SA_PASSWORD,可发现指定的 SA_PASSWORD 环境变量。 出于安全考虑,需要更改 SA 密码。进入容器运行 sqlcmd,然后根据提示输入旧密码和新密码
# docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \
-S localhost -U SA \
-P "$(read -sp "Enter current SA password: "; echo "${REPLY}")" \
-Q "ALTER LOGIN SA WITH PASSWORD=\"$(read -sp "Enter new SA password: "; echo "${REPLY}")\""
测试新密码是否正确测
# docker exec -it sql1 bash
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "<YourNewStrong@Passw0rd>"
三、 使用Sqlcmd连接到数据库
下载 Microsoft ODBC Driver 17 for SQL Server 依赖并安装
下载 sqlcmd并安装,并测试连接数据
# sqlcmd -S <ip_address>,1433 -U SA -P "<YourNewStrong@Passw0rd>"
1、使用 docker exec -it 命令在运行的容器内部启动交互式 Bash Shell。 在下面的示例中,sql1 是在创建容器时由 --name 参数指定的名称。
# sudo docker exec -it sql1 "bash"
2、在容器内部使用完整路径通过 sqlcmd 进行本地连接。
# /opt/mssql-tools18/bin/sqlcmd -S localhost -U SA -P "<YourNewStrong@Passw0rd>"
备注:默认情况下,较新版本的 sqlcmd 是安全的。 有关连接加密的详细信息,请参阅 sqlcmd 实用工具(对于 Windows)和使用 sqlcmd 进行连接(对于 Linux 和 macOS)。 如果连接不成功,则可以将 -No 选项添加到 sqlcmd,以指定加密是可选的,而不是强制性的。
可以省略命令行上提示要输入的密码。 例如:
# /opt/mssql-tools18/bin/sqlcmd -S localhost -U SA
3、如果成功,应会显示 sqlcmd 命令提示符:>。
四、创建和查询数据
1、新建数据库
创建一个名为 TestDB 的新数据库。在 sqlcmd 命令提示符中,粘贴以下 Transact-SQL 命令以创建测试数据库:
> CREATE DATABASE TestDB;
在下一行中,编写一个查询以返回服务器上所有数据库的名称:
> SELECT Name from sys.databases;
前两个命令没有立即运行。 在新行中键入 GO 以运行前面的命令:
> GO
2、插入数据
接下来创建一个新表 Inventory,然后插入两个新行。在 sqlcmd 命令提示符中,将上下文切换到新的 TestDB 数据库:
> USE TestDB;
创建名为 Inventory 的新表:
> CREATE TABLE Inventory (id INT, name NVARCHAR(50), quantity INT);
将数据插入新表:
> INSERT INTO Inventory VALUES (1, 'banana', 150); INSERT INTO Inventory VALUES (2, 'orange', 154);
要运行上述命令的类型
> GO
3、选择数据
现在,运行查询以从 Inventory 表返回数据。
通过 sqlcmd 命令提示符输入查询,以返回 Inventory 表中数量大于 152 的行:
> SELECT * FROM Inventory WHERE quantity > 152;
运行以下命令:
> GO
4、退出 sqlcmd 命令提示符
要结束 sqlcmd 会话,请键入 QUIT:
> QUIT
要在容器中退出交互式命令提示,请键入 exit。 退出交互式 Bash Shell 后,容器将继续运行。
五、从容器外连接
还可以从支持 SQL 连接的任何 Linux、Windows 或 macOS 外部工具连接到 Docker 计算机上的 SQL Server 实例。 外部工具将使用主机的 IP 地址。
以下步骤在容器外使用 sqlcmd 连接在容器中运行的 SQL Server。 这些步骤假定你已在容器外安装了 SQL Server 命令行工具。 使用其他工具时,同样的原则依然适用,但连接过程因工具而异。
1、使用 ifconfig 或 ip addr 查找容器主机的 IP 地址。
2、对于本示例,请在客户端计算机上安装 sqlcmd 工具。 有关详细信息,请参阅在 Windows 上安装 sqlcmd 或在 Linux 上安装 sqlcmd。
3、运行 sqlcmd,指定 IP 地址和映射容器中的端口 1433 的端口。 本例中为主机上的相同端口 1433。 如果在主机上指定了不同的映射端口,则在此处使用它。 还需要在防火墙上打开相应的入站端口以允许连接。
备注:默认情况下,较新版本的 sqlcmd 是安全的。 如果连接不成功,并且你使用的是版本 18 或更高版本,则可以将 -No 选项添加到 sqlcmd,以指定加密是可选的,而不是强制性的。
# sqlcmd -S <ip_address>,1433 -U SA -P "<YourNewStrong@Passw0rd>"
4、运行 Transact-SQL 命令。 完成后,键入 QUIT。
六、删除容器
如果想删除本教程中使用的 SQL Server 容器,请运行以下命令:
# sudo docker stop sql1
# sudo docker rm sql1
警告:停止并永久删除容器会删除容器中的所有 SQL Server 数据。 如果你需要保留数据,请在容器外创建并复制备份文件或使用容器数据暂留技术。
七、持久化数据
创建一个目录来存储SQL Server 数据
# sudo mkdir -p /var/opt/mssql/data
# sudo chown -R 10001:10001 /var/opt/mssql/data
然后使用以下命令启动容器:
# sudo docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=<YourStrong!Passw0rd>' \
-v /var/opt/mssql/data:/var/opt/mssql/data \
-p 1433:1433 --name sql_server -d microsoft/mssql-server-linux