docker-machine中的端口转发?

时间:2015-08-24 04:41:43

标签: docker boot2docker docker-machine

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

boot2docker ssh -L 27017:localhost:27017

只要SSH连接打开,这就会将端口27017从VirtualBox转发到localhost 27017。请注意,我不是在寻找一种在VirtualBox中永久打开端口的方法。如何使用docker-machine实现此目的?

6 个答案:

答案 0 :(得分:44)

您仍然可以从docker machine使用的VirtualBox访问VBoxmanage.exe命令:

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

请参阅this answer中的实际示例。

这是当前的解决方法,等待将参数传递给docker-machine ssh的可能性:请参阅issue 691

另一种解决方法是转发端口,并直接使用VM的IP:

 $(docker-machine ip default)

commented作为sdc

  

您可以使用

确认端口转发设置正确
 VBoxManage showvminfo boot2docker-vm | grep "NIC.* Rule" 

答案 1 :(得分:26)

使用最新版本的机器,您可以简单地执行(其中默认是机器的名称):

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

这是比VM配置更改更临时的解决方案。

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

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

答案 2 :(得分:17)

您可以ssh进入计算机并传递常规端口转发参数:

echo

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

答案 3 :(得分:8)

由于我很难记住如何执行此操作,因此我创建了一个名为pf的小型bash脚本(代表“port forward”),允许您执行此操作:

var filterResolve = function() {
  var defer = $.Deferred(),
    filtered = defer.then(function( value ) {
      return value * 2;
    });

  defer.resolve( 5 );

  filtered.done(function( value ) {
    $( "p" ).html( "Value is ( 2*5 = ) 10: " + value );
  });
};

这会将docker端口8080转发到后台的主机端口8080(附加var filterResolve = function() { var defer = $.Deferred(), filtered = defer.then(function( value ) { return value * 2; }); filtered.done(function( value ) { $( "p" ).html( "Value is ( 2*5 = ) 10: " + value ); }); defer.resolve( 5 ); }; 以使其在前台运行)。要使用不同的主机端口,请执行以下操作:

$ pf 8080

将主机端口8090映射到8080.

要停止端口转发,请添加-f

$ pf 8090:8080

(实际上主机端口也足够了:-s)。还有其他选项可用,请查看github页面。

答案 4 :(得分:3)

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

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

答案 5 :(得分:1)

只是为了增强脚本@VonC的答案 - 目前如果在MacOS X上使用Docker Toolbox,默认的VM机器是"默认"。因此,映射容器中所有暴露的脚本应如下所示:

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

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

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

在脚本中,它假定您已经将端口从容器移植到VM。

docker port cassandra

输出如下:

7000/tcp -> 0.0.0.0:7000