Docker(三) -- 文件存儲

一:簡要概述

21世紀最重要的是什麼?數據!數據!數據!數據分析,大數據時代,掌握海量有意義數據等於掌握未來。任何應用迭代、升級、優化都需要依賴數據說話,精準推送,用戶畫像等等。Docker的文件系統處於沙盒環境中,也就是隨着容器銷燬數據也就灰飛煙滅,顯然這不是喜聞樂見的結果,爲了數據實現安全、共享、持久等特點,必須將沙盒環境的文件持久化到宿主機系統中。Dokcer中提供三種數據文件交換的方式,Bind MountTmps MountVolume,但是生產中一般使用數據卷方式Volume較多

二:文件掛載 Bind Mount

類似於NFS數據共享,如果熟悉NFS的朋友應該就清楚了。Docker容器內沙盒環境理解爲一個獨立主機,將其與另外的獨立主機通過某種協議共享數據。強調一點:目錄文件的路徑定義必須是絕對路徑,避免混淆

2.1 創建掛載文件
// 格式如下
-v 宿主機目錄文件:Docker目錄文件
// 創建並運行容器redis_zsl,掛載數據目錄/redis_mount(主機)到Docker容器/data中 
[root@VM_0_8_centos home]# docker run -d --name redis_zsl --network zsl -p 6379:6379 -v /home/redis_zsl:/data redis:latest 
92011792a244a5e630b2bd251fd8f7dc6b7ea149cfce943e942a20ea23239568
[root@VM_0_8_centos home]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
92011792a244        redis:latest        "docker-entrypoint.s…"   7 seconds ago       Up 6 seconds        0.0.0.0:6379->6379/tcp              redis_zsl
4bee2a698368        mysql:latest        "docker-entrypoint.s…"   2 days ago          Up 2 days           0.0.0.0:3306->3306/tcp, 33060/tcp   mysql-3306

// 查看宿主機掛載目錄下無文件,宿主機掛載目錄下創建文件redis_zsl.txtx
[root@VM_0_8_centos home]# cd redis_zsl/
[root@VM_0_8_centos redis_zsl]# ll
total 0
[root@VM_0_8_centos redis_zsl]# touch redis_zsl.txtx
[root@VM_0_8_centos redis_zsl]# ll
total 0
-rw-r--r-- 1 root root 0 Nov 25 09:58 redis_zsl.txtx

// 進入Docker容器redis_zsl內部,查看data目錄下文件
// 發現存在文件redis_zsl.txtx,掛載成功
[root@VM_0_8_centos redis_zsl]# docker exec -it redis_zsl bash
root@92011792a244:/data# ls
redis_zsl.txtx
2.2 授權管理文件

上面例子中如果在Docker容器中對掛載文件進行寫操作,可以成功麼?

// 進入Docker容器內部
[root@VM_0_8_centos redis_zsl]# docker exec -it redis_zsl bash
root@92011792a244:/data# ls
redis_zsl.txtx

// 創建文件docker_data.txt並退出
root@92011792a244:/data# touch docker_data.txt 
root@92011792a244:/data# ls
docker_data.txt  redis_zsl.txtx
root@92011792a244:/data# exit
exit

// 查看宿主機掛載目錄中存在剛纔創建文件
[root@VM_0_8_centos redis_zsl]# ls
docker_data.txt  redis_zsl.txtx

有一些配置文件需要多個容器共享,比如XML配置文件等。那麼對應的要求容器只能對其擁有讀權限,如何設計?使用docker inspect redis_zsl 命令查看當前容器詳細信息,你會發現Mounts一欄中定義了目前文件掛載類型TypeSourceDestinationRw等,其中Rw的含義就是read、write讀寫權限,默認爲true
在這裏插入圖片描述
如果只授予讀權限,只需要進行如下操作即可:數據卷掛載後添加ro參數

docker run -d --name redis_zsl -p 6379:6379 --network zsl -v /home/redis_zsl/:/data:ro redis:latest

