首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >docker组合连接mongodb容器和节点js容器

docker组合连接mongodb容器和节点js容器
EN

Stack Overflow用户
提问于 2018-11-21 13:40:21
回答 3查看 2.4K关注 0票数 8

我有个sharelatex容器在运行。这个码头组合文件包含一个mongo和redis容器。

这是sharelatex码头组合

代码语言:javascript
复制
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的节点应用程序。如何连接这两个集装箱?我读过关于网络的文章,试过了码头网络,但没有成功。

这是我的节点对接器组成

代码语言:javascript
复制
version: '3.5'
services:
  app:
    container_name: app
    restart: always
    build: .
    ports:
      - '3001:3000'
    networks:
      - test-network
networks:
    test-network:
      driver: external

我的index.js

代码语言:javascript
复制
// Connect to MongoDB
mongoose
  .connect(
    'mongodb://mongo:27017/test2',
    { useNewUrlParser: true }
  )
  .then(() => console.log('MongoDB Connected'))
  .catch(err => console.log("errorErrorError"));

我愿意接受所有答案..。在自己的容器中运行mongo或创建一个码头网络。但是我不知道什么是最好的还是最容易的。

更新1:

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-11-24 09:55:30

你可以试试这样的东西。

创建一个码头网络,如下所示。

代码语言:javascript
复制
docker network create <NETWORK_NAME>

sharelatex组合中,可以添加这个网络(测试网络是网络的名称),如下所示

代码语言:javascript
复制
services:
    mongo:
        restart: always
        image: mongo
        container_name: mongo
        networks:
           - test-network
        expose:
           - 27017
        volumes:
            - ./mongo_data:/data/db

networks:
    test-network:
      external: true

同样,您也可以在您的节点应用程序的停靠器组合文件中执行相同的操作(使用相同的网络名称)。

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

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

代码语言:javascript
复制
docker network <NETWORK_NAME> inspect

P.S.

  1. 应该使用环境变量将mongo主机名和端口传递给节点应用程序。
  2. 您可以将节点应用程序放在与sharelatex相同的docker-组合文件中。但这是另一种讨论
票数 6
EN

Stack Overflow用户

发布于 2018-11-29 20:40:41

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

代码语言:javascript
复制
networks:
  test-network:
    external: true

这将有效地创建一个自定义网络,但是如果没有指定的名称,它就会创建一个默认的projectname_test-network名称。您实际上是在使用projectname_test-network创建两个不同的网络,这就是它试图创建一个"dockernodemongo_test- network“网络的原因。

在节点停靠-组合中,您可以尝试:

代码语言:javascript
复制
networks:
  test-network:
    external:
      name: [sharelatexname]_test-network

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

sharelatex码头-组成:

代码语言:javascript
复制
networks:
  test-network:
    name: test-network
    external: true

节点对接器-组成:

代码语言:javascript
复制
networks:
  test-network:
    external:
      name: test-network

至于为什么它不创建节点网络;“驱动程序:”您没有现有的插件,称为‘外部’,有一些内置的驱动程序,增加了许多功能(例如多主机)到您的网络,如桥,覆盖和macvlan。您还可以下载其他自定义插件。不过,我不认为你需要这些来完成你想要完成的任务。另外,由于您只使用一个网络,服务中的所有“网络:”实例都是不必要的。它们都将成为唯一指定网络的一部分。“网络:”将是有用的,如果您有多个网络在同一码头-组成,并希望隔离/命名网络中的特定服务。

票数 1
EN

Stack Overflow用户

发布于 2018-11-21 14:44:46

你可以试试这个。

代码语言:javascript
复制
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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53413361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档