我想为node-postgres构建一个docker镜像。它是postgres数据库的nodeJS前端。所以基本上,我想拥有一个带有PostgreSQL数据库的docker镜像,其端口完全隐藏,外部世界只能通过JavaScript/NodeJS使用数据库函数。
我搜索了一下,发现大多数都是关于如何使用docker-compose来完成这一任务的链接,例如here。* 但docker-compose不是我想要的 *,因为我可能需要在不同的环境中使用它(例如k8s),因为我不需要任何原始的postgresql接口。对于所有的意图和目的,数据库是不需要外,只需要nodeJS接口。如果nodeJS+postgres显示为一个单元/服务,那就更好了。在docker方面,到目前为止,我能找到的最接近的东西是这个dockerhub image,它已经7年了,我找不到它的Dockerfile。
要自己写Dockerfile,有几件事我不确定。
首先,我应该使用哪个基本映像,postgres还是node?
我熟悉Ubuntu,可以在dockerfile中使用apt install
postgresql。但是官方的postgres docker image似乎有不同的入口点,与我在Ubuntu或VM中作为后台服务运行postgresql的方式不同。我想在入口点方面官方节点映像也有类似的问题。
所以问题是:
我应该使用postgres镜像作为基础并复制nodejs Dockerfile的步骤,还是使用node镜像作为基础并复制postgres Dockerfile的步骤?
如果有任何一个有经验的人可以帮助解释主要步骤或分享任何见解,那就太好了。
-澄清--
正如评论中指出的,在一个容器中有多个进程通常不是一个好主意。我也理解这个原则背后的伸缩原因。
但是对于这个应用程序,一个进程(nodeJS/node-postgres)包含另一个进程(postgres)。并且进程通常不会横向扩展(由于PostgreSQL等关系数据库的性质)。因此,两个进程之间的对应关系是1:1,通常只有一个db示例。
这就是为什么我想省去涉及docker-compose或k8的额外复杂性,而只是给予其他人一个可以使用不同表面语言运行数据库的映像。这比告诉其他人他们只需要使用docker-compose或其他技术在两个容器之间建立一个网络要容易得多。
1条答案
按热度按时间laawzig21#
Docker被设计为在一个有限的空间(容器)中运行一个进程。现在,如果你想在一个容器中运行一个数据库和nodejs,这意味着两个进程,你必须调整很多,这意味着在Docker世界中的开销。因此,一定要使用两个容器:一个运行数据库,一个运行nodejs。
为了确保只有一个容器是可访问的,只需将两个容器放在一个专用网络上,只告诉docker使nodejs容器可访问。
这可以通过docker-compose来完成,但k8也会支持这个模型。作为一个副作用,因为这是这种情况下的“行业标准”,你可以在这里得到很多支持。