上一節咱們講述了SQL Server容器化實踐(注意,SQL Server如今也支持跨平臺),本節將講述如何持久保存數據,而且接下來將逐步講解其餘數據庫(MySql、Redis、Mongodb等等)的容器化實踐,中間再穿插一些知識點和實踐細節。因爲實踐須要花費大量的時間,而目目前業務繁忙,只能加班來進行一些實踐並編寫,若是編寫比較慢,請多多海涵。sql
默認狀況下,在容器內建立的全部文件都存儲在可寫容器層中。這意味着:docker
· 當該容器再也不存在時,數據不會持久存在,而且若是另外一個進程須要,則可能很難從容器中獲取數據。數據庫
· 容器的可寫層緊密耦合到運行容器的主機。數據遷移很麻煩。安全
· 寫入容器的可寫層須要存儲驅動程序來管理文件系統。存儲驅動程序使用Linux內核提供統一的文件系統。與直接寫入主機文件系統相比,這種額外的抽象下降了性能 。bash
所以,若是咱們使用容器命令docker rm刪除了容器,那麼容器中的全部內容均將丟失,包括 SQL Server 和數據庫文件。對於數據庫(不只僅是SQL Server)來講,瞭解 Docker 中的數據持久性相當重要!那麼咱們如何在docker中持久保存咱們的數據呢,即便關聯的容器已經刪除的狀況下?工具
使用數據卷持久保存數據庫文件性能
卷是保存Docker容器中的數據的首選機制。雖然綁定掛載依賴於主機的目錄結構,但卷徹底由Docker管理。主要有以下好處:加密
· 易於備份或遷移。spa
· 可使用Docker CLI命令或Docker API管理卷。3d
· 適用於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
一樣的,咱們也可使用上一節的命令刪除容器並再次建立來驗證數據是否丟失。這裏咱們就不作演示了。