在這裏插入圖片描述
在這裏插入圖片描述

三:臨時掛載 Tmpfs

藉助於宿主機內存進行文件掛載的方式,即將Docker環境內的目錄文件掛載到宿主機內存中。這樣做的好處就是頻繁修改讀寫的非必要數據可以保持高性能讀寫,畢竟內存操作。但是記住了內存操作都有共同的缺點,宿主機重啓就會導致數據丟失

// 命令格式
-tmpfs Docker需要掛載的文件目錄路徑

docker run -d --name redis_tmpfs --tmpfs /data redis:latest 

在這裏插入圖片描述

四:數據卷掛載 Volume

通過Bind Mount的方式將Docker沙盒環境內的數據目錄文件掛載到宿主機中進行持久化,但是宿主機中的文件並不能被Docker進行管理,這樣必將給以後的遷移運維管理等操作帶來麻煩。所以Docker中提出數據卷Volume的概念:
操作時只需要聲明將容器中的數據目錄掛載到數據卷中,Docker將會自動在宿主機環境中創建一個目錄文件進行保存。當然,宿主機中目錄文件位置並不需要手動指定,但是可以進行命令。這樣方便多個Docker容器共用一個數據卷目錄,否則其命令將會是32位字符串

4.1 數據卷掛載

同樣使用-v 參數指定,與Bind Mount 區別在於無需指定宿主機掛載目錄。掛載完畢後的測試效果可以仿照Bind Mount自行測試即可

  • Type: volume
  • Name: 自動生成32位字符串
  • Source:自動分配創建宿主機目錄
  • Destination: Docker沙盒掛載目錄文件
docker run -d --name redis_volume redis:latest

在這裏插入圖片描述

4.2 數據卷命名

Image鏡像、Container容器使用32唯一ID操作不便,同理數據卷也是一樣。命名操作如下:也就是在指定目錄文件前添加數據卷名稱即可

-v 數據卷名稱:docker掛載目錄

docker run -d --name redis_volume -v redis_volume:/data redis:latest
4.3 數據卷管理

其實學習到這裏應該可以感受到Docker命令的風格,鏡像命令操作都可以使用docker image開頭,容器操作都可以使用docker container開頭,網絡操作都可以使用docker network開頭。自然,數據卷操作都可以使用docker volume開頭:

[root@VM_0_8_centos home]# docker volume --help

Usage:  docker volume COMMAND

Manage volumes

Commands:
  create      Create a volume
  inspect     Display detailed information on one or more volumes
  ls          List volumes
  prune       Remove all unused local volumes
  rm          Remove one or more volumes

Run 'docker volume COMMAND --help' for more information on a command.
序號 命令 作用
1 create 創建數據卷
2 inspect 查看數據卷詳情
3 ls 查看所有數據卷
4 prune 清理未使用的數據卷
5 rm 刪除數據卷,但是不能刪除運行容器正在使用的數據卷
4.4 數據卷共用

因爲數據卷名稱是唯一的,所以在使用數據卷的時候如果想複用已存在數據卷,則可以根據名字使用即可。看下面命令格式就與前面數據卷命名一致,該命令處理方式就是如果該名字數據卷名稱不存在則創建,存在則複用

// 數據卷共用
-v 已存在數據卷名稱:Docker掛載目錄

五:數據卷容器

指定一個容器專門爲數據卷容器,定義所有數據卷掛載規則。當某個容器需要使用數據卷掛載時,直接引用數據卷容器,自動匹配對應的數據卷掛載規則。這樣做的好處是隱藏具體的數據卷映射規則

// 任意鏡像創建數據卷容器,不需要運行。並指定相關數據卷掛載
docker create --name volume_container -v /data ubuntu

// 其餘容器使用--volumes-from參數引用數據卷容器規則匹配
 docker run -d --name redis_volume_conteainer --volumes-from volume_container redis:latest
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章