【问题标题】:Docker-compose recommended way to use data containersDocker-compose 推荐使用数据容器的方式
【发布时间】:2017-03-22 17:19:57
【问题描述】:

在我的应用程序中,我有一个 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 up后,卷中的内容不变。我知道这是设计使然,不会覆盖持久数据。

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

我想到的解决方案是:

1.) 在 nginx 容器中捆绑静态内容。我不喜欢这样,因为那样我就无法将要求分开。

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

【问题讨论】:

  • 你刚才说 docker 卷复制内容,我认为这是错误的,它直接引用它们。

标签: docker docker-compose


【解决方案1】:

推荐的方法是删除容器之间的依赖关系,因为这些依赖关系在逻辑上不适用于 swarm,其中容器可能在无法共享文件的不同主机上运行(这就是为什么从版本 3 中删除了volumes-from格式)。在引入命名卷之后,数据容器已被弃用,尽管一些过时的文档另有说明。

我能想到的选项包括:

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

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

  3. 重新架构您的应用程序,以不同方式拆分组件。我不清楚nginx和另一个容器中的应用程序代码的用例,似乎应该只是其中一个。

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

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

【讨论】:

    猜你喜欢
    • 2020-07-26
    • 2019-01-03
    • 2014-09-09
    • 2021-09-09
    • 2022-11-13
    • 2015-08-17
    • 2017-01-20
    • 2016-08-13
    • 2012-08-04
    相关资源
    最近更新 更多