Docker构建了使用数据容器的推荐方法

时间:2017-03-22 17:19:58

标签: docker docker-compose

在我的应用程序中,我有一个nginx容器,我想用它来提供静态webapp文件。这些webapp文件存在于名为“webapp”的单独容器中。

将webapp容器安装到nginx容器中的推荐方法是什么?我目前的方法如下:

version: '2'
services:
  nginx:
    volumes_from:
      - webapp


  webapp:
      image: someimageurl                                  

在用于webapp的Dockerfile中,我在nginx容器所服务的路径上公开了一个卷。

这很好用,但问题是在docker-compose v3中,“volumes_from”被删除并替换为命名卷。所以我的新配置看起来像:

version: '3'

volumes: 
   static-webapp:

services:
  nginx:
    volumes:
      - static-webapp:/opt/webapp


  webapp:
      image: someimageurl
      volumes:
        - static-webapp:/opt/webapp                          

这个问题是来自webapp容器的数据只会被复制到'static-webapp'卷中一次。更改内容并重新运行docker-compose后,卷中的内容保持不变。我知道这是设计上的,不会覆盖持久数据。

我的问题是:我应该如何使用docker-compose的v3做到这一点?我基本上想要一个可以挂载到多个容器中的未命名卷。

我想到的解决方案是:

1。)捆绑nginx容器中的静态内容。我不喜欢这个因为我不能将要求分开。

2.)我可以在每次docker-compose运行后手动删除'static-webapp'卷。这似乎也不理想。

1 个答案:

答案 0 :(得分:3)

推荐的方法是删除容器之间的依赖关系,因为这些依赖关系不会逻辑地应用于swarm,其中容器可能在不能共享文件的主机上运行(这就是为什么要删除volume-from的原因)从版本3格式)。在引入命名卷之后,数据容器已经被弃用,尽管有一些过时的文档建议不这样做。

我能想到的选项包括:

  1. 使用版本2撰写文件而不使用swarm模式。如果您没有使用swarm模式,则无需升级到版本3格式。

  2. 直接将数据添加到每个容器中。

  3. 重新构建您的应用以区分不同的组件。我不清楚nginx和另一个容器中应用程序代码的使用情况,看起来应该只是一个或另一个。

  4. 创建一个包含所有应用程序数据的数据同步实用程序容器,在整个群集中全局运行,并在启动时将每个群集节点上的卷推送更改。这也可以像git repo那样进行轮询,并在任何更改时不断更新本地卷。然后,您的其他容器将指向此本地命名卷。

  5. 将容器指向远程卷,如NFS,因此您只需要从任何主机更新一次数据,并消除任何不同步的主机,但也会在任何读取中增加额外的延迟。