第一章、前言

默认情况下容器的数据都是非持久化的, 在容器消亡以后数据也跟着丢失, 所以 Docker 提供了 Volume 机制以便将数据持久化存储。 类似的, Kubernetes 提供了更强大的 Volume 机制和丰富的插件, 解决了容器数据持久化和容器间共享数据的问题。
与 Docker 不同, Kubernetes Volume 的生命周期与 Pod 绑定容器挂掉后 Kubelet 再次重启容器时, Volume 的数据依然还在而 Pod 删除时, Volume 才会清理。
数据是否丢失取决于具体的 Volume 类型, 比如 emptyDir 的数据会丢失, 而 PV 的数据则不会丢
PersistentVolume(pv)和PersistentVolumeClaim(pvc)是k8s提供的两种API资源,用于抽象存储细节。管理员关注于如何通过pv提供存储功能而无需关注用户如何使用,同样的用户只需要挂载pvc到容器中而不需要关注存储卷采用何种技术实现。
pvc和pv的关系与pod和node关系类似,前者消耗后者的资源。pvc可以向pv申请指定大小的存储资源并设置访问模式。

第二章、pv pvc相关知识

生命周期

pv和pvc遵循以下生命周期:
1.供应准备。管理员在集群中创建多个pv供用户使用。
 2.绑定。用户创建pvc并指定需要的资源和访问模式。在找到可用pv之前,pvc会保持未绑定状态。
 3.使用。用户可在pod中像volume一样使用pvc。
 4.释放。用户删除pvc来回收存储资源,pv将变成“released”状态。由于还保留着之前的数据,这些数据需要根据不同的策略来处理,否则这些存储资源无法被其他pvc使用。
 5.回收。pv可以设置三种回收策略:保留(Retain),回收(Recycle)和删除(Delete)。
   保留策略允许人工处理保留的数据。
   删除策略将删除pv和外部关联的存储资源,需要插件支持。
   回收策略将执行清除操作,之后可以被新的pvc使用,需要插件支持。

pv属性

pv拥有以下属性:
  容量。目前仅支持存储大小,未来可能支持IOPS和吞吐量等。
  访问模式。ReadWriteOnce:单个节点读写。ReadOnlyMany:多节点只读。ReadWriteMany:多节点读写。挂载时只能使用一种模式。
  回收策略。目前NFS和HostPath支持回收。 AWS、EBS、GCE、PD和Cinder支持删除。
  阶段。分为Available(未绑定pvc)、Bound(已绑定)、Released(pvc已删除但资源未回收)、Failed(自动回收失败)

pvc属性

访问模式。与pv的语义相同。在请求资源时使用特定模式。
资源。申请的存储资源数量

pv类型

emptyDir
hostPath
gcePersistentDisk
awsElasticBlockStore
nfs
iscsi
flocker
glusterfs
rbd
cephfs
gitRepo
secret
persistentVolumeClaim
downwardAPI
azureFileVolume
................
........(以下省略)

目前常用Volume 类型

emptyDir

如果 Pod 设置了 emptyDir 类型 Volume, Pod 被分配到 Node 上时候, 会创建emptyDir, 只要 Pod 运行在 Node 上, emptyDir 都会存在( 容器挂掉不会导致emptyDir 丢失数据) , 但是如果 Pod 从 Node 上被删除( Pod 被删除, 或者 Pod 发生迁移) , emptyDir 也会被删除, 并且永久丢失。

hostPath

hostPath 允许挂载 Node 上的文件系统到 Pod 里面去。 如果 Pod 需要使用 Node 上的文件, 可以使用 hostPath

NFS

NFS 是 Network File System 的缩写, 即网络文件系统。 Kubernetes 中通过简单地配置就可以挂载 NFS 到 Pod 中, 而 NFS 中的数据是可以永久保存的, 同时 NFS 支持同时写操作。

gcePersistentDisk

gcePersistentDisk 可以挂载 GCE 上的永久磁盘到容器, 需要 Kubernetes 运行在 GCE的 VM 中

awsElasticBlockStore

awsElasticBlockStore 可以挂载 AWS 上的 EBS 盘到容器, 需要 Kubernetes 运行在AWS 的 EC2 上。

gitRepo

