1. 程式人生 > >005.Docker儲存管理

005.Docker儲存管理

一 Docker volume形態

因為Docker 採用 AFUS 分層檔案系統時,檔案系統的改動都是發生在最上面的容器層,在容器的生命週期內,它是持續的,包括容器在被停止後。但是,當容器被刪除後,該資料層也隨之被刪除了。因此,Docker 採用 volume (卷)的形式來向容器提供持久化儲存。Docker volume 有如下幾種形態。
  • 預設,即無Docker volume
  • Data volume (資料卷)
  • data container(資料卷容器)

二 預設無volume

預設情況下,容器不使用任何 volume,此時,容器的資料被儲存在容器之內,它只在容器的生命週期記憶體在,會隨著容器的被刪除而被刪除,此時若需要永久儲存可使用 docker commit 命令將它持久化為一個新的映象。

三 Data volume (資料卷)

一個 data volume 是容器中繞過 Union 檔案系統的一個特定的目錄。被設計用來儲存資料,而不管容器的生命週期。因此,當你刪除一個容器時,Docker 不會自動地刪除一個volume。

3.1 -v掛載容器內目錄

資料卷特性:
  • 資料卷是目錄或檔案,而非沒有格式化的磁碟(塊裝置)
  • 資料卷可以在容器之間共享和重用
  • 對資料卷的修改會立馬生效
  • 對資料卷的更新,不會影響映象
  • 資料卷預設會一直存在,即使容器被刪除
[email protected]
:~# docker run -d -p 8080:80/tcp --name web01 -v /webroot:/usr/local/apache2/htdocs httpd #掛載固定目錄
[email protected]:~# docker run -d -p 9090:80/tcp --name web02 -v /usr/local/apache2/htdocs httpd #自動對映目錄
  • -d:後臺程序;
  • -p:對映埠,物理機埠:容器埠;
  • -v:物理機資料夾:容器的目錄(容器中目錄如果不存在,會自動建立,如果存在,會覆蓋掉),即將宿主機中的目錄掛載到映象中的目錄。
提示:若需要掛載多個目錄,可多次採用-v。 區別:
型別 掛載固定目錄 自動對映目錄
volume 位置 可任意指定 /var/lib/docker/volumes/……
對已有mount point 影響 隱藏並替換為 volume 原有資料複製到 volume
是否支援單個檔案 支援 不支援,只能是目錄
許可權控制 可設定為只讀,預設為讀寫許可權 無控制,均為讀寫許可權
移植性 移植性弱,與host path繫結 移植性強,無需指定host目錄
  1 [email protected]:~# docker inspect b7 | grep -A11 "Mounts"
  2 [email protected]:~# echo "Hello web01!" >/webroot/index.html
  3 [email protected]:~# echo "Hello web02!" >/var/lib/docker/volumes/725d7d76ec8eb10f5730fe5663cb1d1eb7481efaa2a5a790343dca5d0557564a/_data/index.html
39 提示:若不指定本地目錄則會自動在宿主機/var/lib/docker/volumes下為其生成一個隨機目錄。 40 測試:瀏覽器訪問:http://172.24.8.90:8080/ 41 測試:瀏覽器訪問:http://172.24.8.90:9090/ 42 提示:採用volumes資料卷的情況下,當對應的容器被刪除時,其掛載的目錄會保留。主機上的目錄可以是一個本地目錄,也可以在一個 NFS share等形式。

3.2 -v掛載檔案

  1 [email protected]:~# docker run --rm -it --name centos7-01 -v ~/.bashrc:/root/.bashrc centos:7
提示:本地主機檔案作為資料卷掛載到容器中,不建議在容器中直接修改。

四 docker的資料共享

4.1 docker容器與宿主機共享資料

方式一:docker cp cp的用法如下:
  1 docker cp [OPTIONS] CONTAINER:PATH LOCALPATH|-
  2 docker cp [OPTIONS] LOCALPATH|- CONTAINER:PATH
  3 [email protected]:~# docker cp /root/.vimrc centos7-01:/root/			#從宿主機拷貝至容器
  4 [email protected]:~# docker cp centos7-01:/root/.vimrc /root/.vimrc_bak	        #從容器拷貝至宿主機
方式二:採用資料卷掛載形式,見3。

4.2 docker容器之間共享資料

情景一:共享host宿主機目錄 將同一個host目錄掛載到不同的容器即可。
  1 [email protected]:~# docker run -d -p 1010:80/tcp --name web03 -v /webroot:/usr/local/apache2/htdocs httpd
  2 [email protected]:~# docker run -d -p 2020:80/tcp --name web04 -v /webroot:/usr/local/apache2/htdocs httpd
  3 [email protected]:~# echo "This is share file!" >/webroot/index.html
測試:瀏覽器分別訪問http://172.24.8.90:1010和/http://172.24.8.90:2020/。

4.2 docker容器與容器共享資料

見5.data container(資料卷容器)。

五 data container(資料卷容器)

data container中不會跑應用,而只是掛載一個卷,volume container是專門為其他容器提供volume的容器,它提供的卷的型別可以是bind mount,也可以是docker managed volume。

