在使用Docker時,若需要查看容器內應用程式產生的資料,或是需要對資料進行儲存,甚至多容器共用,就必須涉及到容器的資料管理操作。
容器中管理資料主要有兩種方式:
資料卷(Data Volumes):容器內資料直接對應到本地主機環境
資料卷容器(Data Volume Containers):使用特定容器來維護資料卷
資料卷是一個可以供容器使用的特殊目錄,它將主機作業系統目錄直接對應到容器中,類似Linux內的mount。
資料卷可以在容器之間共用和重用,容器間傳遞資料將變得更方便和有效率。
對資料卷內資料的修改會立即生效,無論是容器內操作或本機上操作
對資料卷的更新不會影響映像檔,應用程式和資料是分開的
資料卷會一直存在,直到沒有容器使用,便可以移除它
在用docker create 或 docker run的指令時,使用-v參數會在主機端建立一個目錄並掛載到容器中。一次重複使用多個-v參數可以掛載多個資料卷目錄。
docker run -d -P --name web -v /webapp training/webapp python app.py
使用training/webapp映像檔新建一個web容器,並新增一個資料卷掛載到容器的/webapp目錄
-P是將容器服務的連接埠對外開放,會自動隨機對應到本機上的連接埠。
使用-v參數也可以指定掛載一個本地端的已存在目錄到容器中作為資料卷,若本機欲掛載目錄不存在,則會自動建立此目錄。
docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
此命令會掛載主機的/src/webapp目錄到容器的/opt/webapp目錄
使用者可以放置一些程式或資料到本機目錄中,然後在容器內運行和使用。
容器掛載目錄的路徑必須是絕對路徑,本機掛載目錄可以是相對路徑或絕對路徑。
Docker掛載資料卷的預設權限是可讀寫(rw),若要改成唯讀(ro),可以使用:
docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
資料卷容器也是一個容器,但是它的目的是專門用來提供資料卷供其他容器掛載。
首先,建立一個資料卷容器dbdata,並在其中新增一個資料卷掛載到/dbdata:
docker run -it -v /dbdata --name dbdata ubuntu
然後在其他容器中使用 --volumes-from來掛載dbdata容器中的資料卷,例如新增db1和db2兩個容器,並從dbdata容器掛載資料卷:
docker run -it --volumes-from dbdata --name db1 ubuntu
docker run -it --volumes-from dbdata --name db2 ubuntu
此時,容器db1和db2都掛載同一個資料卷到相同的/dbdata目錄。
三個容器任何一方在該目錄下的寫入,其他容器都可以看的到。
此時我們試著在容器db1容器中新增一個test檔案
在db2和dbdata容器內查看test檔案是否存在
可以多次使用--volumes-from參數來從多個容器掛載多個資料卷。
若刪除了掛載的容器(dbdata、db1、db2),資料卷並不會自動刪除。
如果要刪除一個資料卷,必須在刪除最後一個還掛載著它的容器時使用 docker rm -v命令來指定同時刪除關聯的容器
可以利用資料卷容器對其中的資料卷進行備份、回復,以實現資料的遷移。
備份(Backup):
使用下面的命令來備份dbdata資料卷容器內的資料卷:
docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvPf /backup/backup.tar /dbdata
利用ubuntu映像檔建立了一個容器worker,使用--volumes-from dbdata參數讓worker容器掛載dbdata容器的資料卷(即dbdata容器內的/dbdata目錄);使用-v $(pwd):/backup參數來掛載本機目前的執行目錄到worker容器的/backup目錄。
worker容器啟動後,使用了 tar cvPf /backup/backup.tar /dbdata命令來將/dbdata底下的內容備份為容器內的 /backup/backup.tar,即Host主機目前執行目錄下的backup.tar
2.恢復(Restore):
如果要將資料恢復搬移到一個容器,可以先建立一個帶有資料卷的容器dbdata2:
docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
然後新建另一個新的容器,掛載dbdata2的容器,並使用untar解壓縮備份檔案到所掛載的容器卷中:
docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar