數據卷管理實驗

一. 實驗目的:

  1. 熟悉數據卷的基本工作原理;
  2. 掌握數據卷操作的常用命令;
  3. 熟悉數據卷容器的基本工作原理;
  4. 掌握數據卷容器操作的常用命令;

二. 實驗環境:

Ubuntu16.04+Docker

三. 實驗內容:

  1. 練習使用數據卷和數據卷容器操作的常用命令;

四、 實驗練習:

(一)創建數據卷

新建一個以ubuntu14.04爲鏡像,名叫web1的交互式容器,並且設置數據卷/html1。

docker create --name web1 -it  -v /html1 ubuntu:14.04

啓動容器web1:docker start -i web1

向數據卷html1中新建一個文件123,內容也是123。使用ctrl+p+q暫時退出docker容器,但是保持容器一直運行。

在宿主機上,使用docker inspect來查看一下對應上面的那個數據卷的目錄路徑:

docker inspect web1|grep /var/lib/docker/volumes

並在宿主機上查看本地數據卷中文件的內容

cat /var/lib/docker/volumes/b92ee1515941a876f010ad75fd178a1d8cf5686aa4db24 e9bc089bcd3b62deab/_data/123

echo "test" >> /var/lib/docker/volumes/b92ee1515941a876f010ad75fd178a1d8cf5686aa4db24e9bc089bcd3b62deab/_data/123

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

利用docker CLI中專有命令來創建數據卷,數據卷名稱爲html3並且查看數據卷的詳細信息

docker volume create --name html3

docker inspect html3

(二)掛載數據卷

1.掛載宿主機文件到容器上。

在宿主機上創建一個目錄/html,並在目錄中創建一個新文件web.list,內容爲192.168.1.1

以ubuntu:14.04爲模板,創建一個容器web4,掛載宿主機文件/html4/web.list到容器/html4/web.list中,並且掛載共享的數據設置爲只讀。

docker run -it --name web4 -v /html4/web.list:/html4/web.list:ro ubuntu:14.04 /bin/bash

進入容器之後,用echo命令往/html4/web.list中寫數據,是否可以寫入,爲什麼?

不能,因爲文件只能讀取

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

2.掛載宿主機目錄到容器上

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

docker run -it --name web5 -v /var/spp:/var/spp ubuntu:14.04 /bin/bash

3.掛載多個目錄到容器上

在宿主機中新建兩個目錄/var/spp1和/var/spp2,在/var/spp1中新建文件test1,內容爲123456,在/var/spp2中新建文件test2,內容爲abcdef。以ubuntu:14.04爲模板,新建一個容器web6,並且掛載兩個目錄/var/spp1和/var/spp2,並且把/var/spp2目錄設置爲只讀。在容器內,查看/var/spp1/test1內容,並且向/var/spp2/test2中添加數據date2,請問是否能夠添加成功,爲什麼?

不能。文件只有只讀權限

(三)刪除數據卷

1.直接刪除數據卷

我們可以通過docker提供的數據卷管理命令,查看宿主機中所有的數據卷,並且刪除它。

docker volume list //列出宿主機中的所有數據卷

docker volume rm volumeID  //直接刪除,但是這樣會誤刪

2.隨着容器刪除數據卷

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 .

FROM ubuntu:14.04

RUN mkdir /app && echo "hello" >/app/test.txt

VOLUME  /home

CMD  ["cat","/app/test.txt"]

執行: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 run -it -v /var/volume1 -v /var/volume2 --name container1 ubuntu:14.04 /bin/bash

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

docker inspect container1|grep /var/lib/docker/volumes

由上面命令結果可以查到,兩個數據卷/var/volume1和/var/volume2下的數據在/var/lib/docker/volumes/下對於的兩個目錄的_data下面

創建App1_container容器,掛載container1容器中的數據卷

docker run -it --rm --volumes-from container1 --name app_container ubuntu:14.04 /bin/bash

即便是刪除了初始的數據卷容器App1_container,或是刪除了其它容器,但只要是有容器在使用該數據卷,那麼它裏面的數據就不會丟失。

(六)數據卷遷移

自擬題目,進行數據卷的備份操作和恢復導出操作!

啓動一個命名爲vol_simple的容器並創建數據卷(volume)

 docker run -itd --name vol_simple -v /data ubuntu /bin/bash

進入掛載目錄寫入若干數據,此時在容器內的/data目錄下會共享這些數據

docker inspect vol_simple | grep Source

cd

/var/lib/docker/volumes/767a187bcd2bb150322eec974421089e6dace6b303b28233fb0064f419e6c3aa/_data

docker exec -it  vol_simple /bin/bash

備份容器vol_simple的數據卷數據

docker run --rm --volumes-from vol_simple -v $(pwd):/backup ubuntu tar cf /backup/data.tar /data

恢復volume數據到新容器中

docker run -itd --name vol-bck -v /data ubuntu /bin/bash

docker ps

docker run --rm --volumes-from vol-bck -v $(pwd):/backup ubuntu tar xf /backup/data.tar -C /

docker inspect vol-bc | grep Source

docker exec -it vol-bck /bin/bash

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章