gitRepo volume 将 git 代码下拉到指定的容器路径中

Projected Volume

Projected volume 将多个 Volume 源映射到同一个目录中, 支持 secret、 downwardAPI和 configMap 

第三章、简单示例

emptyDir (节点级存储,生命周期与pod相同)

[root@k8s-master01 volume]# cat pod-vol-demo.yaml  #pod中有两个container挂载同一个emptyDir,nginx提供web服务,busybox则循环向挂载目录下的index.html文件写入数据
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: default
labels:
app: myapp
tier: frontend
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: myapp
containerPort:
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
- name: busybox
image: busybox:latest
volumeMounts:     #见pod的volume挂载到container中
- name: html     #名称需要和 volumes中的name一致
mountPath: /data #挂载volume在container中的路径
command:
- "/bin/sh"
- "-c"
- "while true; do echo $(date) >> /data/index.html; sleep 2; done"
volumes:   #创建pod可以使用的volume,可以有多个
- name: html
emptyDir: {} #volume类型,默认不限制使用空间

查看pod是否运行,并访问

[root@k8s-master01 volume]# kubectl get pod -o wide  #查看pod地址
NAME READY STATUS RESTARTS AGE IP NODE
myapp-deploy-5cfd895984-2gmmd / Running 2d 10.244.1.37 k8s-node01
myapp-deploy-5cfd895984-58csg / Running 2d 10.244.2.71 k8s-node02
myapp-deploy-5cfd895984-9s6zn / Running 2d 10.244.1.36 k8s-node01
myapp-deploy-5cfd895984-hwtlt / Running 2d 10.244.1.35 k8s-node01
myapp-deploy-5cfd895984-xclv4 / Running 2d 10.244.2.70 k8s-node02
pod-demo / Running 22s 10.244.1.44 k8s-node01
pod-pvc / Running 11h 10.244.2.78 k8s-node02
tomcat-deploy-5bf584448b-7dbn2 / Running 2d 10.244.2.73 k8s-node02
tomcat-deploy-5bf584448b-r7ng5 / Running 2d 10.244.2.74 k8s-node02
tomcat-deploy-5bf584448b-xxj8n / Running 2d 10.244.1.39 k8s-node01
[root@k8s-master01 volume]# while true; do curl 10.244.1.44; sleep ; done #直接访问
Fri Nov :: UTC
Fri Nov :: UTC
Fri Nov :: UTC
Fri Nov :: UTC
Fri Nov :: UTC
Fri Nov :: UTC
......

hostPath (节点级存储,生命周期和node相同)

