【问题标题】:Docker container does/doesnt work inside kubernetesDocker 容器在 kubernetes 内工作/不工作
【发布时间】:2019-06-20 08:49:02
【问题描述】:

我在这里有点困惑。它确实像普通的 docker 容器一样工作,但是当它进入 pod 时它不会。所以这就是我的做法。

Dockerfile 在我的本地创建镜像并发布到 docker 注册表

FROM alpine:3.7
COPY . /var/www/html
CMD tail -f /dev/null

现在,如果我只是拉出图像(删除本地图像后)并作为容器运行。它有效,我可以在 /var/www/html 中看到我的文件。

现在我想在我的 kubernetes 集群中使用它。

定义:Minikube --vm-driver=none

我在 minikube 中运行 kube,但没有驱动程序选项。所以对于单节点集群。

编辑

如果我从部署文件中删除卷挂载和声明,我可以在 /var/www/html 中看到我的数据。

部署文件

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    io.kompose.service: app
  name: app
spec:
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      creationTimestamp: null
      labels:
        io.kompose.service: app
    spec:
      securityContext:
        runAsUser: 1000
        runAsGroup: 1000
      containers:
      - image: kingshukdeb/mycode
        name: pd-mycode
        resources: {}
        volumeMounts:
        - mountPath: /var/www/html
          name: claim-app-storage
      restartPolicy: Always
      volumes:
      - name: claim-app-storage
        persistentVolumeClaim:
          claimName: claim-app-nginx
status: {}

PVC 文件

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  creationTimestamp: null
  labels:
    io.kompose.service: app-nginx1
  name: claim-app-nginx
spec:
  storageClassName: testmanual
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 100Mi
status: {}

PV文件

apiVersion: v1
kind: PersistentVolume
metadata:
  name: app-nginx1
  labels:
    type: local
spec:
  storageClassName: testmanual
  capacity:
    storage: 100Mi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/data/volumes/app"

现在,当我运行这些文件时,它会创建 pod、pv、pvc 和 pvc 绑定到 pv。但如果我进入我的容器,我看不到我的文件。 hostpath/data/volumes/app 。任何想法将不胜感激。

【问题讨论】:

  • 转到var/www/html 数据将在那里
  • 不是。这就是这个问题的原因。
  • 签入那里可用的主机路径数据。
  • 通常在 Kubernetes 中,您只需从构建的镜像中运行代码,而不是尝试手动将其复制到具有一致版本、一致路径的每个节点。如果您删除所有机制以覆盖图像内容,您的应用程序是否正常工作?
  • @DavidMaze 是的,你是对的。如果我删除 pv 和 pvc,我可以在 /var/www/html 中看到我的文件。

标签: docker kubernetes kubernetes-pod


【解决方案1】:

当 PVC 绑定到 pod 时,volume 会安装在 pod/deployment yaml 文件中描述的位置。在你的情况下:mountPath: /var/www/html。这就是“烘焙到”容器映像中的文件无法访问的原因(简单解释为什么 here

您可以通过运行kubectl exec YOUR_POD -i -t -- /bin/sh 和运行mount | grep "/var/www/html" 来确认容器。

解决方案

您可以通过多种方式解决这个问题。最好将静态数据分开(即在 PV 中),并使容器映像尽可能小且快。

如果您将要在 PV 中挂载的文件传输到主机路径 /data/volumes/app,它们将可以在您的 pod 中访问,那么您可以创建新映像而省略 COPY 操作。这样,即使 pod 崩溃,您的应用对文件所做的更改也会被保存。

如果 PV 将被多个 pod 占用,您需要按照 here 的说明更改 accessModes

访问方式有:

  • ReadWriteOnce – 卷可由单个节点以读写方式挂载
  • ReadOnlyMany – 卷可以被许多节点以只读方式挂载
  • ReadWriteMany – 卷可以被许多节点以读写方式挂载

Kubernetes 文档中 Volumes 的深入解释:https://kubernetes.io/docs/concepts/storage/persistent-volumes/

【讨论】:

  • 据我了解...我将容器的 /var/www/html 目录挂载到主机 /data/volumes/app 目录。因此,我在容器的 var/www/html 目录中拥有的任何数据或文件都将在 hosts /data/volumes/app 目录中可用。根据您的评论,似乎相反。来自 /data/volumes/app 的数据将在容器的 /var/www/html 中可用。我不确定那是否正确。虽然这对 docker 来说肯定是正确的。
  • 是的,您理解正确。这适合您的用例吗?
  • 并非如此。我想用我的图像来提供数据。现在,当您将文件夹 A 挂载到文件夹 B 时,文件夹 A 的数据确实会在文件夹 B 中。但它也反过来。如果您在文件夹 B 中添加数据/文件,这些也应该在文件夹 A 中可见。这就是 mount 的工作原理吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 2023-01-18
  • 2020-12-24
相关资源
最近更新 更多