【问题标题】:I m not able to connect to mongo with a container docker我无法使用容器 docker 连接到 mongo
【发布时间】:2017-10-22 11:28:13
【问题描述】:

我是 docker 新手 所以我跟进了教程here,第 6,7 和 8 部分,以便在项目中使用和学习 docker。

问题是当我使用 docker-compose.yml 在我的笔记本电脑上构建图像时, 我的 stack_server 可以连接到 mongo。

但是,如果我从 docker hub 构建图像并在我的笔记本电脑上单独提取并运行它们,我的 stack_server 将无法连接到 mongo。

这是我的 docker-compose.yml :

client:
    build: ./client
    restart: always
    ports:
      - "80:80"
    links:
      - server
mongo:
  image: mongo
  command: --smallfiles
  restart: always
  ports:
    - "27017:27017"
server:
    build: ./server
    restart: always
    ports:
     - "8080:8080"
    links:
     - mongo

但是,我的 stack_client 可以连接到 stack_server。

以及我运行图像的命令(我的图像是公开的)

docker-run -i -t -p 27017:27017 mongo
docker-run -i -t -p 80:80 mik3fly4steri5k/stack_client 
docker-run -i -t -p 8080:8080 mik3fly4steri5k/stack_server

还有我的错误日志

bryan@debian-dev7:~$ sudo docker run -i -t -p 8080:8080 mik3fly4steri5k/stack_server
[sudo] password for bryan: 
Express server listening on 8080, in development mode
connection error: { Error: connect ECONNREFUSED 127.0.0.1:27017
    at Object._errnoException (util.js:1021:11)
    at _exceptionWithHostPort (util.js:1043:20)
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1175:14)
  name: 'MongoError',
  message: 'connect ECONNREFUSED 127.0.0.1:27017' }

这是我的 stack_server dockerfile

FROM node:latest

# Set in what directory commands will run
WORKDIR /home/app

# Put all our code inside that directory that lives in the container
ADD . /home/app

# Make sure NPM is not cached, remove everything first
RUN rm -rf /home/app/node_modules/npm \
 && rm -rf  /home/app/node_modules

# Install dependencies
RUN npm install

# Tell Docker we are going to use this port
EXPOSE 8080

# The command to run our app when the container is run
CMD ["node", "app.js"]

第一个解决方案,但已弃用

docker-run -i -t -p 27017:27017 --name:mongo mongo
docker-run -i -t -p 80:80 mik3fly4steri5k/stack_client 
docker-run -i -t -p 8080:8080 --link mongo:mongo mik3fly4steri5k/stack_server

当我运行我的 stack_server 时,我必须在我的 mongo 上输入一个名称并将其与参数 --link 链接

docker documentation

Warning: The --link flag is a deprecated legacy feature of Docker. 
It may eventually be removed. 
Unless you absolutely need to continue using it,
we recommend that you use user-defined networks to facilitate communication 
between two containers instead of using --link.
One feature that user-defined networks do not support that you can do with 
--link is sharing environmental variables between containers.
However, you can use other mechanisms such as volumes to share environment 
variables between containers in a more controlled way.

【问题讨论】:

  • 您的 mongo 应用程序正在侦听 27017 而不是 8080 (ECONNREFUSED 127.0.0.1:27017)
  • 为什么我的 mongo 应用程序应该监听 8080 ? mongo 必须在其默认端口 27017 上侦听。

标签: mongodb docker docker-compose


【解决方案1】:

使用以下命令运行您的 stack_server

sudo docker run -i -t -p 8080:8080 --link mongo:mongo mik3fly4steri5k/stack_server

注意:--link 标志已弃用

【讨论】:

【解决方案2】:

您的容器正在运行。但它健康吗?我建议您实施 Healthcheck

实际上看起来几乎一样: (Docker-compose YAML)

healthcheck:
  test: curl -sS http://127.0.0.1:8080 || echo 1
  interval: 5s
  timeout: 10s
  retries: 3

Docker 健康检查是一个可爱的小功能,它允许将 shell 命令附加到容器并使用它来检查容器的内容是否足够活跃。

希望对你有帮助。

更多信息https://docs.docker.com/compose/compose-file/compose-file-v2/#healthcheck

【讨论】:

  • 不错的小功能,但是如果 healthcheck 失败会发生什么?我可以有一个回调 cmd 吗?
【解决方案3】:

要在所需端口上启动 MongoDB,您必须执行以下操作:

client:
    build: ./client
    restart: always
    ports:
      - "80:80"
    links:
      - server
mongo:
  image: mongo
  command: mongod --port 27017
  restart: always
  ports:
    - "27017:27017"
server:
    build: ./server
    restart: always
    ports:
     - "8080:8080"
    links:
     - mongo

【讨论】:

  • 我知道,当我使用 docker-compose.yml 时,一切正常。这是我不使用 docker-compose.yml 时我的 stack_server 无法连接到 mongo 的时候!
【解决方案4】:

让我们看看错误

连接错误:{ 错误:连接 ECONNREFUSED 127.0.0.1:27017

服务器试图连接到 localhost 而不是 mongo。你需要配置服务器来连接mongo到mongo:27017

mongo 是 docker 创建的别名,用于将容器相互链接。

【讨论】:

  • 已经试过但没用(我会再试一次然后回来)
  • 你能告诉我你现在得到了什么例外吗?
猜你喜欢
  • 2018-08-11
  • 1970-01-01
  • 2020-12-23
  • 1970-01-01
  • 2018-09-24
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
相关资源
最近更新 更多