2014-05-13 90 views
2

我很難嘗試使用vagrant託管的Docker容器中運行簡單的節點應用程序。運行節點應用程序的Vagrantfile/Dockerfile的簡單示例

此頁介紹的基本方法:https://www.vagrantup.com/blog/feature-preview-vagrant-1-6-docker-dev-environments.html

什麼我不能做的就是從我的計算機訪問節點的應用程序 - 在理論上我相信我應該能夠看到我的「Hello World」式的節點/快遞應用在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 

Dockerf ile:

# 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"] 

我已經按照儘可能接近的文檔,但似乎無法實現我所追求的。有任何想法嗎?

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

注:正常運行,即$ node index,並提前在localhost:5000

感謝訪問

編輯在節點應用工作:

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

回答

2

我其實碰到了同樣的問題UE。不知道它是否是預期的行爲或錯誤,但在一個Vagrantfile中設置forwarded_port,而Docker提供程序在主機boot2docker機器上不做任何事情。

除非我遺漏了一些東西,否則您必須爲您的主機提供另一個Vagrantfile,以打開正確的端口或修改由Vagrant提供的端口。


方法1:提供你自己的主機(基於boot2docker)

這裏的基地Vagrantfile爲boot2docker主持人:boot2docker Vagrantfile。您需要編輯此Vagrantfile的副本並在此處設置轉發的端口。

然後,在你多克爾應用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(否則它將嘗試啓動新的主機VM) 。


方法2:更新流浪的主機

您也可以更新Vagrantfile由流浪,位於%VAGRANT_HOME%/data/docker-host/Vagrantfile自動使用。修改文件以打開您的端口。

然後做一個vagrant global-status獲取主機的ID和vagrant reload machineId重新啓動機器,這將觸發端口重新打開和更新。


我不確定是否有更好的或被認可的方法來做到這一點,但這是我可以將端口從Docker容器一路轉發到物理機器的唯一途徑。

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 

+0

感謝監聽TCP套接字生效,我已經嘗試了所有端口:(每個組合我都可以想出來,雖然我在任何地方都找不到任何新版本的例子, – homerjam

0
  1. 什麼是你的主機操作系統(你執行「vagrant」命令的那個)?如果它不是Linux(例如OSX或Windows),那麼Doc​​ker容器將在Linux VM(通常是VirtualBox中的TinyCore Linux)上運行,並且端口轉發將從該VirtualBox內部完成到Docker容器中。
  2. 您應該看到端口轉發的證據尋找使用「netstat的-tlpn」(在Linux上)或「netstat的-an」(在OSX)
相關問題