前面已經介紹了許多基礎的知識,如今咱們來一塊兒學習如何管理Docker容器裏面以及容器之間的數據python
先介紹兩種原始的方法來管理Docker中的應用:web
data volumns
是專門設計的工具,它繞過了UFS直接工做於一個或多個容器。它爲數據持久和分享提供了許多功能:docker
數據卷的設計被用來持久化數據,讓數據可以獨立於容器的生命週期。所以當刪除容器時Docker也不會自動刪除數據卷。shell
增長數據卷ubuntu
docker create -v
和docker run -v
中的-v標記來給容器添加數據卷,咱們能夠在一條命令中屢次使用-v
標記來添加多個數據卷,下面的例子掛載了一個數據卷在咱們的web應用容器中。windows
languagedocker run -d -P --name web -v /webapp training/webapp python app.py
這條命令執行後會在容器中建立一個新的卷webapp
bash
爲數據卷掛在主機目錄app
除了使用-v標記來建立卷以外,你還能夠掛載Docker守護進程主機的目錄到容器中。webapp
注意:若是你使用Boot2Docker,那麼你的Docker守護進程只能被限制訪問OSX/windows特定的文件目錄。Boot2Docker會努力自動分享OSX中的
/users
目錄和windows中的C:users
目錄。所以你能夠經過docker run -v /Users/<path>:/<container path>
... (OSX)或者docker run -v /c/Users/<path>:/<container path ...
(Windows).來掛在文件或目錄。全部的其它路徑(不是/users和C:users)都來自Boot2Docker虛擬機中的文件系統。工具
languagedocker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
上述命令會把主機的/src/webapp
目錄掛在到容器中的/opt/webapp
下
注意:若是
/opt/webapp
目錄已經存在與容器的鏡像中,那麼/opt/webapp
中的內容會被主機上的/src/webapp
中的數據替換,這個和mount命令是一致的。
數據卷掛在數據對測試很是有用,好比咱們能夠把源代碼掛在到容器中,而後修改代碼看看應用會發生什麼。主機上的目錄必須是絕對路徑,若是這個目錄不存在Docker會自動去建立1個。
注意:不能在
Dockerfile
中來配置掛載目錄,由於Dockerfile
的目的是更方便的來一直和分享鏡像,而主機目錄依賴於主機,(對於一個目錄,在不一樣的主機上可能絕對路徑不一致)因此Dockerfile中目錄掛載不會適用於全部的主機
掛載的數據卷默認是可讀寫的,固然咱們能夠經過命令標記來讓它只讀
languagedocker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
上述命令中咱們經過ro
選項來讓數據卷只讀
掛載主機文件做爲數據卷
-v
標記還能夠用來掛在來自主機的文件,而不單單是目錄
languagedocker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
上述命令會帶你到一個新容器的shell界面,你會有來自主機的bash歷史。由於容器和主機共享了一個.bash_history
文件,因此你在容器中的命令歷史和主機中的歷史都會記錄到.bash_history
中,這樣當你退出容器中時,你在容器中的命令歷史被保存下來了,在主機的shell歷史記錄中仍然可以看到容器中的歷史。
注意:人們會使用不少工具來編輯文件,
vi
,sed --in-place
,這些都會致使文件的索引節點改變。Docker 1.1.0以前,文件修改會報如sed: cannot rename ./sedKdJ9Dy: Device or resource busy
這樣的錯誤。可是在Docker 1.1.0以後,掛載文件讓文件修改變得很是簡單而不須要再去掛在包含這個文件的父目錄了。
建立一個專門防數據的數據卷容器
若是你有一些持久化的數據須要在容器之間共享,或者想從非持久化容器使用持久化數據。最好的辦法是建立名爲Data
的卷容器,把數據都掛在到Data容器裏
咱們建立一個能分享數據的命名容器,他不運行任何應用,它重複使用training/postgres
鏡像以便全部的容器使用同一個層,這樣能夠節省磁盤空間。
languagedocker create -v /dbdata --name dbdata training/postgres /bin/true
咱們使用--volumes-from
標記來綁定/dbdata
捲到另外一個容器
languagedocker run -d --volumes-from dbdata --name db1 training/postgres
或者
languagedocker run -d --volumes-from dbdata --name db2 training/postgres
在是上述的例子中,咱們在容器中掛在了/dbdata
卷,若是恰巧鏡像training/postgres
中也有/dbdata
這個目錄,那麼容器會隱藏鏡像的目錄,而讓容器中的/dbdata目錄可見,新建多個數據容器一樣是隱藏鏡像的文件而顯示容器中的文件,這種機制實現了數據卷的數據共享。
你能夠在一條命令中使用多個--volumes-from
標記參數把多個容器的數據卷綁定在一塊兒。
上述的代碼中db1和db2是掛載dbdata這個容器來擴展的,你也能夠掛載db1或者db2來擴展你的數據卷。
languagedocker run -d --name db3 --volumes-from db1 training/postgres
若是你想刪除包含掛載數據卷的容器,甚至是初始化的容器dbdata
,或者是由dbdata
擴展的db1和db2,容器會刪除,可是數據卷會留下。使用docker rm -v
來刪除容器的數據卷。
注意:當你刪除容器沒有使用
-v
標記的時候,Docker不會提示警告。沒有使用-v
標記刪除容器,會讓殘留的volumns
變得「無家可歸」(就是沒有容器再引用這個數據卷)。這樣的卷很難刪除並且會佔用不少空間,咱們正在努力改善數據卷的管理,你能夠經過pull request #8484
來跟進咱們的進程。
咱們能夠利用數據捲來有效的備份、恢復和遷移數據
languagedocker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
命令中咱們啓動了一個新的容器,它共享了來自dbdata
容器的數據卷。而後咱們掛在了一個本地主機的目錄/backup
。最後咱們使用tar
命令把/dbdata
中的數據壓縮成dbdata.jar
放到/backup
中。執行結束咱們就完成了數據卷的數據備份工做。
數據恢復
languagedocker run -v /dbdata --name dbdata2 ubuntu /bin/bash docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
建立一個新的容器dbdata2
,解壓文件到新的容器的數據卷。