node.js - 如何在同一网络上运行 docker-compose 和 docker?
问题描述
我运行 2 个 docker 容器。一种是 mongodb 容器。另一个是 Node.js 应用程序容器尝试连接到该 mongodb 容器。
如果我在没有 docker 的 node.js 应用程序上通过“npm run start”运行,它运行良好。它仅使用“mongodb://localhost:27017/myproject”连接到 mongodb 容器。
但它不适用于 dockerized node.js 应用程序。它确实通过“mongoose.connect”方法连接到 Mongo DB。
但是当我在编译后实际连接浏览器时,它说:
(node:32) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'data' of undefined
看起来 node.js 容器连接到 mongodb 容器存在问题,因此无法从中获取任何内容,因此数据如其所说未定义。
我做的步骤:
通过以下命令,我首先创建了 mongodb 容器:
sudo docker container run --name mymongodb --publish 27017:27017 -d mongo
然后,在 node.js 应用程序上,我只是:
docker-compose build
docker-compose up
我的 docker-compose.yml:
version: "2"
services:
myapp:
container_name: mycontainer
restart: always
build: .
ports:
- "3001:3001"
network_mode: host
上面的错误是什么问题?
解决方案
通常,我们不会network_mode: host
在 dev 上使用。默认情况下,docker-compose 将为您的项目创建一个网络,并且所有容器都可以使用它们的容器名称进行通信。
如果您想从网络外部(例如从您的浏览器)访问容器,您可以使用该ports:
部件向您的主机公开一个容器端口。
在您的情况下,我会将您的docker-compose.yml
文件更改为:
version: "2"
services:
myapp:
restart: always
build: .
ports:
- "3001:3001"
mymongodb:
image: mongo
ports:
- 27017:27017
volumes:
- mongodb:/data/db
volumes:
mongodb: {}
我还向 mongodb 添加了一个卷,以便在删除容器时保留数据。
并在使用 docker 时将连接字符串更新为 mongodb mongodb://mymongo:27017/myproject
。在您的主机上,没有 docker,连接字符串保持不变(localhost
而不是mymongodb
)
推荐阅读
- python - 通过参数使biopython Entrez.esearch循环
- javascript - 角度组件继承期间的类型错误
- css - 使用 CSS 跨度选择器进行编辑
- java - 读取超时属性的功能是什么?
- php - 在用户选择php的选项选择下拉列表中设置默认值
- php - 回显 id=$id 的行数
- visual-studio-2010 - CListCtrl 的 EnableWindow(FALSE) 不会改变它的外观
- c# - 通过 C# 从 Access 中提取 VBA 代码
- opc - 与 Milo OPC Client 连接时 PLC 拒绝连接
- python - 在 Python 中使用 ctypes 实现 NtCreateNamedPipeFile