上一篇介紹到如何構建鏡像以及鏡像管理,不知道大家學到現在有沒有疑問?比如我運行web服務產生的日誌,我如何在宿主機上看到?我想安裝mysql或者redis等,配置文件如何配置,可以進到容器去設置,但是容器出現問題或者採重啟怎麼辦呢?種種疑問都說明一個問題--數據共享和持久化
接下來我們就看看Docker和宿主機如何數據共享和持久化?
二. 數據卷在Docker的使用過程中往往需要對數據進行持久化,或者需要在多個容器之間進行數據共享,所以這就涉及到Docker容器的數據操作。容器中數據管理主要有兩種方式:數據卷和數據卷容器。
2.1 數據卷數據卷是一個特殊的目錄,它將主機目錄直接映射進容器。可供一個或多個容器使用。
數據卷設計的目的就是為了 數據的持久化,它完全獨立與容器的生命周期。因此,容器刪除時,不會刪除其掛載的數據卷,也不會存在類似的垃圾機制對容器存在的數據卷進行處理。
數據卷的特性:
數據卷在容器啟動時初始化,如果容器使用的鏡像在掛載點包含了數據,這些數據會拷貝到新初始化的數據卷中可以對數據卷裡的內容直接修改,修改回馬上生效,無論是容器內操作還是本地操作2.1.1 創建一個數據卷使用命令創建一個test-vol
docker volume create test-volfile2.1.2 查看所有的數據卷file2.1.3 查看具體數據卷的信息docker volume inspect test-volfile2.2 掛載數據卷兩種掛載方式:
docker run --name 容器名 -it --mount source=卷名,target=容器內絕對路徑(掛載點) 鏡像名docker run --name 容器名 -it -v 卷名:容器內絕對路徑(掛載點) 鏡像名掛載就是用–mount參數 source是數據卷,target是容器內文件系統掛載點 , 還可以使用-v參數-v 卷名:容器內絕對路徑`
下面創建一個名為 test-web 的容器,並加載一個 數據卷 到容器的 /webapp 目錄。
2.2.1 -mountdocker run -d -P --name test-web -mount source=my-vol,target=/webapp training/webapp python app.py2.2.2 -v掛載docker run -d -P --name test-web -v test-vol:/wepapp training/webapp python app.py2.3 查看數據卷的具體信息數據卷信息在 "Mounts" Key 下面
file2.4 刪除數據卷docker volume rm卷名來刪除指定數據卷
docker volume prune來刪除無主的數據卷
例如: 刪除剛剛創建的test-vol
docker volume rm test-volfile執行命令後報錯,意思是說數據卷正在使用無法刪除,需要將容器停止再刪除
file注: 數據卷是被設計用來持久化數據的,它的生命周期獨立於容器,Docker 不會在容器被刪除後自動刪除 數據卷,並且也不存在垃圾回收這樣的機制來處理沒有任何容器引用的 數據卷。如果需要在刪除容器的同時移除數據卷。可以在刪除容器的時候使用 docker rm -v 這個命令。
2.5 掛載本地數據到容器數據卷在前面示例中,我們運行容器時並沒有指定要掛載到容器中數據卷的本地目錄,所在Docker使用一個默認數據目錄。-v參數除了可以在容器中創建數據卷外,還可以將宿主機中的目錄掛載到容器中的數據卷。
docker run -it -v 宿主機目錄:容器目錄 鏡像
啟動我們之前的centos
docker run -it /usr/dataVolume:/usr/dataVolumeContainer centosfile執行命令後,分別在宿主機和docker容器,可以看到各自在/usr目錄下創建了一個文件夾
file驗證數據共享,在進入容器後,在dataVol中建立一個test.txt的文件,並寫入"hello"
file退出容器,我們在本機的dataVol中可以看到有一個test.txt的文件,內容是"hello",如果我們此時再test.txt中繼續追加 內容 「hello docker」
file2.6 掛載本地文件到容器數據卷docker run --rm -it -v ~/.bash_history:/.bash_history centos /bin/bash以上命令把本地的~/.bash_history文件掛載到新容器中,這樣就可以記錄在容器輸入過的命令了。
三. 數據卷容器如果你有一些要在容器之間共享的持久性數據,或者希望在非持久容器中使用,那麼最好創建一個命名的數據卷容器,然後從其掛載數據。
說通俗點就是一個正常的容器,專門用來提供數據卷供其它容器掛載的接下來,我們創建一個新的命名的共享容器。這個容器不運行一個應用程式,它利用training/postgres鏡像在所有的容器之間創建了一個共享層,以節省磁碟空間。
training/postgres是Docker 之前我下載的一個鏡像,拿來直接使用
file3.1 使用數據卷容器創建數據卷容器後,我們可以通過--volumes-from選項,將一個數據容器掛載到其它容器:
docker run -d --volumes-from dbstore --name db1 training/postgres也可以在多個容器間共享。如,掛載到另一個容器:
docker run -d --volumes-from dbstore --name db2 training/postgresfile這時,如果training/postgres鏡像內有名/dbdata的目錄,則會從dbstore容器掛載卷,並會隱藏training/postgres鏡像中/dbdata下的文件。最終只有dbstore容器中的文件可見。還可以擴展掛載鏈,從已經存在的dbstore容器(如:db1、db2)來掛載卷:
docker run -d --name db3 --volumes-from db1 training/postgresfile這種情況下,如果移除己掛載卷的容器,無論是最初的dbstore容器,還是後面的db1或db2容器,卷都不會被移除。要將卷從硬碟上移除,必須使用docker rm -v命令刪除最後一個引用了該卷的容器。
四. 備份、恢復與遷移數據卷數據卷的常用操作還有數據卷備份、恢復、合併操作。以下是一些常用操作:
4.1 備份數據卷在前面介紹數據卷容器時,我們創建了一個名為dbdata容器,並在容器中創建了一個/dbdata的數據卷。接下來,可以在創建容器使用--volumes-from參數來掛載這個數據卷,並對數據進行備份:
docker run -it -v /data --name test-data docker/whalesay注: docker/whalesay是一個有趣的鏡像
創建data數據卷容器掛載了/data目錄.為了驗證數據卷容器的備份功能,在掛載的/data目錄下創建一個test.text文件,並寫入內容"test"
file然後數據卷容器進行備份,使用 –volumes-from 標記來創建一個加載data容器卷的容器,並從主機掛載當前目錄到容器的/backup目錄。
docker run -it --volumes-from test-data -v $(pwd):/backup docker/whalesay tar cvf /backup/backup.tar /datafile$(pwd)是docker支持的指定當前目錄的方法,了解linux基本命令的會發現,linux查看當前目錄就是pwd命令。容器啟動後,在當前目錄下生成的backup.tar文件就是data容器卷的備份文件。這樣,數據卷容器中的數據就備份完成。
4.2 恢復數據卷數據備份最終也是為了可以恢復,否則備份就沒有意義了,Docker恢復備份也很簡單,只需要2步即可。,可以在創建容器恢復備份數據到容器內的數據卷中,從而實現數據的遷移。
首先,創建並運行容器並添加一個數據卷data1:
docker run -itd -v /data --name data1 centos /bin/bash然後創建另一個容器,掛載data1容器卷中的數據卷,並使用untar解壓備份文件到掛載的容器卷中。
docker run --volumes-from data1 -v $(pwd):/backup centos tar xvf /backup/backup.tar這個時候,之前備份的數據卷容器的數據已經恢復到了容器data1中了。為了查看和驗證恢復的數據,我們可以再啟動一個容器掛載data1容器捲來查看。
file參考連結:
http://suo.im/6okWe9
http://suo.im/5xHqrr