5.1 建立資料卷容器

data container。這種 container 中不會跑應用,而只是掛載一個卷。
  1 [email protected]:~# docker create --name sharefile01 -v /data:/usr/local/apache2/htdocs centos:7
  2 [email protected]:~# docker inspect sharefile01 | grep -A11 "Mounts"
43 解釋:建立一個名為sharefile01的用於容器之間共享資料的資料卷容器,並將宿主機的/data目錄掛載至該容器的/usr/local/apache2/htdocs目錄。 提示:其他容器只需獲取資料卷容器的掛載點,因此可該容器可不執行。/usr/local/apache2/htdocs為容器中的目錄,並非宿主機本地目錄,當其他容器引用此容器時,會自動在容器中掛載此目錄。

5.2 引用資料卷容器

新建容器時可通過--volumes-from引數指定需要引用的資料卷容器。
  1 [email protected]:~# docker run -d -p 3030:80/tcp --name web05 --volumes-from sharefile01 httpd
  2 [email protected]:~# docker run -d -p 4040:80/tcp --name web06 --volumes-from sharefile01 httpd
  3 [email protected]ocker:~# echo "This is share file two!" >/data/index.html
測試:瀏覽器分別訪問http://172.24.8.90:3030和/http://172.24.8.90:4040/。

六 volume管理

6.1 建立volume卷

  1 [email protected]:~# docker volume create --name data02
  2 [email protected]:~# docker volume inspect data02
44

6.2 使用volume卷

  1 [email protected]:~# docker run -d -p 5050:80/tcp --name web07 -v data02:/usr/local/apache2/htdocs httpd
  2 [email protected]:~# echo "Hello web07!" > /var/lib/docker/volumes/data02/_data/index.html
測試:瀏覽器訪問http://172.24.8.90:5050。

6.3 檢視volume卷

  1 [email protected]:~# docker volume ls				#檢視所有volume卷
  2 [email protected]:~# docker volume ls -qf dangling=true	        #檢視所有孤兒卷
提示:使用 docker run -v 啟動的容器被刪除以後,在主機上所掛載的卷不會刪除,即殘留孤兒卷。

6.4 刪除volume卷

  1 [email protected]:~# docker volume rm 95704ae78c05261a46d2dc1f2bf872a8c3dc634817e7c0db53e7e6d40f2dc8ea
  2 [email protected]:~# docker volume rm $(docker volume ls -qf dangling=true)	#刪除孤兒卷

6.5 刪除容器時刪除 volume

  1 [email protected]:~# docker run -d -p 6060:80/tcp --name web08 -v /usr/local/apache2/htdocs httpd
  2 [email protected]:~# docker inspect web08
45
  1 [email protected]:~# docker rm -vf web08
  2 [email protected]:~# docker volume ls
提示:若容器採用靜態固定掛載,則使用-vf也無法刪除volume卷。

七 volume資料備份及還原

7.1 備份

原理:將需要備份的容器,如web09,當做資料卷容器,以此容器建立一個mydatabackup臨時容器,並將宿主機/mybackup掛載到mydatabackup容器的/databack,並在該臨時容器中執行備份的打包命令,備份需要儲存資料的目錄,如/usr/local/apache2到/databack,也就是備份到宿主機/mybackup目錄。
  1 [email protected]:~# docker run -d -p 1111:80/tcp --name web09 -v /usr/local/apache2/htdocs  httpd
  2 [email protected]:~# docker inspect web09 | grep -A11 "Mounts"
  3 [email protected]:~# echo "This is web09 backup test!">/var/lib/docker/volumes/16aa6956e7076ecb9f256c302833640880e3bb1b8602771cca378e7230975488/_data/index.html
46 提示:建立用於備份的容器,並備份該檔案。
  1 [email protected]:~# docker run --volumes-from web09 --name mydatabackup -v /mybackup:/databack httpd tar zcf /databack/http-backup.tar.gz /usr/local/apache2/htdocs
47

7.2 還原

原理:新建一個臨容器,如temp01,然後將容器需要儲存的資料的目錄,如/usr/local/apache2掛載至宿主機,然後再並將宿主機/mybackup掛載到該容器的/databack,將temp01臨時容器當做資料卷容器新建web10容器,並將備份檔案解壓恢復,則恢復至temp01容器所掛載的宿主機目錄,再以temp01為資料卷容器建立新的容器即可。
  1 [email protected]:~# docker run -d -v /usr/local/apache2/htdocs --name temp01 httpd
  2 [email protected]:~# docker run --volumes-from temp01 --name web10 -v /mybackup:/databack httpd tar zxf /databack/http-backup.tar.gz
  3 #此步驟執行完畢即將備份檔案已經還原至容器的/usr/local/apache2/htdocs。
  4 [email protected]:~# docker run -d -p 2222:80/tcp --name web11 --volumes-from temp01 httpd
測試:瀏覽器訪問http://172.24.8.90:2222。 48
參考連結:https://www.cnblogs.com/sammyliu/p/5932996.html https://www.cnblogs.com/shoufengwei/p/7259496.html