配置和自定义 SQL Server Linux 容器
适用于: SQL Server - Linux
本文介绍如何使用 Docker 配置和自定义 SQL Server Linux 容器。 你可以保留数据、将文件移出/移入容器、更改默认设置。
提示
你可以使用 sqlcmd (Go),在容器中创建新的 SQL Server 实例用于开发。 有关详细信息,请参阅创建和查询 SQL Server 容器。
创建自定义容器
你可以创建自己的 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 文档。
将主机目录作为数据卷装载
第一种方法是在主机上将目录作为容器中的数据卷装载。 为此,请使用带有 -v <host directory>:/var/opt/mssql
标志的 docker run
命令,其中 <host directory>
是任何给定路径。 例如:Windows 上的 C:\SQL
或 Linux 上的 ~/sqlvolumes
。 这允许在容器执行之间还原数据。
备注
SQL Server 2019 (15.x) 及更高版本容器以非根用户的身份自动启动,而 SQL Server 2017 (14.x) 容器在默认情况下以根用户的身份启动。 有关以非根用户的身份运行 SQL Server 容器的详细信息,请参阅保护 SQL Server Linux 容器安全。
重要
SA_PASSWORD
环境变量已弃用。 请改用 MSSQL_SA_PASSWORD
。
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 \
-v <host directory>/data:/var/opt/mssql/data \
-v <host directory>/log:/var/opt/mssql/log \
-v <host directory>/secrets:/var/opt/mssql/secrets \
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 `
-v <host directory>/data:/var/opt/mssql/data `
-v <host directory>/log:/var/opt/mssql/log `
-v <host directory>/secrets:/var/opt/mssql/secrets `
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 ^
-v <host directory>/data:/var/opt/mssql/data ^
-v <host directory>/log:/var/opt/mssql/log ^
-v <host directory>/secrets:/var/opt/mssql/secrets ^
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 \
-v <host directory>/data:/var/opt/mssql/data \
-v <host directory>/log:/var/opt/mssql/log \
-v <host directory>/secrets:/var/opt/mssql/secrets \
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 `
-v <host directory>/data:/var/opt/mssql/data `
-v <host directory>/log:/var/opt/mssql/log `
-v <host directory>/secrets:/var/opt/mssql/secrets `
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 ^
-v <host directory>/data:/var/opt/mssql/data ^
-v <host directory>/log:/var/opt/mssql/log ^
-v <host directory>/secrets:/var/opt/mssql/secrets ^
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 \
-v <host directory>/data:/var/opt/mssql/data \
-v <host directory>/log:/var/opt/mssql/log \
-v <host directory>/secrets:/var/opt/mssql/secrets \
-d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 `
-v <host directory>/data:/var/opt/mssql/data `
-v <host directory>/log:/var/opt/mssql/log `
-v <host directory>/secrets:/var/opt/mssql/secrets `
-d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 ^
-v <host directory>/data:/var/opt/mssql/data ^
-v <host directory>/log:/var/opt/mssql/log ^
-v <host directory>/secrets:/var/opt/mssql/secrets ^
-d mcr.microsoft.com/mssql/server:2022-latest
借助此方法,还能共享和查看 Docker 外部的主机上的文件。
使用数据卷容器
第二种方法是使用数据卷容器。 可通过指定卷名(而不是包含 -v
参数的主机目录)来创建数据卷容器。 以下示例创建名为 sqlvolume
的共享数据卷。
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 \
-v sqlvolume:/var/opt/mssql \
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 `
-v sqlvolume:/var/opt/mssql `
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 ^
-v sqlvolume:/var/opt/mssql ^
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 \
-v sqlvolume:/var/opt/mssql \
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 `
-v sqlvolume:/var/opt/mssql `
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 ^
-v sqlvolume:/var/opt/mssql ^
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 \
-v sqlvolume:/var/opt/mssql \
-d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 `
-v sqlvolume:/var/opt/mssql `
-d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 ^
-v sqlvolume:/var/opt/mssql ^
-d mcr.microsoft.com/mssql/server:2022-latest
注意
早期版本的 Docker 不支持通过此方法在运行命令中隐式创建数据卷。 在这种情况下,请使用 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 (15.x) 和 CU28 for SQL Server 2017 (14.x) 开始,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.conf
来部署容器后,装载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 上为 SQL Server 2022 配置时区)。 若要查找正确的时区值,请从 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 '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: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' ); GO ALTER DATABASE tempdb MODIFY FILE ( NAME = templog, FILENAME = '/var/opt/mssql/tempdb/templog.ldf' ); GO
使用以下 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 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:2019-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:2019-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:2019-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:2022-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:2022-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:2022-latest
使用 mssql-config 在容器内配置 SQL Server
可以使用 mssql-conf 工具在 SQL Server 容器中设置参数。
例如,可以按照以下步骤为实例设置内存限制:
直接连接使用
docker exec
作为根用户的容器。 将sqlcontainer
替换为容器名称。docker exec -u root -it sqlcontainer "bash"
使用 mssql-conf 更改设置。 本示例将
memory.memorylimitmb
设置更改为 2 GB (2,048 MB)。/opt/mssql/bin/mssql-conf set memory.memorylimitmb 2048
自定义 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 容器的信息,请参阅 GitHub 上的ML 服务示例。
相关内容
- 通过查看快速入门,开始在 Docker 上使用 SQL Server 2017 (14.x) 容器映像
- 通过查看快速入门,开始在 Docker 上使用 SQL Server 2019 (15.x) 容器映像
- 通过查看快速入门,开始在 Docker 上使用 SQL Server 2022 (16.x) 容器映像
参与编辑 SQL 文档
你是否知道你可以自行编辑 SQL 内容? 你如果这样做,不仅可以帮助改进我们的文档,还可以获得页面贡献者的殊荣。
有关详细信息,请参阅如何参与 SQL Server 文档编辑