使用docker-compose实现多个应用程序和共享容器

3

我试图理解哪种方法最好。

一个服务器,多个应用程序,一些容器使用相同的镜像。

示例 #1:

每个应用程序使用两个docker-compose.yml文件。

services:
  db:
    image: mariadb:latest
    ...

  app:
    image: app/one
    depends_on:
      - db
    ...

services:
  db:
    image: mariadb:latest
    ...

  app:
    image: app/two
    depends_on:
      - db
    ...

示例 #2:

将所有内容合并到一个docker-compose.yml文件中。

services:
  db:
    image: mariadb:latest
    ...

  app1:
    image: app/one
    depends_on:
      - db
    ...

  app2:
    image: app/two
    depends_on:
      - db
    ...

有常见的做法吗?


你能详细解释一下这个查询吗?根据你的compose文件差异,现在只有一个DB容器,而不是两个。选择哪个选项完全取决于你的系统设计和需求。 - akazuko
2个回答

2

两个常见的做法:

  1. 在应用程序源代码中检入一个 docker-compose.yml 文件(通常位于存储库的根目录旁边的 Dockerfile

  2. 不要在应用程序之间共享数据库(容器使启动第二个容器变得非常容易)

这两件事都建议使用两个单独的 docker-compose.yml 文件。

在多个服务相互协作的情况下,单个 docker-compose.yml 文件可能是有意义的,因此启动一个服务而不启动另一个服务是没有意义的。(例如,您有一个 REST API 服务,但它有一个关联的 Nginx 前端和一个专门的缓存服务,所有这些都彼此关联。)从一个 Docker Compose 设置调用另一个设置略微棘手,在小规模上,将紧密连接的内容放在一起可能是有意义的。

在更大的规模上,有一个单独的部署规范存储库也可能是有意义的;这在像 Kubernetes 这样的集群管理器中更有意义,即使在这种情况下,是将部署数据放在一个存储库中,还是将部署设置与服务分开,这是一种风格选择。


有些应用程序没有docker-compose.yml文件,只有一个Docker镜像。所以我不得不自己编写yml文件。 但我的担心是,当我启动多个数据库容器(还有Redis)时,这会给我留下多个MySQL进程和多个数据卷。找不到答案,不知道这样做是否可以。 这是一种“自托管远离谷歌”的类型的事情。 - user846437
1
是的,使用多个数据库和多个卷(每个服务/应用一个卷)是完全正常的。 - David Maze
@DavidMaze 想象一下,我有两个完全不相关的项目,并且我有两个 docker-compose.yml 文件。这两个项目都使用 PostgreSQL 数据库。我应该将这些项目连接到一个 PostgreSQL 容器中,还是每个应用都有自己的 PostgreSQL?我不确定背后发生了什么情况 :\ - Ali Sherafat
每个应用程序的 docker-compose.yml 文件声明了它所有的本地容器依赖项,并且不会在不同的项目之间共享资源,比如数据库。在容器中运行多个数据库是可以的。 - David Maze

1

这取决于app1和app2之间的关联程度。

从我的角度来看,一个应用程序是一组紧密相关的事物:一个或多个服务、一个数据库和一个前端。在这种情况下,将它们全部放在同一个docker compose中是正确的做法。

在您的情况下,如果您的app1必须使用与app2相同的数据库或表,则将它们放在同一个docker compose中是完全可以的。另一方面,如果app1和app2使用不同的数据库并且彼此不交互,则它们实际上是独立的应用程序,因此应该在不同的docker compose配置中运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接