Docker卷与Kubernetes持久卷

时间:2018-10-30 10:43:30

标签: docker kubernetes

我找到的最接近的答案是this

但是我想知道的是,Kubernetes是否会完全忽略Dockerfile VOLUME命令?还是数据将被保留在两个地方?一个用于docker卷(在运行哪个pod的主机中),另一个是Kubernetes的PV?

问这个的原因是因为我从docker hub部署了一些包含VOLUME命令的容器。同时,我还将PVC贴在我的吊舱上。我在考虑是否在节点中创建本地卷(docker卷,而不是K8 PV)?如果我的Pod已调度到另一个节点,那么是否创建了另一个新卷?


最重要的是,感谢@Rico指出-v命令和Kubernetes的安装将优先于dockerfile VOLUME命令,但是如果出现以下情况该怎么办:

  • dockerfile VOLUME到'/ myvol'

  • Kubernetes将PVC安装到'/ anotherMyVol'

在这种情况下,myvol是否会安装到我的本地节点硬盘上?并导致不知道的数据在本地持久保存?

2 个答案:

答案 0 :(得分:4)

除非您在Kubernetes pod规范中覆盖它,否则它将不会被忽略。例如,如果您遵循Docker文档中的this示例:

$ docker run -it container bash
root@7efcf5ef12a2:/# mount | grep myvol
/dev/nvmeXnXpX on /myvol type ext4 (rw,relatime,discard,data=ordered)
root@7efcf5ef12a2:/#

您将看到它已安装在运行容器的主机的根驱动器上。 Docker实际上在主机文件系统上的/var/lib/docker/volumes下创建了一个卷(/var/lib/docker是您的Docker图形目录):

$ pwd
/var/lib/docker/volumes
$ find . | grep greeting
./d0bc20d085243c39c4f386dce2f6cafcd8146128d6b0c8f9dcb27cfb61a7ecab/_data/greeting

您可以在Docker中使用-v选项覆盖它:

$ docker run -it -v /mnt:/myvol container bash
root@1c7211cf43d0:/# cd /myvol/
root@1c7211cf43d0:/myvol# touch hello
root@1c7211cf43d0:/myvol# exit
exit
$ pwd # <= on the host
/mnt
$ ls
hello

因此,在Kubernetes上,您可以在pod规范中覆盖它:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mycontainer
    image: container
    volumeMounts:
    - name: storage
      mountPath: /myvol
  volumes:
    - name: storage
      hostPath:
        path: /mnt
        type: Directory

答案 1 :(得分:0)

您需要显式定义PersistentVolumeClaim和/或PersistentVolume。尚未为您完成。