docker机器中的端口转发?

由于boot2docker被弃用,我已经切换到docker-machine但我不知道如何从docker-machine打开一个端口。 在boot2docker我可以这样做:

 boot2docker ssh -L 27017:localhost:27017 

只要SSH连接处于打开状态,就会将端口27017从VirtualBox转发到本地主机27017。 请注意,我不想在VirtualBox中永久打开端口。 如何用docker-machine实现这个docker-machine

您仍然可以从Docker机器使用的VirtualBox访问VBoxmanage.exe命令:

 VBoxManage controlvm "boot2docker-vm" natpf1 "tcp-port27017,tcp,,27017,,27017"; 
  • 使用docker-machine info来获取您的虚拟docker-machine info的名称。
  • 如果vm尚未启动,请使用modifyvm

在这个答案中看到一个实际的例子。


这是目前的解决方法,等待将parameter passing给docker-machine ssh的可能性:请参阅问题691 。

另一个解决方法是转发端口,直接使用虚拟机的IP:

  $(docker-machine ip default) 

正如sdc 所说 :

您可以确认端口转发设置正确

  VBoxManage showvminfo boot2docker-vm | grep "NIC.* Rule" 

使用最新版本的机器,你可以简单地做( 默认是机器的名称):

 docker-machine ssh default -L 27017:localhost:27017 

这是比VMconfiguration更改更临时的解决scheme。

使用以下变化仅在后台进程中转发端口:

 docker-machine ssh default -f -N -L 27017:localhost:27017 
  • -f请求ssh在命令执行之前转到后台。
  • -N允许空命令(这里只用于转发端口)

你可以ssh进入机器并传递常规的端口转发参数:

 ssh docker@$(docker-machine ip default) -L 27017:localhost:27017 

docker用户的密码是tcuser 。 (请参阅https://github.com/boot2docker/boot2docker

由于我很难记住如何做到这一点,我创build了一个名为pf (代表“端口转发”)的小型bash脚本,它允许您执行:

 $ pf 8080 

这将在后台将Docker端口8080转发到主机端口8080(追加-f使其在前台运行)。 要使用不同的主机端口,只需:

 $ pf 8090:8080 

将主机端口8090映射到8080。

停止端口转发add -s

 $ pf 8090:8080 -s 

(实际上主机端口也是足够的: pf 8090 -s )。 还有其他的选项可用,所以检出github页面。

如果你不想使用密码,我想补充一点,你应该指向私钥。

 ssh -L 8080:localhost:8080 -i ~/.docker/machine/machines/default/id_rsa docker@$(docker-machine ip default) 

只需在脚本中增强@VonC的答案 – 目前如果在MacOS X上使用Docker Toolbox,默认的VM机器是“default”。 所以一个映射所有从容器中暴露的脚本应该是这样的:

 for port in `docker port cassandra | cut -d'-' -f1`; do port_num=`echo ${port} | cut -d'/' -f1` port_type=`echo ${port} | cut -d'/' -f2` echo "Create rule natpf1 for ${port_type} port ${port_num}" VBoxManage controlvm "default" natpf1 "${port_type}-port${port_num},${port_type},,${port_num},,${port_num}" done 

如果您尝试执行多次,则应添加创build之前的语句以删除现有规则:

 VBoxManage controlvm "default" natpf1 delete "${port_type}-port${port_num}" 

在脚本中,假设您已经将端口从容器转移到虚拟机。

 docker port cassandra 

给出如下输出:

 7000/tcp -> 0.0.0.0:7000