1. 程式人生 > >Docker之數據卷Volume(七)

Docker之數據卷Volume(七)

解決 -a 1.7 style 除了 默認 技術分享 不同 docke

一、簡介 Docker數據卷(volume)機制。volume是存在於一個或多個容器中的特定文件或文件夾,這個目錄以獨立於聯合文件系統的形式在宿主機中存在,並為數據的共享與持久化提供便利。 1)volume在容器創建時就會初始化,在容器運行時就可以使用其中的文件 2)volume能在不同的容器之間共享和重用 3)對volume中數據的操作會馬上生效 4)對volume中數據的操作不會影響到鏡像本身 5)volume的生存周期獨立於容器的生存周期,即使刪除容器,volume仍然會存在,沒有任何容器使用的volume也不會被刪除 二、使用 1、創建volume
1)創建colume,命名為volume_first
docker volume create --name volume_first

技術分享圖片

2)在容器啟動docker run或者創建新容器docker create時,也可以使用-v標簽為容器添加volume

如:docker在啟動時隨機命名創建一個volume,並掛載在容器的/data下
docker run -d -v /docker/data docker.io/centos /bin/bash

技術分享圖片

Docker在創建volume的時候會在宿主機/var/lib/docker/volume/中創建一個以volume ID為名的目錄,並將volume中的內容存儲在名為_data的目錄下 技術分享圖片
3)創建一個指定名字的volume,test_volume掛載到容器的/docker/data目錄下
docker run -d -v test_volume:/docker/data docker.io/centos /bin/bash

技術分享圖片

技術分享圖片 4)查看本地的volume,可以看到我們剛剛創建的,第一個是以容器命名,第二個是以指定命名的方式命名 技術分享圖片 2、掛載volume 在使用docker run或docker create創建新容器時,可以使用-v標簽為容器添加volume。用戶可以將自行創建或由Docker創建的volume掛載到容器中,也可以將宿主機上的目錄或者文件作為volume掛載到容器中 總結一下幾種方式:上面已經用到了 1)第一種方式
docker volume create --name volume_first
docker run -d -v volume_first:/data docker.io/centos /bin/bash
2)第二種方式
docker run -d -v /data docker.io/centos /bin/bash
3)第三種方式,將宿主機上的目錄掛載到容器中
docker run -d -v /docker/data:/data docker.io/centos
將宿主機的/docker/data文件夾作為一個volume掛載到容器中的/data。目錄必須使用絕對路徑,如果宿主機中不存在/docker/data目錄,將創建一個新的目錄。在/docker/data目錄中的所有文件或文件夾可以在容器的/data目錄下被訪問。如果鏡像中原本存在/data文件夾,該目錄下的所有內容將被隱藏,以保持與宿主機中的目錄一致。 4)在volume掛載時,還可以指定volume的權限,如只讀ro,也可以在volume掛載時使用z和Z來指定該volume是否可以共享。Docekr中默認的是z,及共享volume;使用Z表示私有該數據卷;使用多個-v標簽為容器添加多個volume
docker run -d -v /docker/data:/data:ro -v /docker/data2:/data2:z docker.io/centos
3、使用Dockerfile添加volume 1)vim Dockerfile
FROM docker.io/centos
VOLUME /test_data
2)制作成鏡像
docker build -t volume_test .

技術分享圖片

3)啟動鏡像得到容器
docker run -d 7a5efba9248c

技術分享圖片

4)查看該容器的volume信息
docker inspect 972d67800f6130406290 |grep -A 11 Mounts

技術分享圖片

可以看到是掛載成功的 5)使用VOLUME指令添加多個volume
VOLUME ["/data1","/data2"]
6)與使用docker run -v不同的是,VOLUME指令不能掛載主機中指定的文件夾,這是為了保證Dockerfile的可移植性,因為不能保證所有的宿主機都有對應的文件夾 7、Dockerfile的使用Volume的註意事項 如:vim Dockerfile
FROM docker.io/centos
RUN useradd lile
VOLUME /data
RUN mkdir /data && touch /data/file
RUN chown -R lile:lile /data
構建鏡像:
docker build -t volume_test .
啟動容器:
docker run -d 833a592f9d3f
查看該容器的卷信息:
docker inspect 95b3bf6ef72b15304f |grep -A 11 Mounts
技術分享圖片技術分享圖片 查看掛載出來的文件是否授權並創建了一個文件,發現並沒有 技術分享圖片 這是因為在Dockerfile中使用VOLUME指令之後的代碼,如果嘗試對這個volume進行更改,這些修改都不會生效。這是因為Dockerfile中除了From指令的每一行都是基於上一行生成的臨時鏡像運行一個容器,執行一條指令並執行類似docker commit的命令得到一個新的鏡像,這條類似docker commit 命令不會對掛載的volumn進行保存 解決辦法: vim Dockerfile文件改為如下
FROM docker.io/centos
RUN useradd lile
VOLUME /data
CMD touch /data/file && chown -R lile:lile /data
CMD指令和ENTRYPOINT指令是在容器啟動時執行。 8、共享volume 在使用docker run或docker create創建新容器時,可以使用--volumes-from標簽使得容器與已有的容器共享volume 實驗: 1)基於docker.io/centos鏡像啟動一個名叫container1的容器,並在這個容器上創建名為test1的數據卷掛載在容器的/data目錄
docker run -d --name container1 -v test1:/data docker.io/centos
技術分享圖片 2)創建容器2,此容器與容器1共享數據卷test1,可以從該容器考到掛載信息確實是容器一的
docker run -d --name container2 --volumes-from container1 docker.io/centos

技術分享圖片

3)與多個容器共享volumn
docker run -d --name container1 -v test2:/data docker.io/centos
docker run -d --name container2 -v test2:/log docker.io/centos
docker run -d --name container3 --volumes-from container1 --volumes-from container2 docker.io/centos
得到的結果如下: 技術分享圖片 9、刪除指定的volume 1)方法一 刪除volume
docker volume rm first_volume
2)方法二 刪除容器
docker rm -v container_name
10、備份、恢復和遷移volumn 備份:臨時起一個容器與容器一共享數據卷,並且把當前路徑掛載到容器的/backup ,這樣打包後的文件便在當前路徑了
docker run -d --volumns-from container1 -v $(pwd):/backup docker.io/centos tar cvf /backup/data.tar /data
恢復:
docker run -d --volumes-from a5e77a6d6e0f854eb -v $(pwd):/backup docker.io/centos tar xvf /backup/data.tar -C /

參考:《Docker容器與容器雲》

Docker之數據卷Volume(七)