docker compose 将 mongodb 容器与节点 js 容器连接起来

Posted

技术标签:

【中文标题】docker compose 将 mongodb 容器与节点 js 容器连接起来【英文标题】:docker compose connecting mongodb container with node js container 【发布时间】:2019-04-24 02:22:29 【问题描述】:

我有一个 sharelatex 容器正在运行。这个 docker compose 文件包含一个 mongo 和 redis 容器。

这里是 sharelatex docker compose

version: '2'
services:
    sharelatex:
        restart: always
        image: rigon/sharelatex-full
        #image: sharelatex/sharelatex
        container_name: sharelatex
        networks:
            - test-network
        depends_on:
            - mongo
            - redis
        privileged: true
        links:
            - mongo
            - redis
        volumes:
            - ./sharelatex_data:/var/lib/sharelatex
            - /var/run/docker.sock:/var/run/docker.sock
        environment:
            SHARELATEX_MONGO_URL: mongodb://mongo/sharelatex
            SHARELATEX_REDIS_HOST: redis
            SHARELATEX_APP_NAME: ShareLaTeX
            SHARELATEX_SITE_URL: https://latex.tkwant.de

   mongo:
        restart: always
        image: mongo
        container_name: mongo

        expose:
           - 27017
        volumes:
            - ./mongo_data:/data/db
        networks:
            - test-network
    redis:
        restart: always
        image: redis
        container_name: redis

        networks:
            - test-network
        expose:
            - 6379
        volumes:
            - ./redis_data:/data

networks:
    test-network:
      external: true

我也想创建一个需要 mongodb 的节点应用程序。 我怎样才能连接这两个容器? 我阅读了网络并尝试了 docker network 但没有成功。

这是我的 node docker compose

version: '3.5'
services:
  app:
    container_name: app
    restart: always
    build: .
    ports:
      - '3001:3000'
    networks:
      - test-network
networks:
    test-network:
      driver: external

这里是我的 index.js

// Connect to MongoDB
mongoose
  .connect(
    'mongodb://mongo:27017/test2',
     useNewUrlParser: true 
  )
  .then(() => console.log('MongoDB Connected'))
  .catch(err => console.log("errorErrorError"));

我愿意接受所有答案... 在自己的容器中运行 mongo 或创建 docker 网络。但我不知道什么是最好的或最简单的。

更新 1:

第一个问题:Sharelatex 不再工作 --> sharelatex 现在在另一个网络中。我的 nginx 反向代理不再找到 sharelatex 容器。第二个问题是:当我想启动节点 docker 时出现此错误(不知道为什么,但它想创建一个新网络):使用驱动程序“外部”创建网络“dockernodemongo_test-network”错误:找不到插件“外部”

【问题讨论】:

你能展示你使用 docker 网络的尝试吗?另外,你说它不起作用是什么意思? 我更新了它。在第一个答案下,您可以阅读不起作用的内容 【参考方案1】:

好的,看来您在两个实例上都指定了自定义网络,但实际上并没有命名它们。标题 test-network 只能用于在同一文件中引用它。

networks:
  test-network:
    external: true

这将有效地创建一个自定义网络,但没有指定名称,它会创建一个默认名称 [projectname]_test-network。您正在使用 [projectname]_test-network 有效地创建两个不同的网络,这就是它尝试创建“dockernodemongo_test-network”网络的原因。

在您的节点 docker-compose 上,您可以尝试:

networks:
  test-network:
    external:
      name: [sharelatexname]_test-network

这将有效地搜索具有该名称的预先存在的网络。或者,您可以从创建网络的第一个实例开始命名网络,这样可以省去尝试找出名称的麻烦。

sharelatex docker-compose:

networks:
  test-network:
    name: test-network
    external: true

节点 docker-compose:

networks:
  test-network:
    external:
      name: test-network

至于为什么不创建节点网络; “驱动程序:”您没有名为“外部”的现有插件,有一些内置驱动程序可为您的网络添加许多功能(例如多主机),例如桥接、覆盖和 macvlan。您还可以下载其他自定义插件。我不相信你需要这些来完成你想要完成的事情。此外,由于您只使用一个网络,因此服务中的所有“网络:”实例都是不必要的。它们都将成为唯一指定网络的一部分。如果您在同一个 docker-compose 上有多个网络并希望为其中的特定服务隔离/命名网络,“网络:”将很有用。

