Docker持久化存儲之數據共享

持久化存儲 Data volume

要知道容器是有生命週期的。
docker默認的存儲方式:存儲類型:(strage driver:overlay2.xfs)html

data volume有兩種掛載方式:

1)bind mount(用戶管理):將宿主機上的某個目錄或文件(不能夠是沒有格式化的磁盤文件),掛載到容器中,默認在容器內對此目錄是有讀寫權限的,若是隻須要向容器內添加文件,不但願覆蓋目錄,須要注意源文件必須存在,不然會被當作一個目錄bind mount給容器。
2)docker manager volume(docker自動管理):不須要指定源文件,只須要指定mount point(掛載點)。把容器裏面的目錄映射到了本地。
這種方式相比bind mount 缺點是沒法限制對容器裏邊目錄或文件的權限。nginx

使用第二種掛載方式,-v 掛載時,不指定源文件位置,則默認掛載的路徑是:web

[root@sqm-docker01 _data]# pwd
/var/lib/docker/volumes/dd173640edd5b0205bb02f3c4139647be12528b38289b9f93f18123a6b1266a8/_data
#當有目錄掛載時,默認在/var/lib/docker/volumes/下會生成一串hash值,hash值下有一個_data的目錄,容器內映射的文件就在此路徑下。

實例一:單臺dockerhost,容器間的數據共享

首先建立一個volume container:docker

volume container基本概念:**

  • volume container是專門爲其餘容器提供volume的容器。
  • volume container 提供的卷可使bind mount,也能夠是docker manager volume。

volume contianer的優勢:
與bind mount相比,沒必要爲每一容器指定源文件路徑,全部路徑都在volume container中定義好,容器只需與volume container關聯,從而實現容器與host的解耦。vim

(1)建立volume container:
首先我在本地建立容器須要掛載的web網頁目錄:
[root@sqm-docker01 ~]# mkdir html
[root@sqm-docker01 ~]# echo "hello volume_data" > html/index.html
#我直接使用了兩種掛載方式(基於busybox鏡像來建立):
[root@sqm-docker01 ~]# docker create  --name vc_data01 -v /root/html/:/usr/share/nginx/html -v /other/useful/tools/ busybox

注意:該vcdata01也爲一個容器,但它的狀態是create。
Docker持久化存儲之數據共享centos

(3)基於volume container運行nginx容器:
[root@sqm-docker01 ~]# docker run -d --name test1 -p 80:80 --volumes-from vc_data01 nginx:latest
  • --volumes-from:指定數據卷

(4)訪問nginx的默認網頁:
Docker持久化存儲之數據共享
查看映射到本地默認路徑,會生成兩個hash值,表明掛載了兩個host path。
Docker持久化存儲之數據共享服務器

實例二:跨主機實現數據共享

方法一:搭建nfs服務:

環境:兩臺dockerhost(centos7)
docker01:172.16.1.30
docker02:172.16.1.31
nfs服務器:172.16.1.40curl

nfs server:ide

[root@nfs-server ~]# yum -y install nfs-utils  #安裝nfs服務
[root@nfs-server ~]# yum -y install rpcbind  #遠程傳輸控制協議

[root@nfs-server ~]# vim /etc/exports
Docker持久化存儲之數據共享測試

參數解釋:
*:表示全部地址,也能夠自定義ip地址,或者網段
rw:可讀可寫
sync:同步數據到磁盤
no_root_squash:加上這個選項後,root用戶就會對共享的目錄擁有至高的權限控制,就像是對本機的目錄操做同樣。

[root@nfs-server ~]# mkdir /nfs              #建立共享目錄
[root@nfs-server ~]# systemctl start rpcbind    #先啓動該服務
[root@nfs-server ~]# systemctl start nfs

docker01和dcoker02測試是否可以掛載:
Docker持久化存儲之數據共享

Docker持久化存儲之數據共享

docker01:
將本地目錄掛載到nfs服務器上:

建立網頁目錄:
[root@sqm-docker01 ~]# mkdir html

[root@sqm-docker01 ~]# vim /etc/fstab ##進入配置文件進行掛載
Docker持久化存儲之數據共享

[root@sqm-docker01 ~]# mount -a   #從新加載使其生效
[root@sqm-docker01 ~]# df -hT   #查看磁盤信息

Docker持久化存儲之數據共享

編寫網頁內容:
[root@sqm-docker01 ~]# echo "hello docker02" > html/index.html
[root@sqm-docker01 ~]# cat html/index.html 
hello docker02
運行nginx容器:
[root@sqm-docker01 ~]# docker run -d --name nginx01 -p 80:80 -v /root/html/:/usr/share/nginx/html nginx:latest

Docker持久化存儲之數據共享

docker02:
掛載nfs:

[root@sqm-docker02 ~]# mkdir html    #建立掛載目錄
[root@sqm-docker02 ~]# vim /etc/fstab

Docker持久化存儲之數據共享
[root@sqm-docker02 ~]# mount -a #從新加載使其生效

//查看目錄文件是否同步:
[root@sqm-docker02 ~]# cat html/index.html 
hello docker02
//運行nginx容器:
[root@sqm-docker02 ~]# docker run -d --name nginx02 -p  80:80 -v /root/html/:/usr/share/nginx/html nginx

Docker持久化存儲之數據共享

訪問nginx頁面:
Docker持久化存儲之數據共享

咱們在docker01上修改nginx頁面,測試docker02nginx頁面是否同步:

[root@sqm-docker01 ~]# echo "123456" > html/index.html

nginx02再次訪問:
[root@sqm-docker02 ~]# curl 127.0.0.1
123456

方法二:使用volume container

環境:兩臺dockerhost主機(centos7)
docker01:172.16.1.30
docker02:172.16.1.31

(1)docker01上建立目錄文件:
[root@sqm-docker01 ~]# mkdir html
[root@sqm-docker01 ~]# echo "hello docker02" > html/index.html
(2)編寫Dockerfile:
[root@sqm-docker01 ~]# vim Dockerfile

Docker持久化存儲之數據共享

//構建dockerfile:
[root@sqm-docker01 ~]# docker build -t data:latest .  #鏡像名稱自定義

Docker持久化存儲之數據共享

(3)建立volume container並基於運行nginx容器:
[root@sqm-docker01 ~]# docker create  --name vc_data02 data:latest 

[root@sqm-docker01 ~]# docker run -d --name box1 -P --volumes-from  vc_data02 nginx
  • -P:隨機在宿主機生成端口,默認從32768開始。

訪問nginx網頁:
[root@sqm-docker01 ~]# curl 127.0.0.1:32768
hello docker02

(4)將volume container鏡像打包,並拷貝給docker02:
[root@sqm-docker01 ~]# docker save  --output  data.tar data:latest 
[root@sqm-docker01 ~]# scp data.tar root@172.16.1.31:/root/

docker02:

//導入鏡像
[root@sqm-docker02 ~]# docker load --input  data.tar
//建立volume container:
[root@sqm-docker02 ~]# docker create  --name vc_data03 data:latest
//基於container運行nginx:
[root@sqm-docker02 ~]# docker run  -d --name box2 -P --volumes-from vc_data03 nginx:latest

最後訪問nginx默認界面(確保與docker01上的nginx頁面相同)

[root@sqm-docker02 ~]# curl 127.0.0.1:32768
hello docker02

以上就是跨主機實現數據共享的多種方法,固然還有其餘的方法,可能會在後續的博客中會寫到。

———————— 本文至此結束,感謝閱讀 ————————

相關文章
相關標籤/搜索