配置和自定义 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 stopdocker 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 的备份或还原:

  1. 部署 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。

  2. 还必须在容器内的 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 数据库与用户数据库分开。

  1. 连接到 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
    
  2. 使用以下 T-SQL 脚本验证是否已修改 tempdb 文件位置:

    SELECT *
    FROM sys.sysaltfiles
    WHERE dbid = 2;
    
  3. 必须重启 SQL Server 容器,这些更改才能生效。

    docker stop sql1
    docker start sql1
    
    docker stop sql1
    docker start sql1
    
    docker stop sql1
    docker start sql1
    
  4. 打开交互式 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 容器中设置参数。

例如,可以按照以下步骤为实例设置内存限制:

  1. 直接连接使用 docker exec 作为根用户的容器。 将 sqlcontainer 替换为容器名称。

    docker exec -u root -it sqlcontainer "bash"
    
  2. 使用 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。 示例包括:

有关如何使用 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 文档编辑