Docker Boot2Docker与VirtualBox端口转发怎么做?

我们在使用Win系统中使用Docker,除了之前分享的文件夹映射以配合容器的目录挂载, 另外一个经常需要处理的就是端口映射。其本质是Docker主机(BOOT2DOCKER那个系统)与VirtualBox所在宿主机的端口映射设置。

为什么要做docker2boot系统与其宿主机之间的端口转发?

如果您已经对于标题中的问题已经了然于胸,迫不及待要设置。那么,直接跳到下一段吧。

我们都知道,容器中的服务通常都会与其宿主机实现内网的端口映射。这样,我们可以通过doker容器所在主机的IP或者本机localhost实现容器内服务的访问。例如HTTP服务,http://localhost:80就可以放到我们在容器中的nginx服务器。

我们在WIN中使用的Docker时,容器的宿主机并非PC的Windows系统,而是Virtual Box中的boot2docker镜像系统。那么,问题来了!我们必须实现多一层的端口转发。否则,我们是无法实现WINDOWS中直接通过设定端口去访问容器中对应端口服务的。

现在问题有了,分析了问题,答案也浮出水面啦。由于我一直使用的toolbox,并非docker for Windows。 除非DFW软件把端口转发封装出GUI给用户,否则以下方法也是通用的。

端口转发方法:Windows系统连通容器

废话说了一箩筐,我们动手试试以下三个方法来设置需要的端口转发吧。

直接通过boot2docker虚拟IP访问


#获取boot2docker IP
echo $(docker-machine ip default) #default是可以省略的,因为是参数默认值

好了!我们可以通过Virtual Box的IP来直接访问容器上开放的端口啦。当然,前提是你运行容器的时候已经指定了宿主机(virtualbox虚拟机)和容器之间的端口映射。例如:


docker run -rm -it -p 80:80 lnmp #主要就-p参数啦

不要着急!在实际应用开发中,这个做法是相对比较少的。特别是对于MEAN架构的应用中。如果我们不做任何转发,Express中往往需要加入CROS中间件来达到跨域/IP请求。所以,还是继续往下看吧!

通过docker-machine执行临时性端口映射

docker-machine ssh default -f -N -L 27017:localhost:27017
  • “-L”:表示端口转发,后面接的是参数是BOOT2DOCKER的IP,而后面的localhost:27017是宿主机的IP和端口。更多详见DockerMachine SSH
  • “-f”:表示让SSH在后台运行。
  • “-N”: 用于取代指定登录的SHELL,只是执行一条空命令,也就是后续的端口转发。更多SSH选项请输入”docker-machine ssh –help

这个方法是临时性的。下面我们介绍通过宿主机上的Virtual Box来进行永久性绑定。Github上有一个封装了该方法的bash脚本,详见docker-machine-port-forwarder.

VirtualBox设定永久性端口映射绑定 – NAT

如果你喜欢,你大可以使用Virtual Box的GUI界面来操作端口绑定。我们这里介绍通过命令行的方式哈。

Docker虚拟主机正在运行


VBoxManage controlvm "default" --natpf1 "tcp-port80,tcp,,80,,8000"

关于natpf1参数具体的含义我不一一列举啦,有兴趣的同学可以执行’VBoxManage –help。其他的几个参数值说明如下;

  • default: 就是虚拟机名称,通过docker-machine active或者ls查看
  • “tcp-port80,tcp,,80,,8000′: 前面2个NAT记录的标识,名称有含义便于主机辨识即可。80是宿主机端口,8000是default的端口。

虚拟机未启动


docker-machine stop default
VBoxManage modifyvm "default" --natpf1 "tcp-port80,tcp,,80,,8000"
docker-machine start default
eval $(docker-machine env default)

区别仅仅在于传入VBoxManage软件的第一个参数,这里改成modifyvm,之前的是controlvm。其他无异!