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掛載容器內目錄

數據卷特性:
  • 數據卷是目錄或文件,而非沒有格式化的磁盤(塊設備)
  • 數據卷能夠在容器之間共享和重用
  • 對數據卷的修改會立馬生效
  • 對數據卷的更新,不會影響鏡像
  • 數據卷默認會一直存在,即便容器被刪除
root@docker:~# docker run -d -p 8080:80/tcp --name web01 -v /webroot:/usr/local/apache2/htdocs httpd #掛載固定目錄
root@docker:~# 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 root@docker:~# docker inspect b7 | grep -A11 "Mounts"
  2 root@docker:~# echo "Hello web01!" >/webroot/index.html
  3 root@docker:~# echo "Hello web02!" >/var/lib/docker/volumes/725d7d76ec8eb10f5730fe5663cb1d1eb7481efaa2a5a790343dca5d0557564a/_data/index.html
 
39_thumb1
提示:若不指定本地目錄則會自動在宿主機/var/lib/docker/volumes下爲其生成一個隨機目錄。
40_thumb1
測試:瀏覽器訪問:http://172.24.8.90:8080/
41_thumb1
測試:瀏覽器訪問:http://172.24.8.90:9090/
42_thumb1
提示:採用volumes數據卷的狀況下,當對應的容器被刪除時,其掛載的目錄會保留。主機上的目錄能夠是一個本地目錄,也能夠在一個 NFS share等形式。

3.2 -v掛載文件

  1 root@docker:~# 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 root@docker:~# docker cp /root/.vimrc centos7-01:/root/			#從宿主機拷貝至容器
  4 root@docker:~# docker cp centos7-01:/root/.vimrc /root/.vimrc_bak	        #從容器拷貝至宿主機
 
方式二:採用數據卷掛載形式,見3。

4.2 docker容器之間共享數據

情景一:共享host宿主機目錄
將同一個host目錄掛載到不一樣的容器便可。
  1 root@docker:~# docker run -d -p 1010:80/tcp --name web03 -v /webroot:/usr/local/apache2/htdocs httpd
  2 root@docker:~# docker run -d -p 2020:80/tcp --name web04 -v /webroot:/usr/local/apache2/htdocs httpd
  3 root@docker:~# 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 root@docker:~# docker create --name sharefile01 -v /data:/usr/local/apache2/htdocs centos:7
  2 root@docker:~# docker inspect sharefile01 | grep -A11 "Mounts"
 
43_thumb1
解釋:建立一個名爲sharefile01的用於容器之間共享數據的數據卷容器,並將宿主機的/data目錄掛載至該容器的/usr/local/apache2/htdocs目錄。
提示:其餘容器只需獲取數據卷容器的掛載點,所以可該容器可不運行。/usr/local/apache2/htdocs爲容器中的目錄,並不是宿主機本地目錄,當其餘容器引用此容器時,會自動在容器中掛載此目錄。

5.2 引用數據卷容器

新建容器時可經過--volumes-from參數指定須要引用的數據卷容器。
  1 root@docker:~# docker run -d -p 3030:80/tcp --name web05 --volumes-from sharefile01 httpd
  2 root@docker:~# docker run -d -p 4040:80/tcp --name web06 --volumes-from sharefile01 httpd
  3 root@docker:~# 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 root@docker:~# docker volume create --name data02
  2 root@docker:~# docker volume inspect data02
 
44_thumb1

6.2 使用volume卷

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

6.3 查看volume卷

  1 root@docker:~# docker volume ls				#查看全部volume卷
  2 root@docker:~# docker volume ls -qf dangling=true	        #查看全部孤兒卷
 
提示:使用 docker run -v 啓動的容器被刪除之後,在主機上所掛載的卷不會刪除,即殘留孤兒卷。

6.4 刪除volume卷

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

6.5 刪除容器時刪除 volume

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

七 volume數據備份及還原

7.1 備份

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

7.2 還原

原理:新建一個臨容器,如temp01,而後將容器須要保存的數據的目錄,如/usr/local/apache2掛載至宿主機,而後再並將宿主機/mybackup掛載到該容器的/databack,將temp01臨時容器當作數據卷容器新建web10容器,並將備份文件解壓恢復,則恢復至temp01容器所掛載的宿主機目錄,再以temp01爲數據卷容器建立新的容器便可。
  1 root@docker:~# docker run -d -v /usr/local/apache2/htdocs --name temp01 httpd
  2 root@docker:~# docker run --volumes-from temp01 --name web10 -v /mybackup:/databack httpd tar zxf /databack/http-backup.tar.gz
  3 #此步驟執行完畢即將備份文件已經還原至容器的/usr/local/apache2/htdocs。
  4 root@docker:~# docker run -d -p 2222:80/tcp --name web11 --volumes-from temp01 httpd
 
測試:瀏覽器訪問http://172.24.8.90:2222。
48_thumb1
 
參考連接:https://www.cnblogs.com/sammyliu/p/5932996.html
https://www.cnblogs.com/shoufengwei/p/7259496.html
相關文章
相關標籤/搜索