【问题标题】:How could I create connection between two services in docker-compose so that they can ping each other?如何在 docker-compose 中创建两个服务之间的连接,以便它们可以互相 ping?
【发布时间】:2020-02-05 16:46:02
【问题描述】:

我是 docker 新手,在使用 docker-compose 连接两个单独的服务时遇到了困难。我需要能够写入数据库并从中读取。此外,必须从每个容器中向另一个容器发送ping

我做docker exec -ti node-app ping mongo,一切都很好。 我做docker exec -ti mongo ping node-app并得到这个错误:

OCI 运行时执行失败:执行失败:container_linux.go:348:启动容器进程导致“执行:\”ping\“:$PATH 中找不到可执行文件”:未知

另外,当我启动 docker-compose 时出现以下错误: 服务器正在运行... 节点应用程序 | { MongoNetworkError: 第一次连接时无法连接到服务器 [mongo:27017] [MongoNetworkError: connect ECONNREFUSED 172.21.0.3:27017]

码头工人撰写

version: '3'
services:
  app:
    container_name: node-app
    restart: always
    build: .
    ports:
      - '80:3000'
    networks:
      - net
  mongo:
    container_name: mongo
    image: mongo
    restart: always
    ports:
      - 27017:27017
    networks:
      - net
networks:
  net:
    driver: bridge

Dockerfile

FROM node:10

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 35.158.153.133/80 # my aws public ip address

CMD ["npm", "start"]

index.js

mongoose
  .connect(
    'mongodb://mongo:27017/mongo',
    { useNewUrlParser: true }
  )
  .then(() => console.log('MongoDB Connected'))
  .catch(err => console.log(err));

const Item = require('./models/Item');

app.get('/', (req, res) => {
  Item.find()
    .then(items => res.render('index', { items }))
    .catch(err => res.status(404).json({ msg: 'No items found' }));
});

app.post('/item/add', (req, res) => {
  const newItem = new Item({
    name: req.body.name
  });

  newItem.save().then(item => res.redirect('/'));
});


【问题讨论】:

  • 问题是什么?错误在哪里?
  • 鲜为人知的事实,ping 是 suid,需要特殊的网络能力,是一个真正的 pita 用于 docker。出于这个原因,我避免在 docker 中执行 ping 操作。
  • 这可能是因为在 node-app 尝试连接之前您的 mongo 尚未启动,这将导致ECONNREFUSED。当您尝试从node-app ping 到mongo 时,它不起作用,因为您的node-app 在容器内没有ping。所以尝试运行docker restart node-app
  • @ToanQuocHo 它不起作用,我认为主要问题出在配置文件中,但是我找不到它。我的观点是在两个服务之间创建类似桥梁以建立它们的连接。

标签: node.js mongodb docker docker-compose


【解决方案1】:

首先exec容器并检查是否可以ping另一个容器

docker exec -i -t 665b4a1e17b6 bash

然后在该容器中 ping 另一个服务的 IP 地址

ping 35.158.153.133

如果 ping 不起作用,你必须安装它,使用这个 link 他们已经在讨论它了。

如果您的 ping 正常,那么您知道您可以联系其他服务。然后您就可以开始对您的服务进行故障排除了。

【讨论】:

    【解决方案2】:

    我只是找到了答案。 mongo 容器没有 ping。所以我进入这个容器并做了apt updateapt install iputils-ping。然后我能够从双方ping 容器。

    【讨论】:

      猜你喜欢
      • 2019-10-29
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 2020-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-04
      相关资源
      最近更新 更多