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