You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Ubuntu的VirtualBox中运行Docker,能否绕过端口转发实现公网80端口访问?

嗨,我来帮你搞定这两个Docker+VirtualBox的网络问题,直接上实用方案:

问题1:绕过VirtualBox端口转发,让外部通过[server-ip]:80访问

当然可以绕过端口转发!核心是把VirtualBox虚拟机的网络模式改成桥接模式(Bridge Adapter),这样你的docker-machine虚拟机就能直接接入宿主机所在的局域网,获取和宿主机同网段的独立IP,外部设备就能直接通过这个IP访问容器服务了,步骤如下:

  • 打开VirtualBox,选中你的docker-machine虚拟机(默认名字一般是default)
  • 右键选择「设置」→ 切换到「网络」标签页
  • 在「网卡1」里,把「连接方式」改成「桥接适配器」,然后在「名称」下拉框里选择宿主机正在使用的网卡(比如你用有线网就选以太网卡,无线网就选对应的无线网卡)
  • 点击「确定」后,重启虚拟机:docker-machine restart <machine-name>
  • 重启后,用docker-machine ip <machine-name>查看虚拟机的新IP,这个IP和你的宿主机在同一网段
  • 启动容器时直接映射80端口:docker run -d -p 80:80 <your-image>
  • 现在,同一局域网内的设备就能直接用[虚拟机IP]:80访问你的服务了,如果宿主机本身有公网IP,外部互联网也能通过宿主机公网IP访问(前提是宿主机防火墙开放了80端口)
问题2:实现用localhost连接docker-machine IP的效果

你在教程里看到的效果,本质是把docker-machine虚拟机上的端口转发到本地的localhost,常用的两种方法:

方法1:用docker-machine自带的SSH隧道

直接运行这条命令,把本地localhost的80端口转发到docker-machine的80端口:

docker-machine ssh <machine-name> -L 80:localhost:80

运行后保持终端窗口打开,此时你在本地访问localhost:80,就相当于访问docker-machine虚拟机上的80端口了。

方法2:配置Docker客户端直接连接远程daemon(进阶)

如果你想让本地的Docker命令直接操作docker-machine里的容器,同时服务也能通过localhost访问,可以先配置环境变量:

eval $(docker-machine env <machine-name>)

这会让你的本地Docker客户端连接到docker-machine的Docker daemon,之后你启动容器时映射端口到localhost其实就是映射到docker-machine的IP,不过要实现本地localhost访问,还是需要配合端口转发(方法1),或者直接用docker run -p 127.0.0.1:80:80 <your-image>,然后通过SSH隧道转发。

另外补充一点:如果是在Linux宿主机上用VirtualBox,其实还有更简单的方式——直接把Docker装在宿主机上,不用docker-machine,这样容器端口直接绑定宿主机IP,外部就能直接访问了,省掉虚拟机的网络麻烦。

内容的提问来源于stack exchange,提问作者creampiedonut

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:18:03