我在尝试使一个简单的节点应用程序在使用vagrant托管的docker容器中运行时遇到困难。

本页说明了基本方法:https://www.vagrantup.com/blog/feature-preview-vagrant-1-6-docker-dev-environments.html

我无法做的是从机器上访问节点应用程序-从理论上讲,我相信我应该能够在localhost:8181上看到我的“hello world”风格的节点/表达应用程序...

以下是我到目前为止的内容:

Vagrantfile:

Vagrant.configure("2") do |config|

  config.vm.provider "docker" do |d|

    d.build_dir = "."

    d.ports = ["8080:5000"]

    # Is this necessary if EXPOSE is used in Dockerfile?
    d.expose = ["5000"]

    d.remains_running = true

    d.volumes = ["/shared"]

  end

  config.vm.network "forwarded_port", guest: 8080, host: 8181

  config.vm.synced_folder "~/Documents/shared", "/shared"

end

Dockerfile:
# DOCKER-VERSION 0.8.0

FROM centos:6.4

RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm

RUN yum install -y npm ImageMagick

ADD . /app

# Not necessary because node_modules are bundled
# RUN cd /app; npm install

EXPOSE 5000

CMD ["node", "/app/index.js"]

我已尽可能地遵循文档,但似乎无法实现我所追求的目标。有任何想法吗?

注意:节点应用程序在正常运行时即正常运行,即$ node index并通过localhost:5000访问

提前致谢

编辑:

index.js:
var express = require('express'),
    http = require('http');

var app = express();

var port = 5000;

app.get('/', function(req, res) {
    res.send('Hello World');
});

var server = http.createServer(app);

server.on('listening', function() {
    console.log('Express server listening on port ' + port);
});

server.listen(port, '0.0.0.0');

setInterval(function(){
    console.log('running');
}, 5000);

package.json:
{
  "name": "vagrant-docker-node",
  "version": "0.0.0",
  "dependencies": {
    "express": "^4.1.0"
  },
  "main": "index.js"
}

最佳答案

我实际上遇到了同样的问题。不知道这是预期的行为还是错误,但是使用Docker提供程序在Vagrantfile中设置forwarded_port在主机boot2docker计算机上没有任何作用。

除非我缺少任何东西,否则您必须为自己的主机提供另一个Vagrantfile,以打开正确的端口,或者修改Vagrant提供的端口。

方法1:提供您自己的主机(基于boot2docker)

这是boot2docker主机的基本Vagrantfile:boot2docker Vagrantfile。您需要编辑此Vagrantfile的副本,并在此处设置转发的端口。

然后,在您的Docker应用Vagrantfile中,进行如下修改:

config.vm.provider "docker" do |d|
  # Specify here the path to the updated host Vagrantfile
  d.vagrant_vagrantfile = "../boot2docker/Vagrantfile"

  ... # edited out for clarity
end

确保您指向更新的主机。在这里,我将其设置为较高级别的共享目录,因为如果要在具有单独Vagrantfiles的多个Docker应用之间共享此计算机,则必须指向同一主机Vagrantfile(否则它将尝试启动新的主机VM) 。

方法2:更新Vagrant的主机

您也可以更新位于%VAGRANT_HOME%/data/docker-host/Vagrantfile中的Vagrant自动使用的Vagrant文​​件。修改文件以打开端口。

然后执行vagrant global-status获取主机的ID,并执行vagrant reload machineId重新启动计算机,这将触发端口重新打开和更新。

我不确定是否有更好的方法或批准的方法可以做到这一点,但这是我可以将端口从Docker容器一直转发到物理机的唯一方法。

关于node.js - Vagrantfile/Dockerfile运行 Node 应用程序的简单示例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23626360/

10-12 23:46