运行节点应用程序的Vagrantfile / Dockerfile的简单示例

时间:2014-05-13 08:36:12

标签: node.js vagrant docker vagrantfile

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

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

我无法做的是从我的机器访问节点应用程序 - 理论上我相信我应该能够在localhost:8181 ...

以下是我到目前为止:

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"
}

3 个答案:

答案 0 :(得分:2)

我实际上遇到了同样的问题。不确定它是否是预期的行为或错误,但在具有Docker提供程序的Vagrantfile中设置forwarded_port在主机boot2docker机器上什么都不做。

除非我遗漏了什么,否则您必须为自己的主机提供另一个打开正确端口的Vagrant文​​件或修改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自动使用的Vagrant文​​件,该文件位于%VAGRANT_HOME%/data/docker-host/Vagrantfile。修改文件以打开端口。

然后执行vagrant global-status获取主机ID,vagrant reload machineId重启机器,触发端口重新打开并更新。


我不确定是否有更好或更严格的方法来执行此操作,但这是我可以将端口从Docker容器一直转发到物理机的唯一方法。

答案 1 :(得分:0)

你不应该使用Vagrant将暴露的端口5000从Docker转发到你的主机吗?

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

(例如,通过主机浏览器在端口8181上访问您的应用程序)

而不是:

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



流/重定向摘要:

Docker container    Vagrant VM     Your computer
 :8080       =>     :5000    =>    :8181

答案 2 :(得分:0)

  1. 你的主机操作系统是什么(执行" vagrant"命令的操作系统)?如果它是非Linux(例如OSX或Windows),那么您的Docker容器将位于Linux VM(通常是VirtualBox内的TinyCore Linux)之上,并且端口转发将从VirtualBox内部转移到Docker中容器
  2. 您应该看到端口转发的证据通过使用" netstat -tlpn"查找侦听TCP套接字而生效。 (在Linux上)或" netstat -an" (在OSX上)