VirtualBox端口转发阻止主机上的端口绑定

时间:2018-04-11 15:04:54

标签: docker virtualbox portforwarding

我有一个在Docker容器中运行的NodeJS服务器。我正在使用Docker Toolbox,因此我有一个VirtualBox VM,我正在运行我的容器。我的服务器需要使用dgram websocket绑定到主机上的0.0.0.0:3000并监听那里的数据包,所以我在VirtualBox中设置了3000-> 3000的端口转发。

问题是,当我尝试在主机上运行应该将数据发布到端口3000的应用程序时,它们无法绑定到端口。

我得到的错误是:

{ Error: bind EACCES 0.0.0.0:3000
    at Object.exports._errnoException (util.js:1020:11)
    at exports._exceptionWithHostPort (util.js:1043:20)
    at _handle.lookup (dgram.js:219:18)
    at _combinedTickCallback (internal/process/next_tick.js:83:11)
    at process._tickCallback (internal/process/next_tick.js:104:9)
    at Module.runMain (module.js:606:11)
    at run (bootstrap_node.js:389:7)
    at startup (bootstrap_node.js:149:9)
    at bootstrap_node.js:504:3
  code: 'EACCES',
  errno: 'EACCES',
  syscall: 'bind',
  address: '0.0.0.0',
  port: 3000 }

如果我关闭VM并在容器外部运行我的服务器,一切正常。

我已经设置了我的服务器,因此它没有独占绑定集,并且在创建websocket时,reuseAddr设置为true。这就是为什么当我在容器外面运行时没有绑定问题。

我的问题是:VirtualBox中的端口转发是否对转发端口进行某种独占绑定?如果是这样,可以禁用吗?如果发生这种情况,如何在容器中运行我的服务器?

更新: 我发现只有当我将VirtualBox设置为使用UDP转发时才会发生这种情况。 TCP不会导致问题。有没有办法进行UDP端口转发,仍然可以进行端口绑定?

0 个答案:

没有答案