Docker 數據卷之數據持久化與備份-Volume Container(一)
簡介
在使用docker 運行容器的時候,我們通常會保存一些靜態文件是數據,如網站的靜態文件、應用的配置文件等,這些數據需要持久化的存儲,否則會影響我們正在運行的應用或站點頁面,爲了提高數據的持久化安全性,我們可以利用Docker 不會刪除被其他容器使用和掛載的數據卷以及其中的數據,因此,通過創建數據卷容器在容器間存儲與共享文件數據。
數據卷容器在其他容器與數據卷之間起到一個橋的作用,因此,數據卷容器並不需要保證其必須運行。
一、數據卷容器
1. 數據卷容器在容器與數據卷之間的關係,如下所示
2. 創建數據卷容器
創建數據卷容器時,需要使用 -v
參數來建立數據卷容器所使用的數據卷。
[root@localhost ~]# docker create --name data -v /html nginx
注:
- 使用數據卷容器時無須保證數據卷容器處於運行狀態;同時不運行數據卷容器,可以減少對宿主機性能的影響。
- 同一個數據卷容器中,可以使用多個數據卷,不過爲了更爲準確的管理數據卷,建議使用不同的數據卷容器來關聯不同的數據卷,或者對數據捲進行分類存放於不同的數據卷容器中。
3. 連接數據卷容器
通過 --volumes-from
參數掛載數據卷容器關聯的數據卷。數據卷的掛載點,會使用創建數據卷容器時指定的數據卷掛載目錄。
[root@localhost ~]# docker run -t -d -p 80:80 --volumes-from data --name webser nginx
注:
- 多個容器同時使用了相同的數據卷容器所提供的數據卷時,它們所掛載目錄中的文件是相同的。
- 在任意一個容器中對掛載目錄中的文件進行操作,都會影響其他掛載的容器中掛載文件。
- 利用掛載相同數據卷容器所提供的數據卷,可以實現多個容器間對相同文件的即時訪問和操作,進而達到容器間共享文件數據的目的。
- 需要注意,在對數據卷容器提供的數據卷操作時(刪除),需要謹慎,操作結果會影響所有使用的容器。
二、數據卷容器備份(數據卷的遷移)
1. 數據卷的導出(備份)
數據的備份或導出是保證數據安全最簡單的方式,因此在對Docekr 使用過程中自然也就離不開對數據卷的導出或備份工作。
因爲數據卷導出或備份,並不是通過Docker 自身提供的方法實現,而是利用Tar 存檔管理工具來實現。而需要導出的數據卷又不是直接與宿主機目錄形式掛載,因此,要讓數據卷的數據被tar命令訪問到,必須要先進入容器中,在容器中通過tar
命令將數據卷目錄歸檔,然後將歸檔文件保存到容器外,因此,我們需要額外掛載一個容器外的目錄,用來存放歸檔好的數據。
我們利用數據卷容器的數據卷可以被多個容器共享使用(掛載),因此我們可以通過新創建容器掛載宿主機目錄,用於導出共享數據卷需要導出的數據,這樣就很容易的實現數據的導出或備份,具體過程如下圖所示:
1.1 創建新的容器(橋樑)
用於連接到持有需要導出數據卷的數據卷容器,容器創建和運行後,就可以進入容器執行打包命令,將導出數據放到掛載了宿主機目錄的位置。
[root@localhost ~]# docker run -it --volumes-from date -v $(pwd):/bakup --name export --rm nginx bash
1.2 進入容器對需要導出的數據進行歸檔
[root@localhost bakup]# docker run -it --volumes-from date -v $(pwd):/bakup --name export --rm nginx bash
root@43ca716c1f4f:/# tar -cvf /bakup/data.tar /html/
tar: Removing leading `/' from member names
/html/
/html/test/
/html/1.txt
/html/2.txt
/html/3.txt
/html/4.txt
/html/5.txt
/html/6.txt
/html/7.txt
/html/8.txt
/html/9.txt
root@43ca716c1f4f:/# exit
或是直接將tar 命令作爲運行時的命令:
[root@localhost bakup]# docker run -it --volumes-from date -v $(pwd):/bakup --name export --rm nginx tar -cf /bakup/data.tar /html/
注 : --rm
參數:容器停止後自動刪除。
2. 數據卷的導入(恢復)
數據導入(恢復導出的數據),其實只要把導出的過程逆向執行一遍即可。
2.1 創建一個新的容器(橋樑)
新創建的容器,掛載上宿主機中存放導出數據的目錄,並連接到包含共享數據卷的數據卷容器上。
[root@localhost bakup]# docker run -it --volumes-from date -v $(pwd):/bakup --name importer --rm nginx bash
2.2 運行並進入容器,並在容器中對需要恢復的數據進行解包,把導出的數據恢復到目標數據卷指定的位置。
root@5b897788f3a3:/# cd /bakup/
root@5b897788f3a3:/bakup# ls
data.tar html
root@5b897788f3a3:/bakup# tar xf data.tar -C /
root@5b897788f3a3:/bakup# ls /html/
1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt html test
root@5b897788f3a3:/bakup# exit
Docker 數據卷的備份與恢復的過程如上,歡迎相互討論與交流。