上一節我們講述了SQL Server容器化實踐(注意,SQL Server現在也支援跨平臺),本節將講述如何持久儲存資料,並且接下來將逐步講解其他資料庫(MySql、Redis、Mongodb等等)的容器化實踐,中間再穿插一些知識點和實踐細節。由於實踐需要花費大量的時間,而目目前業務繁忙,只能加班來進行一些實踐並編寫,如果編寫比較慢,請多多海涵。
目錄
如何持久儲存資料?
預設情況下,在容器內建立的所有檔案都儲存在可寫容器層中。這意味著:
· 當該容器不再存在時,資料不會持久存在,並且如果另一個程式需要,則可能很難從容器中獲取資料。
· 容器的可寫層緊密耦合到執行容器的主機。資料遷移很麻煩。
· 寫入容器的可寫層需要儲存驅動程式來管理檔案系統。儲存驅動程式使用Linux核心提供統一的檔案系統。與直接寫入主機檔案系統相比,這種額外的抽象降低了效能 。
因此,如果我們使用容器命令docker rm刪除了容器,那麼容器中的所有內容均將丟失,包括 SQL Server 和資料庫檔案。對於資料庫(不僅僅是SQL Server)來說,瞭解 Docker 中的資料永續性至關重要!那麼我們如何在docker中持久儲存我們的資料呢,即使關聯的容器已經刪除的情況下?
使用資料卷持久儲存資料庫檔案
卷是儲存Docker容器中的資料的首選機制。雖然繫結掛載依賴於主機的目錄結構,但卷完全由Docker管理。主要有如下好處:
· 易於備份或遷移。
· 可以使用Docker CLI命令或Docker API管理卷。
· 適用於Linux和Windows容器。
· 可以在多個容器之間更安全地共享卷。
· 卷驅動程式允許在遠端主機或雲提供程式上儲存卷,加密卷的內容或新增其他功能。
· 新卷可以通過容器預先填充內容。
因此,通常情況下,卷相對於容器的可寫層中的持久資料來說是更好的選擇,因為卷不會增加容器的大小,並且卷的內容存在於給定容器的生命週期之外。接下來,我們就一起來實踐。
方式一,使用主機目錄
首先,我們可以將主機目錄載入為容器的資料卷,用來儲存資料庫檔案。例如,我們可以通過-v <host directory>:/var/opt/mssql命令引數來完成需求:
PowerShell:
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=123456abcD" `
-p 1433:1433 --name mySqlServer `
-v d:/temp/data:/var/opt/mssql `
-d mcr.microsoft.com/mssql/server:2017-latest
bash:
docker run -e 'ACCEPT_EULA=Y' \
-e 'SA_PASSWORD=123456abcD' \
-p 1433:1433 \
--name mySqlServer \
-v /temp/data:/var/opt/mssql \
-d mcr.microsoft.com/mssql/server:2017-latest
注意:-v引數應該在-d引數之前。
-v or –volume用於對映卷,冒號“:”前面的目錄是宿主機目錄,冒號後面的目錄是容器內目錄。
執行成功後,我們可以看到容器已正常執行,並且主機目錄已繫結:
我們啟動SSMS工具建立一個資料庫,然後開啟本地資源管理器即可看到:
接下來,我們刪除容器,然後來驗證資料庫檔案是否任然保留:
PowerShell:
set-location D:\temp\data\data
docker stop mySqlServer
docker rm mySqlServer
ls
執行結果如下所示:
值得注意的是,SQL Server會自動從目錄/var/opt/mssql掛載資料庫,我們可以使用以下步驟來驗證:
第一步:
PowerShell:
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=123456abcD" `
-p 1433:1433 --name mySqlServer `
-v d:/temp/data:/var/opt/mssql `
-d mcr.microsoft.com/mssql/server:2017-latest
docker exec -it mySqlServer "bash"
第二步:
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '123456abcD'
第三步:
SELECT Name from sys.Databases
GO
注意:SQL Server容器啟動時需要一些時間,啟動完成後才能連線。
方式二,使用資料卷
我們可以使用docker volume命令來建立卷,然後
PowerShell:
docker volume create my-data
docker volume ls
docker run -e "ACCEPT_EULA=Y" `
-e "MSSQL_SA_PASSWORD=123456abcD" `
-p 1433:1433 --name mySqlServer `
-v my-data:/var/opt/mssql `
-d mcr.microsoft.com/mssql/server:2017-latest
我們可以使用以下命令來檢查資料卷:
docker volume inspect my-data
同樣的,我們也可以使用上一節的命令刪除容器並再次建立來驗證資料是否丟失。這裡我們就不做演示了。