docker-机器中的端口转发?

Port forwarding in docker-machine?

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

boot2docker ssh -L 27017:localhost:27017

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

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

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

参见 中的实际示例。


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

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

 $(docker-machine ip default)

作为 by sdc:

You can confirm that port forwarding is set up correctly with

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

您可以通过 ssh 进入机器并传递常规端口转发参数:

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

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

如果您不想使用密码,我想补充一点,您只需指向私钥即可。

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

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

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

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

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

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

只是为了在脚本中增强@VonC 的回答——目前如果在 MacOS X 上使用 Docker 工具箱,默认的 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

如果多次尝试执行,需要在创建前添加一条删除已有规则的语句:

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

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

docker port cassandra

给出如下输出:

7000/tcp -> 0.0.0.0:7000

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

$ pf 8080

这将在后台将 docker 端口 8080 转发到主机端口 8080(附加 -f 使其在前台 运行)。要使用不同的主机端口,只需执行以下操作:

$ pf 8090:8080

它将主机端口 8090 映射到 8080。

要停止端口转发添加-s:

$ pf 8090:8080 -s

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