目錄
1. Docker Volumes
特點
示例
2. Bind Mounts
特點
示例
@ 對比總結
3. tmpfs Mounts
4. Docker Storage Plugins
5. Kubernetes Persistent Volumes
6. Network Attached Storage (NAS) 和 Storage Area Network (SAN)
1. Docker Volumes
使用存儲卷進行存儲持久化
特點
- 獨立于容器生命周期:Volumes 存儲的數據獨立于容器生命周期,即使容器被刪除,數據依然保留。
- 管理便捷:Docker 提供了一些命令用于管理 Volumes,比如創建、刪除、列出等。
- 存儲位置:Volumes 存儲在 Docker 的管理目錄下(通常是
/var/lib/docker/volumes/
),用戶無需關心具體路徑。 - 支持跨平臺:Volumes 在不同的操作系統和 Docker 環境中具有一致的行為。
- 備份和恢復:Volumes 容易備份和恢復,因為它們獨立于容器且由 Docker 管理。
示例
#創建 Volume:
[root@rockylinux docker]# docker volume create addvimubuntu
addvimubuntu
-----------------------------------------------------
#查看卷詳細信息
[root@rockylinux docker]# docker volume inspect addvimubuntu
[{"CreatedAt": "2024-07-01T19:32:05+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/addvimubuntu/_data","Name": "addvimubuntu","Options": null,"Scope": "local"}
]
-----------------------------------------------------
#運行容器并掛載 Volume:
[root@rockylinux docker]# docker run -d -it --volume addvimubuntu:/opt --name vim_demo registry.cn-hangzhou.aliyuncs.com/fujiangdocker2022/addvimubuntu:v1 /bin/bash
root@0f3f450684ed:/opt# touch 1.txt
root@0f3f450684ed:/opt# echo 1.txt > 1.txt
root@0f3f450684ed:/opt# echo hello > 2.txt[root@rockylinux _data]# pwd
/var/lib/docker/volumes/addvimubuntu/_data
[root@rockylinux _data]# ls
1.txt 2.txt
-----------------------------------------------------
#列出 Volumes:
docker volume ls/list
-----------------------------------------------------
#刪除 Volume:
[root@rockylinux _data]# docker volume rm addvimubuntu
# 刪除 Volume(需要先停止和刪除相關容器)
docker stop <container_id>
2. Bind Mounts
使用宿主機本地目錄進行存儲持久化
特點
- 直接使用宿主機目錄:Bind Mounts 直接將宿主機的一個目錄掛載到容器內的一個目錄。
- 高靈活性:可以選擇任意的宿主機目錄進行掛載。
- 依賴于宿主機文件系統結構:由于直接使用宿主機的路徑,Bind Mounts 的行為依賴于宿主機的文件系統結構和權限。
- 性能更高:因為直接訪問宿主機文件系統,性能可能會更高,特別是在高 I/O 場景下。
- 需要更高的權限管理:由于直接訪問宿主機目錄,容易出現權限問題和安全風險。
- 共享和重用,數據卷可以在容器之間共享或重用數據
容器數據卷就是目錄或文件,存在于一個或多個容器中,由docker掛載到容器,但不屬于聯合文件系統,因此能夠繞過UnionFS,提供一些用于持續存儲或共享數據。
特性:卷設計的目的就是數據的持久化,完全獨立于容器的生存周期,因此Docker不會在容器刪除時刪除其掛載的數據卷。
示例
docker run -it --privileged=true -v /宿主機絕對路徑目錄:/容器內目錄 鏡像名
Docker掛載主機目錄,可能會出現報錯:cannot open directory .: Perission denied
。
解決方案:在命令中加入參數 --privileged=true
。
CentOS7安全模塊比之前系統版本加強,不安全的會先禁止,目錄掛載的情況被默認為不安全的行為,在SELinux里面掛載目錄被禁止掉了。如果要開啟,一般使用 --privileged=true
,擴大容器的權限解決掛載沒有權限的問題。也即使用該參數,容器內的root才擁有真正的root權限,否則容器內的root只是外部的一個普通用戶權限(不能讀寫)。
運行一個帶有容器卷存儲功能的容器實例:
docker run -it --privileged=true -v 宿主機絕對路徑目錄:容器內目錄[rw | ro] 鏡像名
可以使用docker inspect 容器id
查看容器綁定的數據卷。
權限:
-
rw
:讀寫 (默認)ro
:只讀。如果宿主機寫入內容,可以同步給容器內,容器內可以讀取。
容器卷的繼承:
# 啟動一個容器
docker run -it --privileged=true /tmp/test:/tmp/docker --name u1 ubuntu /bin/bash# 使用 --volumes-from 繼承 u1的容器卷映射配置
docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu
--volumes-from 父類
這個選項允許新的容器從另一個已經存在的容器(稱為“父類”容器)中掛載卷。換句話說,新容器將繼承“父類”容器的卷,并且可以訪問這些卷中的數據
u2 容器將能夠訪問和使用 u1 容器中的 卷
繼承的是掛載的規則,即使u1掛了也不會影響u2,容器之間獨立。(u1恢復也不會影響)用于容器之間的共享
[root@rockylinux dockerdata]# docker run -it --privileged=true --volumes-from test3 --name test4 ubuntu
root@46c9ab85245e:/# cd /opt
root@46c9ab85245e:/opt# ls
fujiang.txt love.txt mount.test test.txt test3.txt
@ 對比總結
特性 | Docker Volumes | Bind Mounts |
存儲位置 | Docker 管理的存儲位置(如 | 宿主機上的指定路徑 |
獨立于容器生命周期 | 是 | 否 |
管理便捷性 | 高(Docker 提供了專門的管理命令) | 低(需要手動管理宿主機目錄) |
跨平臺一致性 | 是 | 否(依賴于宿主機文件系統) |
性能 | 較高 | 高(直接訪問宿主機文件系統) |
權限管理 | 簡單 | 復雜(需管理宿主機文件系統的權限) |
3. tmpfs Mounts
tmpfs Mounts 將數據存儲在宿主機的內存中,而不是物理磁盤上。這種方法適用于需要快速訪問且數據不需要持久化的場景,例如緩存。
docker run -d --tmpfs /path/in/container my_image
4. Docker Storage Plugins
Docker 允許使用第三方存儲插件,以便與外部存儲系統(如 NFS、Ceph、GlusterFS 等)集成。這些插件提供了更高級的存儲功能,如分布式存儲、數據冗余和高可用性。
安裝存儲插件后,可以像使用 Volumes 一樣使用這些插件提供的存儲。
docker volume create --driver <plugin_name> my_volume
docker run -d -v my_volume:/path/in/container my_image
5. Kubernetes Persistent Volumes
在 Kubernetes 環境中,持久化存儲通常使用 Persistent Volumes(PV)和 Persistent Volume Claims(PVC)來管理。PV 是集群中的存儲資源,而 PVC 是用戶對 PV 的請求。
定義 Persistent Volume(PV):
apiVersion: v1
kind: PersistentVolume
metadata:name: my-pv
spec:capacity:storage: 1GiaccessModes:- ReadWriteOncehostPath:path: "/mnt/data"
定義 Persistent Volume Claim(PVC):
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: my-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 1Gi
使用 PVC:
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: my-imagevolumeMounts:- mountPath: "/path/in/container"name: my-volumevolumes:- name: my-volumepersistentVolumeClaim:claimName: my-pvc
6. Network Attached Storage (NAS) 和 Storage Area Network (SAN)
在企業環境中,使用 NAS 或 SAN 設備提供集中化存儲是常見的做法。這些設備可以通過 NFS、iSCSI 等協議與容器進行連接,實現數據的集中存儲和管理。
在宿主機上掛載 NAS 或 SAN 存儲,然后將其掛載到容器中:
mount -t nfs <nas_server>:/path/on/nas /mnt/nas
docker run -d -v /mnt/nas:/path/in/container my_image