码头工人将mongodb容器与节点js容器连接起来

时间:2018-11-21 13:40:22

标签: javascript node.js mongodb docker docker-compose

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

这是 sharelatex docker组成

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网络,但没有成功。

这是我的 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时,我得到此错误(不知道为什么,但它想创建一个新网络):使用驱动程序“ external”创建网络“ dockernodemongo_test-network”错误:未找到插件“ external” < / p>

3 个答案:

答案 0 :(得分:6)

您可以尝试这样的事情。

按如下所示创建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

PS

  1. 您应该使用环境变量来传递mongo主机名和 端口到您的节点应用程序
  2. 您可以将节点应用程序放置在与docker-compose文件相同的文件中 乳胶。但这是另外一个讨论

答案 1 :(得分: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上有多个网络,并且希望为其中的特定服务隔离/指定网络,则“ networks:”将很有用。

答案 2 :(得分:-1)

您可以尝试一下。

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