apiVersion: v1
kind: Pod
metadata:
name: pod-hostpath
namespace: default
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
hostPath:
path: "/data/pod/volumel" #依据type的值来确定挂载路径是否需要创建
type: DirectoryOrCreate #挂载目录不存在则创建, 具体type的值可以查看官方文档: https://kubernetes.io/docs/concepts/storage/volumes#hostpath
[root@k8s-master01 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
myapp-deploy-5cfd895984-2gmmd / Running 2d 10.244.1.37 k8s-node01
myapp-deploy-5cfd895984-58csg / Running 2d 10.244.2.71 k8s-node02
myapp-deploy-5cfd895984-9s6zn / Running 2d 10.244.1.36 k8s-node01
myapp-deploy-5cfd895984-hwtlt / Running 2d 10.244.1.35 k8s-node01
myapp-deploy-5cfd895984-xclv4 / Running 2d 10.244.2.70 k8s-node02
pod-hostpath / Running 34s 10.244.2.80 k8s-node02 #所在node节点
tomcat-deploy-5bf584448b-7dbn2 / Running 2d 10.244.2.73 k8s-node02
tomcat-deploy-5bf584448b-r7ng5 / Running 2d 10.244.2.74 k8s-node02
tomcat-deploy-5bf584448b-xxj8n / Running 2d 10.244.1.39 k8s-node01
[root@k8s-master01 ~]# ssh k8s-node02 "ls -l /data/pod/volumel" #查看该节点上是否存在该目录
总用量 0

删除pod手动创建挂载目录并添加HTML文件测试

[root@k8s-master01 volume]# kubectl delete pod pod-hostpath
pod "pod-hostpath" deleted
#所有node节点上进行如下操作,注意index中的内容是当前节点名称以示区别
[root@k8s-master01 ~]# mkdir /data/pod/volume1 #创建挂载的目录
[root@k8s-master01 ~]# cd /data/pod/volume1
[root@k8s-master01 volume1]# echo "node1" > /data/pod/volume1/index.html #添加一个index.html测试文件
[root@k8s-master01 volume]# kubectl apply -f pod-hostpath-vol.yaml
pod "pod-hostpath" created
[root@k8s-master01 volume]# kubectl get pod pod-hostpath -o wide
NAME READY STATUS RESTARTS AGE IP NODE
pod-hostpath / Running 12s 10.244.2.191 k8s-node02
[root@k8s-master01 volume]# curl 10.244.2.191
node2

NFS(永久存储,生命周期与NFS server相同)

[root@k8s-master01 volume]# cat pod-nfs-vol.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-nfs
namespace: default
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
nfs:
path: "/data/volumes/v1" #该目录在NFS server上必须存在并可以被集群中node节点可以挂载,node节点需要安装nfs-utils,可以执行NFS 挂载操作
server: 172.16.150.155 #该server需要安装NFS 服务,并共享path中的目录或文件
[root@k8s-node02 ~]# mount -t nfs 172.16.150.155:/data/volumes/v1 /mnt 在任意一节点上进行挂载测试,确定可以挂载是否可以成功,需要安装nfsutils工具包
[root@k8s-node02 ~]# df -h |grep mnt #查看挂载状态
172.16.150.155:/data/volumes/v1 77G .5G 74G % /mnt
[root@k8s-node02 ~]# umount /mnt #确认没有问题后卸载
[root@k8s-master01 volume]# kubectl apply -f pod-nfs-vol.yaml #创建pod
pod "pod-nfs" created
[root@k8s-master01 volume]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
pod-nfs / Running 17s 10.244.1.154 k8s-node01
#在NFS server上添加一个测试HTML文件
[root@k8s-node- ~]# cd /data/volumes/v1/ #挂载目录
[root@k8s-node- v1]# echo "<h1>NFS Server volume v1</h1>" > index.html
#访问一下pod
[root@k8s-master01 volume]# curl 10.244.1.154
<h1>NFS Server volume v1</h1>
[root@k8s-master01 volume]# kubectl delete pod pod-nfs #删除刚刚创建的pod
pod "pod-nfs" deleted
[root@k8s-master01 volume]# kubectl apply -f pod-nfs-vol.yaml #再重新创建
pod "pod-nfs" created
[root@k8s-master01 volume]# kubectl get pod -o wide #查看新创建后pod所在的node节点级IP地址
NAME READY STATUS RESTARTS AGE IP NODE
counter / Running 1d 10.244.1.68 k8s-node01
pod-hostpath / Running 29m 10.244.2.191 k8s-node02
pod-nfs / Running 17s 10.244.2.192 k8s-node02
sa-demo / Running 8d 10.244.2.98 k8s-node02
[root@k8s-master01 volume]# curl 10.244.2.192 #再次访问一下,文件依然存在,文件不会随着pod的终结而销毁
<h1>NFS Server volume v1</h1>

第四章、创建PV和PVC(以NFS为例)

NFS server上创建多个挂载目录,并共享

[root@k8s-node- v1]# cat /etc/exports
/data/volumes/v1 172.16.150.0/(rw,no_root_squash)
/data/volumes/v2 172.16.150.0/(rw,no_root_squash)
/data/volumes/v3 172.16.150.0/(rw,no_root_squash)
/data/volumes/v4 172.16.150.0/(rw,no_root_squash)
/data/volumes/v5 172.16.150.0/(rw,no_root_squash)
[root@k8s-node- v1]# ll /data/volumes/
总用量
drwxr-xr-x root root -- : v1
drwxr-xr-x root root -- : v2
drwxr-xr-x root root -- : v3
drwxr-xr-x root root -- : v4
drwxr-xr-x root root -- : v5
[root@k8s-node- v1]# exportfs
/data/volumes/v1 172.16.150.0/
/data/volumes/v2 172.16.150.0/
/data/volumes/v3 172.16.150.0/
/data/volumes/v4 172.16.150.0/
/data/volumes/v5 172.16.150.0/
[root@k8s-node- v1]# showmount -e
Export list for k8s-node-:
/data/volumes/v5 172.16.150.0/
/data/volumes/v4 172.16.150.0/
/data/volumes/v3 172.16.150.0/
/data/volumes/v2 172.16.150.0/
/data/volumes/v1 172.16.150.0/

将NFS server共享的目录创建为PV

apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-vol- #不允许定义名称空间,应为pv是属于集群级别的
labels:
name: nfs-vol-01 #建议对PV添加labels,后期PVC可以通过labels指定PV
spec:
capacity: #pv的大小
storage: 5Gi
accessModes: #访问的模型,具体访问模型官方文档链接: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes
- ReadWriteOnce #支持的访问模型与具体的共享存储设备类型有关,具体见上方链接,可以有多个
- ReadWriteMany
persistentVolumeReclaimPolicy: Recycle #pv的回收策略
nfs:
path: /data/volumes/v1
server: 172.16.150.155
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-vol-
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
path: /data/volumes/v2
server: 172.16.150.155
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-vol-
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
- ReadWriteMany
persistentVolumeReclaimPolicy: Recycle
nfs:
path: /data/volumes/v3
server: 172.16.150.155
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-vol-
spec:
capacity:
storage: 15Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
path: /data/volumes/v4
server: 172.16.150.155
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-vol-
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
- ReadWriteMany
persistentVolumeReclaimPolicy: Recycle
nfs:
path: /data/volumes/v5
server: 172.16.150.155
[root@k8s-master01 volume]# kubectl apply -f nfs-vol.yaml
persistentvolume "nfs-vol-01" created
persistentvolume "nfs-vol-02" created
persistentvolume "nfs-vol-03" created
persistentvolume "nfs-vol-04" created
persistentvolume "nfs-vol-05" created
[root@k8s-master01 volume]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
nfs-vol- 5Gi RWO,RWX Recycle Available 7s
nfs-vol- 5Gi RWO Recycle Available 7s
nfs-vol- 10Gi RWO,RWX Recycle Available 7s
nfs-vol- 15Gi RWO Recycle Available 7s
nfs-vol- 20Gi RWO,RWX Recycle Available 7s

创建一个PVC

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
namespace: default
spec:
accessModes: ["ReadWriteOnce"] #pvc的访问模式一定是pv访问模式的子集
selector:
matchLabels:
name: nfs-vol-01 #选择指定的PV
resources:
requests:
storage: 5Gi ---
apiVersion: v1
kind: Pod
metadata:
name: pod-pvc
namespace: default
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
persistentVolumeClaim:
claimName: my-pvc
[root@k8s-master01 volume]# kubectl apply -f pod-pvc-vol.yaml
persistentvolumeclaim "my-pvc" created
pod "pod-pvc" created
[root@k8s-master01 volume]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
my-pvc Bound nfs-vol- 5Gi RWO 1m
[root@k8s-master01 volume]# kubectl get pv #查看pv状态的变化,nfs-vol-02被 default名称空间下my-pvc申请并绑定
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON A
nfs-vol- 5Gi RWO,RWX Recycle Bound default/my-pvc
nfs-vol- 5Gi RWO Recycle Available
nfs-vol- 10Gi RWO,RWX Recycle Available
nfs-vol- 15Gi RWO Recycle Available
nfs-vol- 20Gi RWO,RWX Recycle Available

查看下pod的创建信息

[root@k8s-master01 volume]# kubectl describe pod pod-pvc
......
Volumes:
html:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: my-pvc
ReadOnly: false
default-token-tcwjz:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-tcwjz
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 8m (x2 over 8m) default-scheduler pod has unbound PersistentVolumeClaims (repeated times)
Normal Scheduled 8m default-scheduler Successfully assigned pod-pvc to k8s-node01
Normal SuccessfulMountVolume 8m kubelet, k8s-node01 MountVolume.SetUp succeeded for volume "default-token-tcwjz"
Normal SuccessfulMountVolume 8m kubelet, k8s-node01 MountVolume.SetUp succeeded for volume "nfs-vol-02"
Normal Pulled 8m kubelet, k8s-node01 Container image "ikubernetes/myapp:v1" already present on machine
Normal Created 7m kubelet, k8s-node01 Created container
Normal Started 7m kubelet, k8s-node01 Started container

#处于绑定状态下的pv无法直接被删除,如果需要删除被绑定的pv,需要先删除申请绑定的PVC

第五章、PV released状态下重新分配到PVC

当 PV 已经处在 released 状态下,它是没有办法直接回到 available 状态,也就是说接下来无法被一个新的 PVC 去做绑定。

1.删除PVC及pod,查看pv的状态

[root@k8s-master01 volume]#kubectl delete -f pod-pvc-vol.yaml
persistentvolumeclaim "my-pvc" deleted
pod "pod-pvc" deleted
[root@k8s-master01 volume]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
nfs-vol- 5Gi RWO,RWX Retain Released default/my-pvc 18m #状态变成了Released
nfs-vol- 5Gi RWO Retain Available 18m
nfs-vol- 10Gi RWO,RWX Retain Available 18m
nfs-vol- 15Gi RWO Retain Available 18m
nfs-vol- 20Gi RWO,RWX Retain Available 18m

2.再次创建PVC使用nfs-vol-01,并观察pv及pod状态

[root@k8s-master01 volume]#kubectl apply -f pod-pvc-vol.yaml
persistentvolumeclaim/my-pvc created
pod/pod-pvc created
[root@k8s-master01 volume]#kubectl get pods |grep pod-pvc
pod-pvc / Pending 8m23s
[root@k8s-master01 volume]#kubectl describe pod pod-pvc #可以看到,pod处于pending状态,原因是没有绑定的PVC可以使用
......
Warning FailedScheduling 19s (x7 over 9m6s) default-scheduler pod has unbound immediate PersistentVolumeClaims (repeated times)

3.修改PV的配置,删除spec下claimRef字段及包含内容

[root@k8s-master-- manifests]# kubectl edit pv nfs-vol-
spec:
claimRef:
apiVersion: v1
kind: PersistentVolumeClaim
name: my-pvc
namespace: default
resourceVersion: ""
uid: 628b5026-35dc-11ea-87ad-525400512eca
....

再次查看

[root@k8s-master-- manifests]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
nfs-vol- 5Gi RWO,RWX Retain Available 39m
nfs-vol- 5Gi RWO Retain Available 39m
nfs-vol- 10Gi RWO,RWX Retain Available 39m
nfs-vol- 15Gi RWO Retain Available 39m
nfs-vol- 20Gi RWO,RWX Retain Available 39m

4.创建PVC及pod,查看状态

[root@k8s-master01 volume]#kubectl apply -f pod-pvc-vol.yaml
persistentvolumeclaim/my-pvc created
pod/pod-pvc created
[root@k8s-master01 volume]#kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
nfs-vol- 5Gi RWO,RWX Retain Bound default/my-pvc 39m
nfs-vol- 5Gi RWO Retain Available 39m
nfs-vol- 10Gi RWO,RWX Retain Available 39m
nfs-vol- 15Gi RWO Retain Available 39m
nfs-vol- 20Gi RWO,RWX Retain Available 39m
[root@k8s-master01 volume]#kubectl get pods|grep pod-pvc
pod-pvc / Running 22s

k8s学习笔记之八:存储卷的更多相关文章

  1. 【K8s学习笔记】K8s是如何部署应用的?

    本文内容 本文致力于介绍K8s一些基础概念与串联部署应用的主体流程,使用Minikube实操 基础架构概念回顾 温故而知新,上一节[K8S学习笔记]初识K8S 及架构组件 我们学习了K8s的发展历史. ...

  2. SQL反模式学习笔记12 存储图片或其他多媒体大文件

    目标:存储图片或其他多媒体大文件 反模式:图片存储在数据库外的文件系统中,数据库表中存储文件的对应的路径和名称. 缺点:     1.文件不支持Delete操作.使用SQL语句删除一条记录时,对应的文 ...

  3. Kubernetes 学习12 kubernetes 存储卷

    一.概述 1.我们此前讲过根据应用本身是否需要持久存储数据以及某一次请求和之前的请求是否有联系,可以分为四类应用 a.有状态,要存储 b.有状态,无持久存储 c.无状态,要存储 d.无状态,无持久存储 ...

  4. k8s 学习笔记

    常用的kubectl命令   kubectl run kubia --image=luksa/kubia --port=8080 --generator=run/v1   --image 指定镜像 - ...

  5. k8s学习笔记之四:资源清单定义入门

    第一章.k8s中的资源 1.什么叫资源? k8s中所有的内容都抽象为资源, 资源实例化之后,叫做对象 2.在k8s中有哪些资源? 工作负载型资源(workload): Pod ReplicaSet D ...

  6. k8s学习笔记

    9.deployment:声明式的升级应用 9.1.使用RC实现滚动升级 #kubectl rolling-update kubia-v1 kubia-v2 --image=luksa/kubia:v ...

  7. Docker&K8S学习笔记(一)—— Docker安装

    最近一年在工作上经常使用Docker与K8S,除了利用其打镜像,部署服务外,还基于Docker与K8S开发了一套CICD流水线平台,为了加深相关知识点的理解,所以从今天开始会定期更新学习笔记,本套学习 ...

  8. 【Visual C++】游戏编程学习笔记之八:鼠标输入消息(小demo)

     本系列文章由@二货梦想家张程 所写,转载请注明出处. 作者:ZeeCoder  微博链接:http://weibo.com/zc463717263 我的邮箱:michealfloyd@126.c ...

  9. Docker 学习6 Docker存储卷

    一.什么是存储卷 二.为什么要用到数据卷 三.数据卷是怎么被管理的 四.存储卷种类 五.在容器中使用存储卷 1.只声明容器路径 [root@localhost docker]# docker run ...

随机推荐

  1. Python人工智能之路 - 第二篇 : 算法实在太难了有现成的直接用吧

    本节内容 预备资料: 1.FFmpeg: 链接:https://pan.baidu.com/s/1jonSAa_TG2XuaJEy3iTmHg 密码:w6hk 2.baidu-aip: pip ins ...

  2. 绑定的jndi获得connection时,出的错,java.io.NotSerializableException

    求助:java.io.NotSerializableException 最近系统频繁出现Lookup error: java.io.WriteAbortedException: Writing abo ...

  3. base64详解及实现

    概述 base64 说起来大家应该都是很熟悉的,很多类型的数据都可以转成base64的编码规则,例如图片,pdf,文本,邮件内容等. 什么是base64 根据RFC2045的定义,base64被定义为 ...

  4. 第九节 java7JDK的常用封装类型

    一.Java Scanner类 /初始化一个 scanner 对象. Scanner scanner = new Scanner(System.in); //判断语法 boolean b = scan ...

  5. sql将服务器名称换成本地IP

    安装sql后服务器名称默认为电脑的名称,而想要换成习惯用的本地ip也是可以的. 将配置管理中的MSSQLSEVER协议中的TCP/IP启用,并且打开其属性,找到IP地址,添加本地IP,并设置成启用,然 ...

  6. java集合之List。

    实际上有两种List:一种是基本的ArrayList其优点在于随机访问元素,另一种是更强大的LinkedList它并不是为快速随机访问设计的,而是具有一套更通用的方法. List:次序是List最重要 ...

  7. 划分树(poj2104)

    poj2104 题意:给出n个数,有m次查询,每次查询要你找出 l 到 r 中第 k 大的数: 思路:划分树模板题 上述图片展现了查询时如何往下递推的过程 其中ly表示 [sl,l) 中有多少个数进入 ...

  8. Spring Boot的事务管理注解@EnableTransactionManagement的使用

    @EnableTransactionManagement:负责开启springboot 的事物支持,等同于xml配置文件中的 <tx:annotation-driven /> 然后在访问数 ...

  9. Eclipse安装Activiti Designer插件

    本人使用的是在线安装: 打开Eclipse -> Help -> Install New SoftWare-> Add 然后按照如下对话框输入: Name:Activiti BPMN ...

  10. lvm创建和在线扩容

    添加磁盘后创建lvm lsblk 或是fdisk  -l  查看添加的磁盘 fdisk  -l lsblk 进入到sdb创建分区 n新建p标准分区e扩展分区1序列号 加10G或全给 p查看 要创建lv ...