如果我在 Kubernetes 环境中运行 Wordpress,其中代码是 Docker 镜像的一部分,并且有人尝试通过 Wordpress 管理员添加插件,我不认为这会运行得很好,因为插件只会安装在他们添加插件时命中的容器上,对吗?
我将代码构建到图像中的方法是否是错误的?我考虑的另一种方法是使用一个包含代码的卷,这可以很好地处理这种用例。有没有关于这类事情的讨论我可以读到?
答案1
假设你必需的为了让 wordpress 用户安装/升级插件,在 Docker 镜像中刻录 wordpress 是行不通的:要么你允许应用程序更新仅有的通过分发新的 docker 镜像或不分发。您想要做的是允许应用程序更新来自两个来源。
如果你没有这样的要求,只需添加:
define(‘DISALLOW_FILE_MODS’,true);
到 wp-config.php 即可。确保当您使用新版本的 Wordpress 升级 Docker 镜像时,数据库架构也会相应升级,并且当前正在执行的所有 Wordpress 版本都可以使用该数据库架构。
如果您无法禁用插件安装/更新,则需要解决 2 个问题:
1)您需要让所有容器访问同一个 wordpress 安装。
容器中的磁盘文件是短暂的,这意味着当容器崩溃时,kubelet 将重新启动它,但文件将会丢失 - 每次你得到一个干净的记录时。
解决此问题的典型方法是创建一个卷,仅用于存储您的 wordpress 安装,并将其挂载在 Pod 中的所有容器上,如下所示:
volumes:
- name: wp-webroot
emptyDir: {}
- name: wp-container
image: wp
volumeMounts:
- name: wp-webroot
mountPath: /var/www/html
- name: wp-container2
image: wp
volumeMounts:
- name: wp-webroot
mountPath: /var/www/html
更多信息:
2) 您需要使共享卷的存储可靠/冗余。Kubernetes 提供许多选项,具体取决于您运行 Kubernetes 安装的位置。如果您在公共云中,请使用该云提供的任何内容(例如 AWS 上的 EFS),如果您在本地,您可能需要研究 glusterfs,或者如果您有现有的 SAN,请使用它。
更多信息:https://kubernetes.io/docs/concepts/storage/volumes/
关于您对该主题的一些参考书目的请求,您会发现许多文档告诉您,您的应用程序应该是图像的一部分,例如第 7 点:
https://developers.redhat.com/blog/2016/02/24/10-things-to-avoid-in-docker-containers/
但同样,这假设应用程序只能由管理员而不是最终用户升级/修改。您必须将在网上找到的建议与您的特定要求结合起来。