1. 程式人生 > >Docker學習筆記:Docker資料管理

Docker學習筆記:Docker資料管理

       容器中資料管理主要有兩種方式:

       資料卷(Data Volumes):容器內資料直接對映到本地主機地址;

       資料卷容器(Data Volume Containers):使用特定容器維護資料卷。

一、資料卷

       資料卷是一個可供容器使用的特殊目錄,它將主機作業系統目錄直接對映進容器。

       特性:

       1) 資料卷可以在容器之間共享和重用,容器間傳遞資料將變得高效方便;

       2) 對資料卷內資料的修改會立馬生效,無論是容器內操作還是本地操作;

       3) 對資料卷的更新不會影響映象,解耦了應用和資料;

       4) 卷會一直存在,直到沒有容器使用,可以安全地解除安裝它。

1、在容器內建立一個數據卷

       執行docker run命令時,使用-v即可在容器內建立一個數據卷。多次重複使用-v可以建立多個數據卷。例如:

       docker run -d -P --name web -v /webapp training/webapp python app.py

       -P是將容器服務暴露的埠,是自動對映到本地主機的臨時埠。

2、掛載一個主機目錄作為資料卷(推薦)

       docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py

       使用者可以將一些程式或資料放到本地目錄中,然後在容器內執行和使用。本地目錄的路徑必須是絕對路徑,如果目錄不存在,Docker會自動建立。Docker掛載資料卷的預設許可權是讀寫(rw),使用者也可以通過ro指定為只讀。例如:

       docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py

3、掛載一個本地主機檔案作為資料卷(不推薦)

       docker run --rm -it -v ~/.bash_history://.bash_history ubuntu /bin/bash

       如果直接掛載一個檔案到容器,使用檔案編輯工具,包括vi或者sed --in-place的時候,可能會造成檔案inode的改變,從Docker 1.1.0起,會導致報錯。

二、資料卷容器

       如果使用者需要在多個容器之間共享一些持續更新的資料,可以使用資料卷容器。資料卷容器也是一個容器,它的目的是專門用來提供資料卷供其他容器掛載。

       首先建立一個數據卷容器,並在其中建立一個數據卷掛載到本地目錄,然後在其他容器中使用--volumes-from來掛載資料卷容器中的資料卷。每一個容器任何一方在該目錄下寫入,其他容器都可以看到。此外,還可以從其他已經掛載了容器卷的容器來掛載資料卷。

       (使用--volumes-from引數所掛載資料卷的容器自身並不需要保持在執行狀態)

       如果刪除了掛載的容器,資料卷並不會被自動刪除。如果要刪除一個數據卷,必須在最後一個還掛載著它的容器時顯式使用docker rm -v命令來指定同時刪除關聯的容器。

三、利用資料卷容器遷移資料

1、備份

       docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata

       ① 首先利用ubuntu映象建立了一個容器worker,使用--volumes-from dbdata引數來讓worker容器掛載dbdata容器的資料卷,使用-v $(pwd):/dbdata引數來掛載本地的當前目錄到worker容器的/backup目錄。

       ② worker容器啟動後,使用了tar cvf/backup/backup.tar /dbdata來將/dbdata下內容備份為容器內的/backup/backup.tar,即宿主主機當前目錄下的backup.tar。

2、恢復

       首先建立一個帶有資料卷的容器dbdata2

       docker run -v /dbdata --name dbtada2 ubuntu /bin/bash

       然後建立另一個新的容器,掛載dbdata2的容器,並使用untar解壓備份檔案到所掛載的容器卷中

       docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar