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

时间:2016-04-03 17:58:17

标签: docker dockerfile

你们如何处理docker容器的web应用程序文件?我们为> 400个客户使用相同的应用程序。它与启用/禁用模块(具有额外文件)的应用程序相同。

我目前正在使用这种方法:构建图像,例如对于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
恕我直言,这是一个过度使用的空间。 我认为创建一个webapp docker数据容器的> 100个标签(修订版)有点复杂。 请告知如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

首先,最新版本的Docker允许您创建和使用named volumes。这意味着“仅限数据的容器”已经过时且不再需要,事实上现在被认为是反模式。创建和使用命名卷非常简单:

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

您可以使用以下方式查看卷:

docker volume ls

就您的主要问题而言,您可以利用Docker的union filesystem(也可以更简单地称为“共享层”)设计。这意味着如果您从ubuntu映像创建两个容器(例如docker run -d --name=one ubuntudocker run -d --name=two ubuntu),这两个容器将在基本ubuntu映像中使用相同的文件系统对象。因此,例如,这两个容器中的/etc/passwd文件指向存储在磁盘上的相同/etc/passwd数据。这是Docker上下文中“union filesystem”一词的含义。

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

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

答案 1 :(得分:1)

取决于:

  

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

     

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