數據卷管理
一. 實驗目的:
1.
熟悉數據卷的基本工作原理;
2.
掌握數據卷操作的常用命令;
3.
熟悉數據卷容器的基本工作原理;
4.
掌握數據卷容器操作的常用命令;
二. 實驗環境:
Ubuntu16.04+Docker
三. 實驗內容:
練習使用數據卷和數據卷容器操作的常用命令
四.實驗練習
(一) 創建數據卷
1.新建一個以ubuntu14.04為鏡像,名叫web1的交互式容器,並且設置數據卷/html1。
docker create --name web1 -it -v /html1 ubuntu:14.04

2. 啟動容器web1: docker start -i start web1
3. 向數據卷web1中新建一個文件夾123,內容也是123.使用ctrl+P+Q 暫時退出docker容器,
但是保持容器一直運行.

4.在宿主機上,使用docker inspect 來查看一下上面的那個數據卷的目錄路徑:
docker inspect web1|grep /var/lib/docker/volumes

5.並在宿主機上查看本地數據卷文件的內容
cat /var/lib/docker/volumes/273e6d1723ddb58baf3f9a925c932423e514e2ac996d85ca5793f778d73a1ab4/_data/123

6.向文件123中,添加新的內容test
echo "test" >>/var/lib/docker/volumes/273e6d1723ddb58baf3f9a925c932423e514e2ac996d85ca5793f778d73a1ab4/_data/123

7.再次進入剛剛創建的容器web1 並且進入/html1目錄查看文件123的值是否發生變化?

8.利用docker CLI中專有命令來創建數據庫,數據卷名稱為html3並且查看數據卷的詳細信息
docker vollume create --name html3
docker inspect html3

(二)掛載數據卷
①
掛載宿主機文件到容器上。
在宿主機上創建一個目錄/html,並在目錄中創建一個新文件web.list,內容為192.168.1.1

以ubuntu:14.04為模板,創建一個容器web4,掛載宿主機文件/html4/web.list到容器/html4/web.list中,並且掛載共享的數據設置為只讀。
進入容器之后,用echo命令往/html4/web.list中寫數據,是否可以寫入,為什么?

用ctrl+p+q退出容器,但是不關閉容器,發現在宿主機中可以修改數據卷的內容。

②
掛載宿主機目錄到容器上
在宿主機上創建一個目錄/var/spp,並在目錄中新建兩個文件test1和test2,內容為test1和test2。以ubuntu:14.04為模板,創建一個容器web6,掛載宿主機文件/var/spp到容器/var/spp中。

(3)掛載多個目錄到容器上
在宿主機中新建兩個目錄/var/spp1和/var/spp2,在/var/spp1中新建文件test1,內容為123456,在/var/spp2中新建文件test2,內容為qwert。以ubuntu:14.04為模板,新建一個容器web7,並且掛載兩個目錄/var/spp1和/var/spp2,並且把/var/spp2目錄設置為只讀。在容器內,查看/var/spp1/test1內容,並且向/var/spp2/test2中添加數據asdfg,請問是否能夠添加成功,為什么?

(三)刪除數據卷
① 直接刪除數據卷
我們可以通過docker提供的數據卷管理命令,查看宿主機中所有的數據卷,並且刪除它。
Docker volume list //列出宿主機中的所有數據卷
Docker volume rm volumeID //直接刪除,但是這樣會誤刪

② 隨着容器刪除數據卷
Volume 只有在下列情況下才能被刪除:
1)docker rm -v刪除容器時添加了-v選項,只有無人使用該數據卷時候,才會被真正刪除!
2)docker run --rm運行容器時添加了--rm選項
可以使用 docker rm -v 命令在刪除容器時刪除該容器的卷。示例如下:

(四) 設置數據卷的VOLUME指令
VOLUME指令可以向鏡像創建的容器中添加數據卷,數據卷可以在容器之間共享和重用。數據卷的修改是立即生效的。volume格式:
VOLUME [“/data”,”/data2”]
VOLUME /data
舉例:
FROM ubuntu:14.04
RUN mkdir /app && echo“hello” >/app/test.txt
VOLUME /home
CMD [“cat”,”/app/test.txt”]
然后構建:docker build -t test .
執行:docker run --rm test(容器退出時就能夠自動清理容器內部的文件系統。)
輸出hello

在本地創建一個文件:
mkdir local
echo “here is a test”>~/local/test.txt
再次運行容器,使用-v參數指定/app目錄,然后查看cat結果,發現目標文件並不是容器上的test.txt文件,而是宿主機上的test.txt文件
docker run --rm -v ~/local:/app test
輸出結果是here is a test

(五)掛在一個數據卷容器
啟動一個名為container1容器,此容器包含兩個數據卷/var/volume1和/var/volume2(這兩個數據卷目錄是在容器里的,容器創建的時候會自動生成這兩目錄)查看/var/volume1是空的

用docker inspect 命令查看宿主機上與數據卷對應的目錄路徑:

由上面命令結果可以查到,兩個數據卷/var/volume1和/var/volume2下的數據在/var/lib/docker/volumes/下對於的兩個目錄的_data下面
創建App1_container容器,掛載container1容器中的數據卷

可以再創建一個容器,掛載App1_container中從container1掛載的數據卷。當然也可以直接掛載初始的container1容器數據卷

即便是刪除了初始的數據卷容器App1_container,或是刪除了其它容器,但只要是有容器在使用該數據卷,那么它里面的數據就不會丟失。
(六) 數據卷遷移
自擬題目,進行數據卷的備份操作和恢復導出操作!
備份:
我們先創建一個data容器.
docker run -i -t -v /data --name data ubuntu:14.04 /bin/bash
上面創建的data數據卷容器掛載了data目錄.
為了驗證數據卷容器的備份功能,在掛載的/data目錄下創建一個data文件,並寫入內容"data"。
然后為了利用數據卷容器備份,使用 –volumes-from 標記來創建一個加載data容器卷的容器,並從主機掛載當前目錄到容器的/backup目錄。
docker run -i -t --volumes-from data -v $(pwd):/backup ubuntu:14.04 tar cvf /backup/backup.tar /data
$(pwd)是docker支持的指定當前目錄的方法
容器啟動后,在當前目錄下生成的backup.tar文件就是data容器卷的備份文件。
這樣,數據卷容器中的數據就備份完成。

恢復
首先,創建一個帶有空數據卷的容器data1。
docker run -itd -v /data --name data1 ubuntu:14.04 /bin/bash
然后,創建另一個容器,掛載data1容器卷中的數據卷,並使用untar解壓備份文件到掛載的容器卷中。
docker run --volumes-from data1 -v $(pwd):/backup ubuntu:14.04 tar xvf /backup/backup.tar
這個時候,之前備份的數據卷容器的數據已經恢復到了容器data1中了。
為了查看和驗證恢復的數據,我們可以再啟動一個容器掛載data1容器卷來查看。
