2

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

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

我无法做的是从我的机器访问节点应用程序 - 理论上我相信我应该能够看到我的“hello world”风格的节点/快速应用程序localhost:8181......

以下是我到目前为止的内容:

流浪文件:

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 indexlocalhost: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);

包.json:

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

3 回答 3

2

我实际上遇到了同样的问题。不确定它是预期的行为还是错误,但forwarded_port在带有 Docker 提供程序的 Vagrantfile 中进行设置在主机 boot2docker 机器上没有任何作用。

除非我遗漏了什么,否则您必须为您自己的主机提供另一个打开正确端口的 Vagrantfile,或者修改 Vagrant 提供的那个。


方法一:提供自己的宿主机(基于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 应用程序之间使用单独的 Vagrantfile 共享这台机器,你必须指向同一个主机 Vagrantfile(否则它会尝试启动新的主机虚拟机) .


方法二:更新 Vagrant 的宿主机

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

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


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

于 2014-05-20T09:50:36.137 回答
0

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

    config.vm.network “forwarded_port”,来宾:5000,主机:8181

(例如,让您的应用程序可以从您的主机浏览器在端口 8181 上访问)

代替:

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



流/重定向摘要:

Docker 容器 Vagrant VM 你的电脑
 :8080 => :5000 => :8181

于 2014-05-13T17:21:42.580 回答
0
  1. 你的主机操作系统是什么(你执行“vagrant”命令的那个)?如果它是非 Linux(例如 OSX 或 Windows),那么您的 Docker 容器将运行在 Linux VM 之上(通常是 VirtualBox 中的 TinyCore Linux),并且端口转发将从该 VirtualBox 内部完成到 Docker 容器中。
  2. 您应该通过使用“netstat -tlpn”(Linux 上)或“netstat -an”(OSX 上)查找侦听 TCP 套接字来查看端口转发生效的证据
于 2014-12-13T02:43:58.040 回答