如何处理docker中的web应用文件?

How to deal with files of web applications in docker?

你们如何处理 docker 容器的 Web 应用程序文件?我们正在为 400 多个客户使用相同的应用程序。它与 enabled/disabled 模块相同的应用程序(有额外的文件)。

我目前正在使用这种方法:构建图像,例如对于 Mysql、nginx+php,然后使用准备好的特定应用程序文件夹启动容器:

docker create -v /dbdata --name dbstore x/mysql /bin/true
docker run -d --volumes-from dbstore --name db1 x/mysql
docker run -d -P --name web --link db1:db1 -v /webapp:/opt/webapp x/webapp php-start index.php

恕我直言,这是 space 过度使用。 我认为为 webapp docker 数据容器创建 >100 个标签(修订版)有点复杂。 请指教如何解决这个问题?

这取决于:

If the files are static and you want to be able to move the container around easily, then I keep the files in the container by just copying them into the web location as single directory.

If you have a reliable external location, and you change the files more regular (for example by using some kind of CMS), you could just run an apache or a nginx container and mount the volume

首先,Docker 的最新版本允许您创建和使用 named volumes。这意味着 "data-only containers" 已经过时并且不再需要,实际上现在被认为是一种反模式。创建和使用命名卷非常简单:

docker volume create --name=foo
docker run -d -v "foo:/dbdata" --name "db1" x/mysql

您可以通过以下方式查看您的交易量:

docker volume ls

就您的主要问题而言,您可以利用 Docker 的 union filesystem(也可以更简单地称为 "shared layer")设计。这意味着如果您从 ubuntu 图像创建两个容器(例如 docker run -d --name=one ubuntudocker run -d --name=two ubuntu),这两个容器将在基础 [=] 中使用相同的文件系统对象41=] 图片。因此,例如,这两个容器中的 /etc/passwd 文件指向存储在磁盘上的相同 /etc/passwd 数据。这是术语 "union filesystem" 在 Docker.

上下文中的部分含义

因此,只需进一步了解这些知识,然后 "bake" 将这些模块添加到您的基础映像中,供您不同客户的所有容器使用。这只是意味着从顶部使用 FROM wordpress:latest 的 Docker 文件创建您自己的图像。继续 WordPress 的例子,如果你想让一堆 WP 插件可用,你可以将它们存储在 /var/www/html/wp-plugins(或其他)中,并且只在你的配置中启用某些插件。由于它们被嵌入到您创建的图像中(并使用相同的图像来创建所有不同的容器),所有这些模块文件都通过联合文件系统指向存储在磁盘上的完全相同的数据。当然,如果有人更改了他们某个模块中的代码,例如,单个容器的图像将更改存储在自己的图像层中,但是基础文件将全部来自相同的数据,不会占用任何额外的space。当然,您可以替换您正在使用的任何 CMS。

现在,在我工作的地方,我最近创建了一个基于 Docker 的托管系统供人们使用。问题是我们希望每个客户都拥有自己的 CMS 文件系统副本。 尽管 联合文件系统意味着对基础映像的更改将存储在它们自己的映像层中,但这对于签署我的薪水的人来说还不够好。他们希望每个客户都有自己的 EBS 卷,上面有他们自己的 CMS 文件系统副本。因此,在那种情况下,如果您希望每个客户都拥有自己的卷(例如,为了传输它们进行备份,或移动到新主机等),那么您将无法解决这个问题为这些文件使用额外的存储空间。