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 页面。
由于 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)
作为
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 页面。