学而实习之 不亦乐乎

Docker 快速搭建 MSSQL 实验环境

2023-09-16 08:17:29

系统: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