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

我很难试图获得一个简单的节点应用程序在托pipe使用stream浪者托pipe的容器内运行。

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

我无法做的是从我的机器访问节点应用程序 – 理论上我相信我应该能够看到我的“你好世界”风格的节点/expression应用程序在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" } 

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

除非我错过了一些东西,否则你必须为自己的主机提供另一个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 

确保你指向你更新的主机。 在这里,我将它设置为上层共享目录,因为如果你想在多个Docker应用程序之间使用单独的Vagrantfiles共享这台机器,你必须指向同一个主机Vagrantfile(否则它会尝试启动新的主机虚拟机) 。

方法2:更新stream浪者的主机

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

然后做一个vagrant global-status来获取主机的ID和vagrant reload machineId机器,重启机器,这将触发端口重新打开和更新。

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

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

     config.vm.network“forwarded_port”,guest: 5000 ,host: 8181

(例如,让您的应用程序从您的主机浏览器到端口8181)

代替:

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

stream程/redirect摘要:

 Docker容器Vagrant VM您的计算机
  :8080 =>:5000 =>:8181

  1. 什么是你的主机操作系统(你执行“vagrant”命令的那个)? 如果它不是Linux(例如OSX或Windows),那么Doc​​ker容器将在Linux VM(通常是VirtualBox中的TinyCore Linux)上运行,而端口转发将从该VirtualBox内部进入Docker容器。
  2. 通过使用“netstat -tlpn”(在Linux上)或“netstat -an”(在OSX上)来查看侦听的TCP套接字,您应该可以看到端口转发的证据。
Interesting Posts