首页 > 解决方案 > 如何在同一网络上运行 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

上面的错误是什么问题?

标签: node.jsmongodbdockerdocker-compose

解决方案


通常,我们不会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


推荐阅读