由于boot2docker
已被弃用,我已切换到docker-machine
,但我不知道如何从docker-machine
打开端口。在boot2docker
我可以这样做:
boot2docker ssh -L 27017:localhost:27017
只要SSH连接打开,这就会将端口27017从VirtualBox转发到localhost 27017。请注意,我不是在寻找一种在VirtualBox中永久打开端口的方法。如何使用docker-machine
实现此目的?
答案 0 :(得分:44)
您仍然可以从docker machine使用的VirtualBox访问VBoxmanage.exe命令:
VBoxManage controlvm "boot2docker-vm" natpf1 "tcp-port27017,tcp,,27017,,27017";
docker-machine info
获取您的虚拟机的名称。modifyvm
。请参阅this answer中的实际示例。
这是当前的解决方法,等待将参数传递给docker-machine ssh
的可能性:请参阅issue 691。
另一种解决方法是不转发端口,并直接使用VM的IP:
$(docker-machine ip default)
您可以使用
确认端口转发设置正确
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
答案 2 :(得分:17)
答案 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