【问题标题】:How to connect docker container to mongodb如何将docker容器连接到mongodb
【发布时间】:2019-01-12 20:19:00
【问题描述】:

我无法将作为 docker 容器运行的应用程序连接到 mongoDB。我知道新版本 docker-compose 不推荐使用“链接”,所以我尝试使用自定义网络。我的 docker-compose.yml:

version: "3.3"

services:

  app:
    container_name: app
    build: ./app
    depends_on:
      - "mongodb"
    networks:
      - my-network
    command: pm2-docker start pm2.config.js --watch
    volumes:
      - ./app/logs:/opt/app/logs
      - ./app:/opt/app
    ports:
      - "3010:80"

  mongodb:
    image: mongo
    container_name: mongodb
    restart: always
    environment:
      MONGO_INITDB_ROOT_PASSWORD: pw
      MONGO_INITDB_ROOT_USERNAME: login
      MONGO_INITDB_DATABASE: dbname
    volumes:
      - ./mongodb/db:/data/db
    ports:
      - "27017:27017"
    networks:
      - my-network

networks:
  my-network:
    driver: bridge

我的应用程序的 Dockerfile:

FROM node:10.7.0


RUN npm i -g pm2
RUN pm2 install pm2-logrotate \
    && pm2 set pm2-logrotate:max_size 50M \
    && pm2 set pm2-logrotate:compress true \
    && pm2 set pm2-logrotate:workerInterval 60

RUN mkdir -p /tmp
COPY package*.json /tmp/
RUN cd /tmp \
    && npm i \
    && npm cache clean --force

RUN mkdir -p /opt/app && cp -a /tmp/node_modules /opt/app/
WORKDIR /opt/app
COPY . /opt/app/
VOLUME [ "/opt/app/logs/" ]

ENV PORT 80
ENV MONGODB_AUTH mongodb://login:pw@127.0.0.1:27017/dbname
EXPOSE 80

CMD [ "pm2-docker", "start", "pm2.config.js", "--env", "production" ]

当我运行 MongoClient.connect(process.env.MONGODB_AUTH, { useNewUrlParser: true }); 时,我在我的应用程序中收到以下错误消息:

MongoNetworkError: 首次连接时无法连接到服务器 [127.0.0.1:27017] [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017]

我不明白我做错了什么。这是docker network ls 的控制台输出:

NETWORK ID          NAME                    DRIVER     SCOPE
4731ec3d6886        bridge                  bridge     local
e5a6bf78bd5f        docker_gwbridge         bridge     local
aae21167a37a        host                    host     local
d6ba0dfe01a3        myproject_default       bridge     local
34af02bd434d        myproject_my-network    bridge     local
5911111233bf        none                    null     local

这是docker network inspect myproject_my-network的输出:

[
    {
        "Name": "myproject_my-network",
        "Id": "34af02bd434d7fe8b6755f584b45eeb0a47fafb087d7f44023598d6ae8bb79a4",
        "Created": "2018-08-05T22:21:06.938675177+03:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.20.0.0/16",
                    "Gateway": "172.20.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {
            "com.docker.compose.network": "my-network",
            "com.docker.compose.project": "myproject"
        }
    }
]

当我尝试使用 172.20.0.1 而不是 127.0.0.1 时,我得到了同样的错误。我很乐意为我的问题提供任何帮助

【问题讨论】:

  • 听起来您是在同一个 Docker 实例中自动启动 MongoDB,如果是这样,您的配置看起来还不错。建议:1)看这里:docs.docker.com/samples/library/mongo/…,2)验证 MongoDB 本身是否已启动并运行(例如,使用mongo shell。最后,3)关注为什么 NodeJS(也在同一个 Docker 实例上)无法连接.

标签: node.js mongodb docker


【解决方案1】:

您似乎在一个名为 mongodb 的容器中运行 mongodb。

MongoDB 正在监听容器的 27017 端口,您的容器将其发布到主机的 27017 端口。

但是在您的应用程序容器中,没有应用程序正在侦听 localhost 的端口 27017。

所以你的错误是正常的,你应该无法以这种方式连接到 mongo。 相反,您可以尝试:

ENV MONGODB_AUTH mongodb://login:pw@mongodb:27017/dbname

不过,您仍然需要使用主机上的mongodb://login:pw@127.0.0.1:27017/dbname 访问 mongo。

在 docker compose 的文档中有一个例子:

在 Web 容器中,您到 db 的连接字符串看起来像 postgres://db:5432,而在主机上,连接字符串看起来像 postgres://{DOCKER_IP}:8001。 来自https://docs.docker.com/compose/networking/

【讨论】:

    猜你喜欢
    • 2017-10-13
    • 2017-11-10
    • 2016-06-13
    • 2019-02-16
    • 2022-11-11
    • 2019-08-27
    • 1970-01-01
    • 2019-10-03
    • 2019-02-24
    相关资源
    最近更新 更多