Docker – 无法连接到正在运行的图像

在我开始解释我的错误之前,让我说我是一个Windows用户,并没有很多使用Unix命令的经验。 因此,每个步骤都使用Docker快速入门terminal (MINGW64)完成。

这是几个星期前我第一次听到docker,并认为使用它的节点/快递网站。 所以我在Synology服务器上安装了Docker软件包。

完成网站后,我做了以下几点:

  1. 我按照这个网站上的说明: https : //docs.docker.com/windows/step_one/直到最后一步,一切正常(包括docker run hello-world

  1. 然后是“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"] 

  1. 在成功构builddocker 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


  1. 仍然遵循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


  1. 可以肯定的是,我尝试使用curl-command来调用应用程序: curl -i 192.168.99.100:49160 。 不幸的是,给了我一个错误:

curl:(7)无法连接到192.168.99.100端口49160:连接被拒绝

ip地址使用docker-machine ip命令检索。


  1. 作为最后的手段,有人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 ,将来可能会对容器进行故障排除。

Interesting Posts