我很难尝试在使用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"
}
答案 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)