甚麼是資料卷 (Data Volume)?
一個可供一個或多個容器使用的特殊容器
特點
- 更新資料卷不會影響映像檔
- 可在多個容器間共享
- 直到容器結束使用,資料卷一直存在
建立資料卷
透過指令參數直接建立掛載資料卷的容器
* docker create --name TDOH –v /html nginx
// name 為容器名稱
// -v 在容器內產生路徑為 /html的資料卷
也可以單獨產生資料卷
* docker volume create
//會回傳一個獨特的 64位元 16進位字串
* docker volume --name TIKB-043
// 會回傳 TIKB-043 這個名字
查看資料卷詳細資料
* docker inspect TIKB-043
//回傳資料卷資料
掛載資料卷
* docker create --name TDOH -v TIKB-043:/TIKB-043 nginx
// name一樣是容器名稱
// -v <資料卷名稱>:<容器內的掛載路徑>
也可掛載host內現存的路徑
* docker create --name TDOH -v /var/html:/html nginx
// -v <src>:<dest>
也可增加參數,掛載多個資料卷
* docker create --name TDOH -v /var/html:/html -v TIKB-043:/TIKB-043 nginx
可限制掛載文件權限
* docker create --name TDOH -v /var/html:/html:ro -v TIKB-043:/TIKB-043 nginx
刪除資料卷
資料卷並不會因為容器的停止而跟著消失,所以需要額外指令來刪除
刪除前需要查看有哪些資料卷
* docker volume list
* docker volume rm <資料卷名稱/資料卷 id>
// 刪除資料卷
* docker rm -v <容器名稱>
// 刪除此容器掛載的資料卷,若有資料卷被其他容器使用,則該資料卷不刪除
資料卷容器(Data Volume Container)
專門用來存放資料卷的容器
其他容器改由資料卷容器中掛載資料卷,而非直接從 host掛載
原理
藉由刪除 docker指令的 –v 參數,由於資料卷容器維持運行,所以資料卷容器內的資料跟著被刪除
建立資料卷容器
其實就是一般容器掛載資料卷
* docker create --name Data -v TIKB-043:/TIKB-043 nginx
//建立資料卷容器,name為資料卷容器名稱
* docker inspect Data
// 可查看資料卷容器詳細資訊
連結資料卷容器
* docker run -d --name TDOH --volumes-from Data nginx
//參數 -d 為容器的後台守護模式
// name 為容器名稱
// -- volumes-from 欲連結的資料卷容器名稱
亦可多個參數,連接至多個資料卷容器
* docker run -d --name TDOH --volumes-from Data --volumes-from FLASH ]nginx
對某個容器內的資料卷進行操作,其他容器內的資料卷也會同步更動
可實現檔案的共同操作
資料卷的移植
備份資料卷,無法透過Docker內建的方式進行,但可以透過 Tar 壓縮還原工具 對資料卷進行備份
匯出資料卷
- 建立新容器
- 連接到資料卷容器
- 運行新容器
- 進入容器執行封裝命令
- 匯出資料位在Host 中對應的掛載目錄
* docker run –it –volumes-from Data –v $(pwd):/backup --name exporter –rm ubuntu /bin/bash
// 參數 -it 為容器的前台互動模式
// -v $(pwd):/backup 從host現在目錄下掛載所有檔案到容器內 /backup目錄底下
// name 容器名稱
//rm 容器結束時則刪除
在容器內
* tar cf /backup/data.tar /data
* exit
// 在容器內的 /backup 底下建立 還有 /data 目錄的 data.tar壓縮檔
此時 Exporter容器已消失
匯入資料卷
* docker run –it –volumes-from Data –v $(pwd):/backup --name importer –rm ubuntu /bin/bash
在容器內
* tar xf /backup/data.tar
* exit
// 將從 host中掛載的 data.tar 壓縮檔解壓縮
資料卷對於 Docker可說是檔案編輯修改共享的利器
但遠端的檔案該如何傳送呢?
下一篇則會提到 Docker中的網路問題
參考資料
[1]https://larrylu.blog/step-by-step-dockerize-your-app-ecd8940696f4