我在尝试使一个简单的节点应用程序在使用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/