Docker:多重合成

Docker:多重合成,docker,Docker,我见过许多Docker compose的例子,这对我来说非常有意义,但是所有的Docker compose都将其前端和后端作为单独的容器捆绑在同一个组合上。在我的用例中,我为一个特定的应用程序在Django中开发了一个后端,在React中开发了一个前端。但是,我希望能够允许我的后端API被其他客户端应用程序使用,因此我希望将它们彼此隔离 基本上,我想象它看起来像这样。我的后端将有一个docker compose文件,它将由一个PostgreSQL容器和一个webserver Apache容器组成

我见过许多Docker compose的例子,这对我来说非常有意义,但是所有的Docker compose都将其前端和后端作为单独的容器捆绑在同一个组合上。在我的用例中,我为一个特定的应用程序在Django中开发了一个后端,在React中开发了一个前端。但是,我希望能够允许我的后端API被其他客户端应用程序使用,因此我希望将它们彼此隔离

基本上,我想象它看起来像这样。我的后端将有一个docker compose文件,它将由一个PostgreSQL容器和一个webserver Apache容器组成,其中包含一个卷到我的源代码中。我不打算讨论实现细节,但由于相同组成的容器存在于同一网络上,因此我可以使用文件中的别名引用源代码中的DB。这是一个包含2个容器的环境

在我的前端和将来使用后端的任何其他客户端应用程序上,我将有一个webserver Apache容器来为React源代码的编译静态构建提供服务。这当然存在于它自己的环境中,所以我的问题是如何将这两个环境聚合起来,以便我可以引用我的基本url axios、fetch等中的后端别名。如何将这两个环境发送到一个注册表,然后从该注册表进行部署,以便它们可以继续跨多个服务器进行通信


我觉得我可能忽略了Docker体系结构的总体工作原理,但据我所知,存在一个默认网络,Docker将在默认网络上执行合成并运行它,除非另有规定或它已经在使用。然而,两个独立的组成部分是两个独立的网络,不是吗?我非常感谢您给我上一堂语义课,并提前向您表示感谢。

有几种方法可以将多个合成文件连接在一起。最简单的方法是声明一个项目的默认网络是另一个项目的:

网络: 违约: 外部: 名称:其他默认值 docker network ls将在您启动另一个Compose项目后告诉您实际名称。Docker文档中也建议这样做

一个重要的体系结构要点是,您的浏览器应用程序将永远无法使用Docker主机名。获取调用在浏览器中运行,而不是在Docker中运行,因此它需要到达已发布的端口。最好的设置方法是让Apache服务器也为构建的UI代码提供服务,这样您就可以使用相同的服务器相对URL/api/。。。到达后端。Apache ProxyPass指令将能够使用Docker内部主机名

您还提到了源代码中的卷。这不是Docker的最佳实践。它经常用于使Docker模拟本地开发环境,但这不是您希望在生产环境中部署或运行代码的方式。Docker映像应该是自包含的,Docker-compose.yml通常不需要卷:或命令:

您所提议内容的框架布局可能如下所示:

版本:“3” 服务: db: 图片:博士后:12 卷数: -pgdata:/var/lib/postgresql/data 后端: 图片:我的/后端 环境: PGHOST:db 无端口:不直接暴露,但可以 无卷:或命令:使用映像中的内容 卷数: pgdata: 版本:“3” 服务: 前端: 图片:我的/前端 环境: 后端URL:http://backend:3000 端口: - 8080:80 网络: 违约: 外部: 名称:后端默认值
好的,我猜您指定了一个网络,以使这些应用程序彼此可见,并与其他应用程序隔离?我的意思是,卷只是为了开发,显然,在生产中,我将创建一个Dockerfile,其中包含源文件的副本。此外,如果您指定一个不存在的网络,Docker会自动创建它还是您必须提前创建它?部署时,此网络在生产环境中如何工作?如果指定网络,则该网络必须已经存在。在我的最后一个示例中,带有后端的第一个docker-compose.yml将创建它。