如何在Docker中处理Web应用程序的文件?

你们如何处理你的docker集装箱的Web应用程序的文件? 我们正在使用相同的应用程序> 400客户。 这是与启用/禁用模块相同的应用程序(有额外的文件)。

我目前正在使用这种方法:构build图像,例如为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 

恕我直言,这是一个过度使用的空间。 我认为创build> 100个webapp docker数据容器标签(修订版)有点复杂。 请咨询如何pipe理这个问题?

首先,最新版本的Docker允许您创build和使用命名卷 。 这意味着“纯数据容器”已经过时了,不再需要了,而且事实上这些日子也被认为是反模式。 创build和使用命名卷非常简单:

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

您可以查看您的卷:

 docker volume ls 

至于你的主要问题,你可以利用Docker的联合文件系统 (也可以更简单地称为“共享层”)devise。 这意味着如果你从ubuntu镜像创build两个容器(例如docker run -d --name=one ubuntudocker run -d --name=two ubuntu ),那么这两个容器都将使用相同的文件系统对象在基地Ubuntu的形象。 因此,例如,这两个容器中的/etc/passwd文件都指向存储在磁盘上的相同的/etc/passwd数据。 这是Docker上下文中“union filesystem”一词的一部分。

所以,只要将这些知识进一步深入,将这些模块“烘焙”到您的基础图像中,供所有不同客户的容器使用。 这只是意味着从使用FROM wordpress:latest的Dockerfile创build自己的图像FROM wordpress:latest的顶部。 继续WordPress的例子,如果你想制作一堆可用的WP插件,你可以将它们存储在/var/www/html/wp-plugins (或其他)中,只在你的configuration中启用某些WP插件。 由于它们被烘焙到您创build的映像中(并使用相同的映像来创build所有不同的容器),所有这些模块文件都通过联合文件系统指向存储在磁盘上的相同的确切数据。 当然,如果有人在其中一个模块中更改了代码,例如,单个容器的图像将在其自己的图像层中存储更改,但基本文件将全部来自相同的数据,不会占用任何额外的空间。 当然,你可以用你正在使用的CMS来代替。

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

这取决于:

如果这些文件是静态的,而且您希望能够轻松地移动容器,那么只需将文件复制到Web位置作为单个目录,即可将文件保留在容器中。

如果你有一个可靠的外部位置,并且你更经常地修改文件(例如使用某种CMS),你可以运行一个apache或者一个nginx容器并且安装这个卷