【讨论】:

【参考方案2】:

你可以试试这样的。

如下创建一个docker网络。

docker network create <NETWORK_NAME>

在你的sharelatex docker compose中,你可以像这样添加这个网络(test-network是网络的名字)

services:
    mongo:
        restart: always
        image: mongo
        container_name: mongo
        networks:
           - test-network
        expose:
           - 27017
        volumes:
            - ./mongo_data:/data/db

networks:
    test-network:
      external: true

同样,您可以在 docker compose 文件中为您的节点应用程序执行相同的操作(使用相同的网络名称)。

一旦两个容器在同一个网络中,您就可以使用容器名称作为主机名来连接它。

此外,您可以使用以下命令验证容器是否在同一网络中运行

docker network <NETWORK_NAME> inspect

附言

    您应该使用环境变量来传递 mongo 主机名和 移植到您的节点应用程序 您可以将您的节点应用程序放在同一个 docker-compose 文件中 共享乳胶。但这完全是另一回事

【讨论】:

这不起作用...我更新了代码我的问题是如何尝试的:第一个问题:Sharelatex 不再工作--> sharelatex 现在在另一个网络中。我的 nginx 反向代理不再找到 sharelatex 容器。第二个问题是:当我想启动节点 docker 时出现此错误(不知道为什么,但它想创建一个新网络):使用驱动程序“外部”创建网络“dockernodemongo_test-network”错误:找不到插件“外部” 我假设您将 nginx 作为单独的服务运行,而不是在 docker 容器中运行。对于第一点,我认为您也应该将 nginx 作为容器运行。只需将其添加到您的 sharelatex compose 文件中即可。关于第二点,能否请您确认您是否使用 docker network create 命令单独创建了一个 docker 网络? 另外,请确认您是在同一主机还是在不同主机上运行这些容器?【参考方案3】:

你可以试试这个。

version: '2'
services:
    mongo: // declare first
        restart: always
        image: mongo
        container_name: mongo
        expose:
           - 27017
        volumes:
            - ./mongo_data:/data/db

    redis: // declare first
        restart: always
        image: redis
        container_name: redis
        expose:
            - 6379
        volumes:
            - ./redis_data:/data

    sharelatex:
        restart: always
        image: rigon/sharelatex-full
        #image: sharelatex/sharelatex
        container_name: sharelatex
        depends_on:
            - mongo
            - redis
        privileged: true
        links:
            - mongo:mongo // added :mongo
            - redis:redis // added :redis
        volumes:
            - ./sharelatex_data:/var/lib/sharelatex
            - /var/run/docker.sock:/var/run/docker.sock
        environment:
            SHARELATEX_MONGO_URL: mongodb://mongo/sharelatex
            SHARELATEX_REDIS_HOST: redis
            SHARELATEX_APP_NAME: ShareLaTeX
            SHARELATEX_SITE_URL: https://latex.tkwant.de

如果您在尝试链接到 mongo 和 redis 后声明它们,docker 将不知道它存在。

来源:https://docs.docker.com/compose/compose-file/#links

请注意官方文档声明:--link 标志是 Docker 的遗留功能。它最终可能会被删除。除非您绝对需要继续使用它,否则我们建议您使用用户定义的网络来促进两个容器之间的通信,而不是使用--link

【讨论】:

我认为你不明白我的问题...... Sharelatex mongo 和 redis 工作正常。问题是我不知道如何将 mongo 连接到节点 我的节点 docker 容器中需要一个链接来运行 mongo 容器

以上是关于docker compose 将 mongodb 容器与节点 js 容器连接起来的主要内容,如果未能解决你的问题,请参考以下文章

如何为 MongoDB 和 Spring Boot 定义主机名到 docker-compose.yml

Docker-compose 从链接迁移到网络 MongoDB 数据库问题

使用docker-compose安装启动单机MongoDB

Mongodb 与 docker-compose - 创建用户

docker-compose部署mongodb+redis遇到的问题

docker-compose启动并使用MongoDB