gpt4 book ai didi

node.js - 如何将容器上的端口公开给本地主机并将持久数据绑定(bind)到容器?

转载 作者:搜寻专家 更新时间:2023-10-31 22:46:37 25 4
gpt4 key购买 nike

我正在使用 dockerode 创建一个新的 PostgreSQL docker 容器。我希望能够:

  1. 在本地主机上公开端口 5432
  2. 让容器使用本地主机上的目录作为持久数据存储

我已经能够使用以下代码在本地主机上创建一个 Docker 容器并公开端口 5432 的工作实现:

docker.createContainer({
Image: "postgres",
Env: [`POSTGRES_PASSWORD=postgres`],
HostConfig: {
PortBindings: {
"5432/tcp": [{ HostPort: "5432" }]
},
},
ExposedPorts: {
"5432/tcp": {}
},
name: "container-name"
})
  • 在这个实现中,数据不是持久的——重启容器总是从一个“新的”数据库开始
    • 我需要持久化数据

通过阅读 Docker REST API 文档(以及阅读大量社区帖子),我发现我需要使用 Binds 参数。我将代码更新为以下内容:

docker.createContainer({
Image: "postgres",
Env: [`POSTGRES_PASSWORD=postgres`],
HostConfig: {
PortBindings: {
"5432/tcp": [{ HostPort: "5432" }]
},
// NEW CODE
Binds: [
"/path/on/host/machine:/path/on/container"
],
},
ExposedPorts: {
"5432/tcp": {}
},
name: "container-name"
})
  • 但是,添加Binds 参数后,我无法再从主机连接到数据库

谁能告诉我我做错了什么?我不知道在这个特定的设置中需要什么 Binds 。最终,我不需要将数据库暴露给本地机器,但现在,出于测试目的,我需要能够这样做。提前致谢!

更新 1 - 2019 年 6 月 15 日

我按照建议使用类似的设置重新测试了这个,这与我已经在做的并没有什么不同。但是,这些建议帮助我走上了正确的道路,并了解了我的错误所在。

问题的发生似乎是因为我试图在我的本地主机上重用一个已经用于不同数据库设置的目录。我认为这是支持的;我猜我缺少什么?

无论哪种情况,我现在都可以正常工作,但我不太明白为什么我不能在我的主机上重用我从命令行启动容器时使用的相同目录。

澄清

我没有提到我可以通过从命令行启动容器来让它工作。问题是在尝试使用 dockerode 时 - 但是,我认为这不是 Dockerode 的问题,而是我对 Docker REST API 有一些误解。

可以对所有数据库使用相同的目录如果我从命令行启动容器,但如果我使用 Docker REST 启动容器则不行API(在我的例子中是 dockerode)

更新 2 - 2019 年 6 月 15 日

我的代码生成的路径似乎有问题。在我稍微经历了一下之后,似乎我只是忽略了那个错误。奇怪的是,当我检查日志时我没有在容器中发现任何错误 - 这就是为什么我不认为路径有任何问题。

因此,对于遇到这种情况的人来说,可能只是需要修复您在主机上引用的路径这一简单问题。

话虽如此,我已经标记了 mchawre 接受的解决方案 - 他的解决方案对于我提出的原始问题是正确的。看来我遇到的其他问题都是由错误引起的。

(我确实希望 Docker 日志在容器启动时会说类似“没有这样的目录”之类的内容 - 这会导致更快的解决方案)

相关信息我在这里找到了以下信息:

Warning: the Docker specific variables will only have an effect if you start the container with a data directory that is empty; any pre-existing database will be left untouched on container startup.

  • 我想这就是我遇到这个问题的原因,但还不是 100% 确定

最佳答案

我从头开始尝试了这个,一切正常。请引用以下步骤:

  1. 首先,我在我的机器上安装了 dockerode npm install dockerode
  2. 找出我的 机器 ip端口 docker 守护进程暴露在上面。
  3. 创建了 run.js 文件,其中包含使用外部卷运行 postgres 容器的代码。
var Docker = require('dockerode');
var dockerHostIP = "192.168.0.33"
var dockerHostPort = 2375

var docker = new Docker({ host: dockerHostIP, port: dockerHostPort });

docker.createContainer({
Image: "postgres",
Env: [`POSTGRES_PASSWORD=postgres`],
HostConfig: {
PortBindings: {
"5432/tcp": [{ HostPort: "5432" }]
},
// NEW CODE
Binds: [
"/root/dir:/tmp"
],
},
ExposedPorts: {
"5432/tcp": {}
},
name: "container-name"
}).then(function(container) {
return container.start();
})

注意: /root/dir 是我主机上的目录,/tmp 是容器内的目录。

  1. 运行js文件node run.js
  2. Postgres 似乎正在运行并且可以从我的主机连接到它
$ psql postgresql://postgres:postgres@localhost:5432/postgres
psql (11.3)
Type "help" for help.

postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+------------+------------+-----------------------
postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
| | | | | postgres=CTc/postgres
(3 rows)

postgres=#
  1. 还检查了我主机上 /root/dir 目录的内容,看它是否已正确挂载。
$ ls /root/dir/
test.txt
$

请从你这端尝试并告诉我。

关于node.js - 如何将容器上的端口公开给本地主机并将持久数据绑定(bind)到容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56608465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com