Docker(5)---數據卷

在這裏插入圖片描述

上一篇:Docker(4)—鏡像

1. 如何保證數據持久化?

  到這裏我們應該知道,docker技術就是使用下載好的鏡像文件生成運行實例—容器,也就是說鏡像文件相當於是一個模板,比如mysql的鏡像文件,無論在docker上面運行多少次mysql,使用的始終是下載好的同一個mysql鏡像文件。那我運行期間產生的數據怎麼保存?第二次運行的時候想使用第一次運行期間產生的數據怎麼辦?

  在Docker中,數據卷提供數據持久化功能。數據卷呈現爲一種目錄或者文件的形式存在於一個或者多個容器中,由docker掛載到容器,但是不屬於聯合文件系統的一部分,所以當docker關閉或者刪除容器的時候,不會影響到數據卷中的數據。數據卷可以用於存儲數據,也可以用來在容器間進行數據共享。

2. Dockerfile保留字指令

指令 描述
FROM 基礎鏡像,當前新鏡像是基於哪個鏡像的
MAINTAINER 鏡像維護者的姓名和郵箱地址
RUN 容器構建時需要運行的命令
EXPOSE 當前容器對外暴露出的端口
WORKDIR 指定在創建容器後,終端默認登錄進來工作的目錄,一個落腳點
ENV 用來在構建鏡像過程中設置環境變量
ADD 將宿主機目錄下的文件拷貝進鏡像且ADD命令會自動處理URL和解壓tar壓縮包
COPY 類似ADD,拷貝文件和目錄到鏡像中。將從構建上下文目錄中<源路徑>的文件/目錄複製到新的一層的鏡像內的<目標路徑>位置 {COPY src dest}
VOLUME 容器數據卷,用於數據保存和持久化工作
CMD 指定一個容器啓動時要運行的命令。Dockerfile中可以有多個CMD指令,但只有最後一個生效,CMD會被docker run之後的參數替換。
ENTRYPOINT 指定一個容器啓動時要運行的命令。ENTRYPOINT的目的和CMD一樣,都是在指定容器啓動程序及參數。
ONBUILD 當構建一個被繼承的Dockerfile時運行命令,父鏡像在被子繼承後父鏡像的onbuild被觸發。

3. 數據卷特點?

  • 數據卷可以在容器間共享或者重用數據
  • 數據卷中的更改不會包含在容器的更新中
  • 數據卷中的更改可以直接生效
  • 數據卷的生命週期一直持續到沒有容器使用它爲止

3. 實現宿主機與容器之間的數據共享?

  在這裏需要明確兩個概念:
1. 宿主機:
  宿主機指的就是我們通過VMWare-----》CentOs的方式進入的Linux系統就是我們的宿主機。
2. 容器
  就是宿主機上拉取的鏡像文件生成的運行實例~

需求:
  現在我有一個centos鏡像,希望centos鏡像運行起來的時候其containerdata目錄與宿主機的mydata兩個目錄之間能夠進行數據共享;

命令:
  docker run -it -v 宿主機中的共享目錄(mydata)路徑:容器中的共享目錄(containerdata)的路徑 容器名

示例:
  比如mydata在宿主機的根目錄下(/mydata),containerdata在容器的根目錄下(/containerdata

下圖是宿主機的根目錄,現在沒有mydata文件夾
在這裏插入圖片描述
下圖是容器centos的根目錄,現在也沒有containerdata文件夾
在這裏插入圖片描述
1.首先進行目錄綁定:

docker run -it -v /mydata:/containerdata centos

2.查看宿主機和容器的綁定關係

docker inspect 容器ID

在這裏插入圖片描述
3.查看宿主機和容器中是否分別有mydatacontainerdata文件夾

宿主機:
在這裏插入圖片描述
容器:
在這裏插入圖片描述
現在在mydata目錄中創建一個文檔:

[root@bogon mydata]# touch file.txt
[root@bogon mydata]# ll
總用量 0
-rw-r--r--. 1 root root 0 3月  22 14:57 file.txt
[root@bogon mydata]# 

既然mydata目錄和centos的容器中的containerdata目錄進行了數據共享,那麼現在containerdata目錄下應該也有一個file.txt文檔。查看containerdata目錄:

[root@7453e78d6615 /]# cd containerdata/
[root@7453e78d6615 containerdata]# ls -l
total 0
-rw-r--r--. 1 root root 0 Mar 22 06:57 file.txt
[root@7453e78d6615 containerdata]# 

發現containerdata目錄下確實有file.txt文檔,現在通過容器編輯該文檔:
在這裏插入圖片描述
在該文檔中輸入一段話,按照數據共享的原理,在宿主機的mydata目錄下的file.txt文檔中應該也會有這樣一句話:
在這裏插入圖片描述
此時再次查看宿主機的containerdata下的file.txt
在這裏插入圖片描述
到這裏就實現了宿主機與容器之間的數據共享~

注意:

  通過上面的綁定操作之後,即使我們的容器關閉運行了,但是如果我們在宿主機的mydata目錄下進行的操作依然會被同步到與其綁定的centos鏡像中的containerdata目錄下:

示例:

  關閉centos的運行並退出:`

在這裏插入圖片描述
查看此時運行的鏡像文件:
在這裏插入圖片描述
確認上面的centos鏡像文件已經退出運行了~
此時在宿主機的mydata目錄下創建一個file001.txt文件,並添加內容:this content is edited in the host
在這裏插入圖片描述
此時再運行centos鏡像文件,到containerdata目錄下查看:
查看上次關閉的centos鏡像ID:docker ps -l
在這裏插入圖片描述
重新啓動上次關閉的centos鏡像文件:docker start 鏡像ID

在這裏插入圖片描述

進入處於運行狀態的centos容器:docker attach 鏡像ID
在這裏插入圖片描述
查看containerdata目錄下是否有新增的file001.txt文檔:

[root@e2fde7599c8b /]# cd containerdata/
[root@e2fde7599c8b containerdata]# ls -l
total 8
-rw-r--r--. 1 root root 38 Mar 22 07:22 file.txt
-rw-r--r--. 1 root root 35 Mar 22 07:13 file001.txt
[root@e2fde7599c8b containerdata]# cat file001.txt 

this content is edited in the host

[root@e2fde7599c8b containerdata]# 

發現我們在宿主機上新建的file001.txt文檔以及裏面的數據同步到了centos容器相應的綁定位置;

4. 宿主機與容器數據共享的時候添加權限

宿主機與容器進行數據共享的目錄綁定命令:

docker run -it -v /宿主機共享文件的絕對路徑:/容器共享文件的絕對路徑 :ro 鏡像名

注:ro就是read only(只讀權限)

通過以上命令進行共享數據目錄綁定之後,我們可以從宿主機上寫數據(增刪改),而容器上只能讀數據

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