适用于:
SQL Server
- Linux
本文介绍如何配置和自定义 SQL Server Docker 容器,例如保存数据、将文件移出和移入容器以及更改默认设置。
创建自定义容器
可以创建自己的
Dockerfile
来创建自定义 SQL Server 容器。 有关详细信息,请参阅
组合使用 SQL Server 和节点应用程序的演示
。 如果创建了自己的 Dockerfile,请注意前台进程,因为此进程控制容器的生命周期。 如果它退出,容器将关闭。 例如,如果想要运行脚本并启动 SQL Server,请确保 SQL Server 进程是最右侧的命令。 所有其他命令都会在后台运行。 以下命令在 Dockerfile 中对此进行说明:
/usr/src/app/do-my-sql-commands.sh & /opt/mssql/bin/sqlservr
如果撤销上一个示例中的命令,则容器将在 do-my-sql-commands.sh 脚本完成时关闭。
即使通过 docker stop
和 docker start
重启容器,SQL Server 配置仍会更改,且数据库文件依然保留在容器中。 但是,如果使用 docker rm
删除容器,则会删除容器中的所有内容,包括 SQL Server 和数据库。 以下部分介绍如何使用数据卷保留数据库文件(即使关联的容器已被删除)。
对于 SQL Server,了解 Docker 中的数据持久性至关重要。 除本部分讨论的内容外,请参阅有关如何在 Docker 容器中管理数据的 Docker 文档。
将主机目录作为数据卷装载
第一种方法是在主机上将目录作为容器中的数据卷装载。 为此,请将 docker run
命令与 -v <host directory>:/var/opt/mssql
标志配合使用。 这允许在容器执行之间还原数据。
SQL Server 2019 (15.x) 及更高版本容器以非根用户的身份自动启动,而 SQL Server 2017 (14.x) 容器在默认情况下以根用户的身份启动。 有关以非根用户的身份运行 SQL Server 容器的详细信息,请参阅配置安全性。
SA_PASSWORD
环境变量已弃用。 请改用 MSSQL_SA_PASSWORD
。
早期版本的 Docker 不支持通过此方法在 run 命令中隐式创建数据卷。 在这种情况下,请使用 Docker 文档创建和装载数据卷容器中列出的显式步骤。
即使停止并删除此容器,数据卷仍然存在。 可使用 docker volume ls
命令进行查看。
docker volume ls
如果随后创建另一个具有相同卷名的容器,则新容器会使用卷中包含的相同 SQL Server 数据。
若要删除数据卷容器,请使用 docker volume rm
命令。
如果删除数据卷容器,则该容器中的所有 SQL Server 数据都会被永久删除。
备份和还原
除这些容器技术外,还可使用 SQL Server 标准备份和还原技术。 可通过备份文件来保护数据,或将数据移至其他 SQL Server 实例。 有关详细信息,请参阅在 Linux 上备份和还原 SQL Server 数据库。
如果要创建备份,请确保在容器外部创建或复制备份文件。 否则,一旦删除容器,备份文件也将随之删除。
启用容器中的 VDI 备份和还原
从 CU15 for SQL Server 2019 和 CU28 for SQL Server 2017 开始,SQL Server 容器部署现在支持虚拟设备接口 (VDI) 备份和还原操作。 按照以下步骤为 SQL Server 容器启用基于 VDI 的备份或还原:
部署 SQL Server 容器时,请使用 --shm-size
选项。 若要开始,请将大小设置为 1 GB,如以下示例命令所示:
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=Mystr0ngP@ssw0rd!" --shm-size 1g -p 1433:1433 --name sql19 --hostname sql19 -d mcr.microsoft.com/mssql/server:2019-latest
使用选项 --shm-size
,可以在容器内配置共享内存目录 (/dev/shm
) 的大小,默认情况下设置为 64 MB。 共享内存的这一默认大小不足,无法支持 VDI 备份。 建议你在部署 SQL Server 容器并想要支持 VDI 备份时将此大小配置为至少 1 GB。
还必须在容器内的 mssql.conf 中启用新参数 memory.enablecontainersharedmemory。 可以使用保留数据部分中所述的 -v
选项,或在通过手动更新容器内的 mssql 来部署容器后,在部署容器时装载 mssql.conf。 下面是一个示例 mssql.conf 文件,其中 memory.enablecontainersharedmemory 设置设为 true。
[memory]
enablecontainersharedmemory = true
从容器复制文件
若要从容器复制文件,请使用以下命令:
docker cp <Container ID>:<Container path> <host path>
可以通过运行 docker ps -a
命令来获取容器 ID。
docker cp d6b75213ef80:/var/opt/mssql/log/errorlog /tmp/errorlog
docker cp d6b75213ef80:/var/opt/mssql/log/errorlog C:\Temp\errorlog
docker cp d6b75213ef80:/var/opt/mssql/log/errorlog C:\Temp\errorlog
将文件复制到容器中
若要将文件复制到容器中,请使用以下命令:
docker cp <Host path> <Container ID>:<Container path>
docker cp /tmp/mydb.mdf d6b75213ef80:/var/opt/mssql/data
docker cp C:\Temp\mydb.mdf d6b75213ef80:/var/opt/mssql/data
docker cp C:\Temp\mydb.mdf d6b75213ef80:/var/opt/mssql/data
若要在具有特定时区的 Linux 容器中运行 SQL Server,请配置 TZ
环境变量(有关详细信息,请参阅在 Linux 上配置时区)。 若要查找正确的时区值,请从 Linux bash 提示符运行 tzselect
命令:
tzselect
选择时区后,tzselect
显示类似以下内容的输出:
The following information has been given:
United States
Pacific
Therefore TZ='America/Los_Angeles' will be used.
可使用此信息在 Linux 容器中设置相同的环境变量。 以下示例介绍如何在 Americas/Los_Angeles
时区的容器中运行 SQL Server:
sudo docker run -e 'ACCEPT_EULA=Y' -e 'A_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 --name sql1 \
-e 'TZ=America/Los_Angeles'\
-d mcr.microsoft.com/mssql/server:2017-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 --name sql1 `
-e "TZ=America/Los_Angeles" `
-d mcr.microsoft.com/mssql/server:2017-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 --name sql1 ^
-e "TZ=America/Los_Angeles" ^
-d mcr.microsoft.com/mssql/server:2017-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 --name sql1 \
-e 'TZ=America/Los_Angeles'\
-d mcr.microsoft.com/mssql/server:2019-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 --name sql1 `
-e "TZ=America/Los_Angeles" `
-d mcr.microsoft.com/mssql/server:2019-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 --name sql1 `
-e "TZ=America/Los_Angeles" `
-d mcr.microsoft.com/mssql/server:2019-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 --name sql1 \
-e 'TZ=America/Los_Angeles'\
-d mcr.microsoft.com/mssql/server:2022-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 --name sql1 `
-e "TZ=America/Los_Angeles" `
-d mcr.microsoft.com/mssql/server:2022-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 --name sql1 `
-e "TZ=America/Los_Angeles" `
-d mcr.microsoft.com/mssql/server:2022-latest
更改 tempdb
路径
最好将 tempdb
数据库与用户数据库分开。
连接到 SQL Server 实例,然后运行以下 Transact-SQL (T-SQL) 脚本。 如果存在多个与 tempdb
相关的文件,也需要移动这些文件。
ALTER DATABASE tempdb MODIFY FILE (
NAME = tempdev, FILENAME = '/var/opt/mssql/tempdb/tempdb.mdf'
ALTER DATABASE tempdb MODIFY FILE (
NAME = templog, FILENAME = '/var/opt/mssql/tempdb/templog.ldf'
使用以下 T-SQL 脚本验证是否已修改 tempdb
文件位置:
SELECT *
FROM sys.sysaltfiles
WHERE dbid = 2;
必须重启 SQL Server 容器,这些更改才能生效。
docker stop sql1
docker start sql1
docker stop sql1
docker start sql1
docker stop sql1
docker start sql1
打开交互式 bash
会话以连接到容器。
docker exec -it sql1 bash
docker exec -it sql1 bash
docker exec -it sql1 bash
连接到交互式 shell 之后,运行以下命令以检查 tempdb
的位置:
ls /var/opt/mssql/tempdb/
如果移动成功,则会显示以下类似输出:
tempdb.mdf templog.ldf
更改默认文件位置
添加 MSSQL_DATA_DIR
变量以在 docker run
命令中更改数据目录,然后将卷装载到容器的用户有权访问的位置。
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=MyStrongPassword' -e 'MSSQL_DATA_DIR=/my/file/path' -v /my/host/path:/my/file/path -p 1433:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=MyStrongPassword" -e "MSSQL_DATA_DIR=/my/file/path" -v /my/host/path:/my/file/path -p 1433:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=MyStrongPassword" -e "MSSQL_DATA_DIR=/my/file/path" -v /my/host/path:/my/file/path -p 1433:1433 -d mcr.microsoft.com/mssql/server:2017-latest
自定义 Docker 容器的示例
有关自定义 Docker 容器的示例,请参阅 https://github.com/microsoft/mssql-docker/tree/master/linux/preview/examples。 示例包括:
使用全文搜索的 Dockerfile 示例
RHEL 7 和 SQL Server 2019 的 Dockerfile 示例
RHEL 8 和 SQL Server 2017 的 Dockerfile 示例
使用全文搜索、PolyBase 和工具的 Ubuntu 20.04 和 SQL Server 2019 的 Dockerfile 示例
有关如何使用 Dockerfiles 生成和运行 Docker 容器的信息,请参阅 https://github.com/microsoft/mssql-docker/tree/master/linux/preview/examples/mssql-mlservices。
通过查看快速入门,开始在 Docker 上使用 SQL Server 2017 容器映像