設定和自定義 SQL Server Linux 容器

適用於:SQL Server - Linux

本文說明如何使用 Docker 來設定和自定義 SQL Server Linux 容器。 您可以保存您的資料、將檔案從 容器移至容器,以及變更預設設定。

提示

您可以使用 sqlcmd (Go) 在容器中建立 SQL Server 的新實例以供開發之用。 如需詳細資訊,請參閱建立和查詢 SQL Server 容器

建立自訂容器

您可以建立自己的 Dockerfile 來建置自定義的 SQL Server 容器。 如需詳細資訊,請參閱結合 SQL Server 和 Node 應用程式的示範 \(英文\)。 如果您建立自己的 Dockerfile,請留意前景程序,因為此程序會控制容器的生命週期。 如果結束,容器會關閉。 例如,如果您想要執行指令碼並啟動 SQL Server,請確定 SQL Server 程序是最右邊的命令。 所有其他命令都會在背景執行。 下列命令會在 Dockerfile 的內部進行示範:

/usr/src/app/do-my-sql-commands.sh & /opt/mssql/bin/sqlservr

如果反轉上一個範例中的命令,容器就會在 do-my-sql-commands.sh 指令碼完成時關閉。

保存您的資料

您的 SQL Server 設定變更和資料庫檔案都會保存於容器中,即使您使用 docker stopdocker start 來將容器重新啟動也一樣。 不過,如果您使用 docker rm 來移除容器,則會刪除容器中的所有項目,包括 SQL Server 和您的資料庫。 下一節將說明如何使用資料磁碟區來保存您的資料庫檔案,即使已刪除相關聯的容器也一樣。

重要

對於 SQL Server,請務必瞭解 Docker 中的數據持續性。 除了本節的討論,另請參閱 Docker 文件,以了解如何管理 Docker 容器中的資料 \(英文\)。

裝載主機目錄作為資料磁碟區

第一個選項是在主機上裝載目錄作為容器中的資料磁碟區。 若要這樣做,請使用 docker run 命令搭配 -v <host directory>:/var/opt/mssql 旗標,其中 <host directory> 是任何指定的路徑。 例如:C:\SQL (Windows 上) 或 ~/sqlvolumes (Linux 上)。 這可讓您在容器執行之間還原資料。

注意

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

注意

在 run 命令中隱含建立數據磁碟區的技術不適用於舊版的 Docker。 在此情況下,請使用 Docker 文件中概述的明確步驟,建立和裝載資料磁碟區容器 \(英文\)。

即使您停止並移除此容器,資料磁碟區仍會保存。 您可以使用 docker volume ls 命令來檢視它。

docker volume ls

如果您接著使用相同磁碟區名稱來建立另一個容器,新容器就會使用該磁碟區中所含的相同 SQL Server 資料。

若要移除資料磁碟區容器,請使用 docker volume rm 命令。

警告

如果您刪除資料磁碟區容器,則會「永久」 刪除容器中的所有 SQL Server 資料。

備份與還原

除了這些容器技術,您也可以使用標準的 SQL Server 備份和還原技術。 您可以使用備份檔案來保護資料,或將資料移至另一個 SQL Server 執行個體。 如需詳細資訊,請參閱備份與還原 Linux 上的 SQL Server 資料庫

警告

如果您建立備份,請務必在容器外部建立或複製備份檔案。 否則,如果移除容器,也會一併刪除備份檔案。

在容器中啟用 VDI 備份和還原

從 SQL Server 2019 的 CU15 (15.x) 和 SQL Server 2017 的 CU28 開始,現在支援虛擬設備介面 (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. 您也必須在容器內啟用新的參數memory.enablecontainersharedmemorymssql.conf。 您可以使用 mssql.conf [保存您的數據] 區段中所述的 選項,或在容器內手動更新mssql.conf來部署容器之後,在容器的部署-v時掛接。 以下是設定為true的範例mssql.conf檔案memory.enablecontainersharedmemory

    [memory]
    enablecontainersharedmemory = true
    

從容器複製檔案

若要將檔案複製到容器外部,請使用下列命令:

docker cp <Container ID>:<Container path> <host path>

您可透過執行 docker ps -a 命令來取得容器識別碼。

範例︰

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
    

    連線到互動式殼層之後,請執行下列命令來檢查 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 文件