Docker – 无法连接到正在运行的图像
在我开始解释我的错误之前,让我说我是一个Windows用户,并没有很多使用Unix命令的经验。 因此,每个步骤都使用Docker快速入门terminal (MINGW64)完成。
这是几个星期前我第一次听到docker,并认为使用它的节点/快递网站。 所以我在Synology服务器上安装了Docker软件包。
完成网站后,我做了以下几点:
- 我按照这个网站上的说明: https : //docs.docker.com/windows/step_one/直到最后一步,一切正常(包括
docker run hello-world
)
- 然后是“Dockerizing一个Node.js的Web应用程序” : https : //docs.docker.com/engine/examples/nodejs_web_app/
文件层次结构
src(C:….. \ projectname)
– 资产(文件夹)
– 控制器(文件夹)
– 公共(文件夹)
–src(文件夹)
–util(文件夹)
– 浏览(文件夹)
–node_modules(文件夹)
–bin(文件夹)
—- www(文件,不扩展)
–app.js(文件)
–Dockerfile(文件,不扩展)
–package.json(文件)
至于内容: www :
#!/usr/bin/env node /** * Module dependencies. */ var app = require('../app'); var debug = require('debug')('projectname:server'); var http = require('http'); /** * Get port from environment and store in Express. */ var port = normalizePort(process.env.PORT || '3000'); app.set('port', port); /** * Create HTTP server. */ var server = http.createServer(app); /** * Listen on provided port, on all network interfaces. */ server.listen(port); server.on('error', onError); server.on('listening', onListening); /** * Normalize a port into a number, string, or false. */ function normalizePort(val) { var port = parseInt(val, 10); if (isNaN(port)) { // named pipe return val; } if (port >= 0) { // port number return port; } return false; } /** * Event listener for HTTP server "error" event. */ function onError(error) { if (error.syscall !== 'listen') { throw error; } var bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port; // handle specific listen errors with friendly messages switch (error.code) { case 'EACCES': console.error(bind + ' requires elevated privileges'); process.exit(1); break; case 'EADDRINUSE': console.error(bind + ' is already in use'); process.exit(1); break; default: throw error; } } /** * Event listener for HTTP server "listening" event. */ function onListening() { var addr = server.address(); var bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port; debug('Listening on ' + bind); }
app.js :
var express = require('express'); var path = require('path'); var favicon = require('serve-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var app = express(); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); app.use(require('./controllers')); }; // catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); // error handlers // development error handler // will print stacktrace if (app.get('env') === 'development') { app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: err }); }); } // production error handler // no stacktraces leaked to user app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: {} }); }); module.exports = app;
package.json :
{ "name": "projectname", "version": "0.0.0", "private": true, "scripts": { "start": "node ./bin/www" }, "dependencies": { "bcrypt-nodejs": "0.0.3", "body-parser": "~1.13.2", "bookshelf": "^0.9.2", "cookie-parser": "~1.3.5", "debug": "~2.2.0", "express": "~4.13.1", "express-session": "^1.13.0", "i18n": "^0.8.0", "jade": "~1.11.0", "knex": "^0.10.0", "morgan": "~1.6.1", "mysql": "^2.10.2", "passport": "^0.3.2", "passport-local": "^1.0.0", "serve-favicon": "~2.3.0" }, "devDependencies": { "autoprefixer": "^6.3.3", "browserify": "^13.0.0", "connect-livereload": "^0.5.4", "grunt": "^0.4.5", "grunt-browserify": "^4.0.1", "grunt-contrib-cssmin": "^0.14.0", "grunt-contrib-sass": "^0.9.2", "grunt-contrib-uglify": "^0.11.1", "grunt-contrib-watch": "^0.6.1", "grunt-postcss": "^0.7.2" } }
正如你可以在package.json和www(由express generator命令生成的)中看到的那样,我必须编写npm start
来运行节点/ express服务器。
Dockerfile :
FROM centos:centos6 RUN yum install -y epel-release RUN yum install -y nodejs npm COPY package.json /projectname/package.json RUN cd /projectname; npm install --production COPY . /projectname EXPOSE 8080 CMD ["npm", "start"]
-
在成功构build
docker build -t username/projectname .
我确实得到了一个安全警告 :成功build成5ed562273b56
安全警告:您正在从Windows构build一个针对非Windows Docker主机的Docker镜像。 添加到构build上下文的所有文件和目录将具有“-rwxr-xr-x”权限。 build议仔细检查并重置敏感文件和目录的权限。
除此之外,没有错误抛出,所以我跑的形象: docker run -p 49160:8080 -d username/projectname
。 之后,我得到一个长的哈希string
de297db51ab6fb3f842abb58267c1e189d2b9de51715a619a2f5431e868dc54f
- 仍然遵循https://docs.docker.com/engine/examples/nodejs_web_app/上的原则。 为了testing这个图像,我使用
docker ps
列出了容器id ,
CONTAINER ID | 图像| 命令| CREATED | STATUS | 港口| 名字
所以完全空了! 没有什么,除了表头…但是当我使用链接中提供的代码,并build立他们的形象,它给了我一个结果(如文中所述):
CONTAINER ID | 图像| 命令| CREATED | STATUS | 港口| 名字
26d3ac309d81 | 用户名/ centos-node-testing | “node /src/index.js”| 35分钟前| 最多35分钟| 0.0.0.0:49160-> 8080/tcp | gigantic_ritchie
- 可以肯定的是,我尝试使用curl-command来调用应用程序:
curl -i 192.168.99.100:49160
。 不幸的是,给了我一个错误:
curl:(7)无法连接到192.168.99.100端口49160:连接被拒绝
ip地址使用docker-machine ip
命令检索。
-
作为最后的手段,有人build议使用下面的命令
docker run username/projectname
来运行应用程序。 但是,这给了我一个错误:npm ERR! 错误:ENOENT,打开“/package.json”
npm ERR! 如果您需要帮助,您可以通过以下url报告此日志:
npm ERR! http://github.com/isaacs/npm/issues
npm ERR! 或者发邮件给:
npm ERR!
npm ERR! 系统Linux 4.1.19-boot2docker
npm ERR! 命令“节点”“/ usr / bin / npm”“开始”
npm ERR! cwd /
npm ERR! node -v v0.10.42
npm ERR! npm -v 1.3.6
npm ERR! path/package.json
npm ERR! 代码ENOENT
npm ERR! errno 34
npm ERR!
npm ERR! 其他日志logging详细信息可以在
npm ERR! /npm-debug.log
npm ERR! 不好的代码0
任何想法可能会导致这一点?
您的容器不存在,因为您提供的命令(上面的CMD
)正在返回一个非零的退出状态,并且容器由于失败而被销毁。 在你的Dockerfile中,让我们来尝试一下下面的东西,它应该确保npm start
是从你的项目根目录下运行的:
FROM centos:centos6 RUN yum install -y epel-release RUN yum install -y nodejs npm COPY package.json /projectname/package.json # Set the working directory WORKDIR /projectname RUN npm install --production COPY . /projectname EXPOSE 8080 CMD ["npm", "start"]
此外,如果您使用docker run -it username/projectname /bin/bash
,将来可能会对容器进行故障排除。