【发布时间】: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-appping 到mongo时,它不起作用,因为您的node-app在容器内没有ping。所以尝试运行docker restart node-app。 -
@ToanQuocHo 它不起作用,我认为主要问题出在配置文件中,但是我找不到它。我的观点是在两个服务之间创建类似桥梁以建立它们的连接。
标签: node.js mongodb docker docker-compose