如何備份還原 Docker Volume

記載一下備份、還原 Docker Volume 的相關操作

對於 Docker 我也不是很熟,所以就跳過理論性的東西,直接紀錄步驟吧,針對 Docker 服務所使用到的 Volume 備份及還原方式,使用的環境是 Docker For Windows CE,採用的是 Linux Container 模式。

前置作業

首先先建立 SQL 的 DockerVolume

1
docker volume create linux_mssql

建立一個 MSSQL Linux Container,命名為 linuxMSSQL,從指令列中可看到 sa 的預設密碼是 Passw0rd!,等等就用這個測試

1
docker run --name linuxMSSQL -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=Passw0rd!" -p 1433:1433 -v linux_mssql:/var/opt/mssql -d mcr.microsoft.com/mssql/server:2017-latest

記得自己要弄的話,SA 預設密碼最好改一下

建立完成之後可以連進去塞一些假資料用來測試,這邊就不貼圖了

備份 Volume

透過 alpine 這個 Image,掛載與 SQL 服務相同的 Volume,連線進去 alpine Container 之後,對 Volume 操作,最後再透過 docker commitdocker save 指令讓 container 做成一個新的 Image,再把 Image 輸出成實體檔案之後,就可以針對實體檔案進行備份了。

1
2
3
4
5
# 讓 Image 掛載相同的 Volume
docker run -d --name mssqlBackup -v linux_mssql:/volume alpine ping 127.0.0.1

# 將 Volume 的內容透過壓縮指令打包成一個壓縮檔,還原的時候會用到
docker exec -it mssqlBackup tar -cjf /sqldata.tar.bz2 -C /volume ./

在這個環節其實可以先透過指令docker exec -it mssqlBackup sh連線進去查看 Volume 的實體檔案有哪些,甚至也可以直接把 mdf 檔案抓出來備份之類的,但是採用 Volume 方式備份的好處就是不用管甚麼服務,都是一樣將 Volume 備份、還原,而且可以再考慮架設自己的 Docker Registry,會更便捷

接下來將剛才處理好的 alpine image 弄成實體檔案來備份

1
2
3
4
5
# 將mssqlBackup打包成一個新的images:linux-mssql-volume
docker commit -p 9a1179cb9f6b linux-mssql-volume

# 將images導出為實體檔案
docker save -o linux-mssql-volume.tar linux-mssql-volume

到這邊就完成了備份的動作,為了測試需要,可以只保留實體檔案,先將相關的 images、用到的 volume 都砍掉,來模擬新主機還原的作業,如果有第二台電腦可以試,那就直接將實體檔案 copy 過去就好了。

還原 Volume

首先一樣先建立一個 Docker Volume,等等還原會用到,建議用相同名稱就好了,接著將實體檔案透過指令載入成 Image,最後掛載成 Container 之後將檔案複製到我們建立的 Docker Volume 即可。

1
2
3
4
5
6
7
8
# 建立 Docker Volume
docker volume create linux_mssql

# 還原檔案為 Image
docker load -i linux-mssql-volume.tar

# 使用 alpine 掛載 Docker Volume之後,透過指令將原先 Image 內的壓縮檔解壓縮到 Docker Volume,完成之後自動刪掉 Alpine 的 Container
docker run --rm -v linux_mssql:/volume linux-mssql-volume sh -c "rm -rf /volume/* /volume/..?* /volume/.[!.]* ; tar -C /volume/ -xjf /sqldata.tar.bz2 ;"

到這邊就完成了 Docker Volume 的還原,接下來只要重新執行前置作業中的建立 MSSQL Container 就可以接著使用了。

如何將 Windows 環境底下的 Docker Volume 備份一直很困擾我,看了這篇文章之後才發現原來解法這麼簡單,直接掛載一個 Linux 可以操作指令的 Container,將 Volume 共用,就可以針對檔案操作了,那篇文章內是用 Docker Register 作範例,有興趣的人可以參考一下