我有一个在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端口转发,仍然可以进行端口绑定?