Docker教程小白實操入門(21)--如何備份、恢復資料卷

軟體工程小施同學發表於2020-10-07

一、需求

如何備份、恢復資料卷

 

二、備份一個資料卷

1. 建立一個容器dbcontainer1和資料卷db1

# 建立一個容器dbcontainer1,並建立了一個名為db1的資料卷,將資料卷掛在到容器的/dbdate目錄
docker run -v db1:/dbdate --name dbcontainer1 ubuntu

 

2. 進入一個空白目錄,建立一個新容器,新容器與dbcontainer1容器共享dbdata掛載目錄

# 使用--volumes-from建立一個新容器,新容器與container1容器共享dbdata掛載目錄,同時把主機上的當前目錄掛載到容器的/backup目錄
docker run --volumes-from dbcontainer1 -v $(pwd):/backup ubuntu tar -cvf /backup/backup.tar /dbdata

容器啟動後,使用了tar 命令來將 dbdata目錄壓縮,並儲存在 /backup/backup.tar檔案中。

由於主機的當前目錄掛載在容器的/backup目錄下,而繫結掛載的兩個目錄的內容完全保持一致,所以相當於將dbcontainer1資料卷的內容壓縮後備份到了宿主機的當前目錄了 。

 

三、恢復一個資料卷

假設一不小心名為db1的資料卷給刪除掉了,可以這麼恢復:

1. 首先建立一個帶有空資料卷的容器dbcontainer2,掛載目錄為/dbdata,資料卷名為db1

docker run -v db1:/dbdata --name dbcontainer2 ubuntu /bin/bash

2. 進入之前儲存backup.tar的宿主機目錄,在該目錄下執行下面命令

docker run --volumes-from dbcontainer2 -v $(pwd):/backup busybox tar -xvzf /backup/backup.tar -C /dbdata

該命令建立一個新容器,新容器與dbcontainer2容器共享dbdata掛載目錄,同時將主機的當前目錄掛載的容器的/backup中。

啟動容器時,使用tar命令將資料卷的備份檔案backup.tar解壓到/dbdata目錄,由於該容器與dbcontainer2容器共享一個資料卷,也就相當於將backup.tar解壓到了dbcontainer2/dbdata目錄。

又因為dbcontainer2將名為db1的資料卷掛載到了/dbdata上,所以實質上就將db1的資料卷內容完全恢復了!

 

 

四、例項

#!/bin/bash
#拉取ubutun 最新映象,實際生產中,docker pull 這一步可以省略,docker run的時候會自己去拉取。
docker pull ubuntu
# 建立一個vo1的資料卷,並在資料卷中新增1.txt檔案
docker run --name vocontainer1 -v vo1:/dir1 ubuntu touch /dir1/1.txt


#1.將vo1資料卷的資料備份到宿主機的/newback中,將容器的/backup路徑掛載上去,並將容器內/dir1資料夾打包至/backup/backup.tar
#********** Begin *********#
docker run --volumes-from vocontainer1 -v /newback:/backup  ubuntu tar -cvf /backup/backup.tar /dir1
#********** End **********#


#刪除所有的容器以及它使用的資料卷
docker rm -vf $(docker ps -aq)
docker volume rm vo1

#再次建立一個vo1的資料卷
docker run -itd --name vocontainer2 -v vo1:/dir1 ubuntu /bin/bash

#2.將儲存在宿主機中備份檔案的資料恢復到vocontainer2的/中
#********** Begin *********#
docker run --volumes-from vocontainer2 -v /newback:/backup ubuntu tar -xvf /backup/backup.tar -C /
#********** End **********#

 

 

 

參考:https://www.educoder.net/shixuns/pebvjtk9/challenges

相關文章