很多同学在自己机器上玩开发的时候,都会用到VMWare
、VirtualBox
之类的虚拟OS容器装一个带GUI
的Linux OS
,然后在里面另外安装开发工具做开发。这里面遇到的最经典问题,就是比如我在虚拟机里面起了个MySQL
、Redis
之类的服务,如果DB的客户端/GUI工具是放在主机里面,不在虚拟机里,那怎么连进去?这个问题,本文提供一种解决方案。
本文采取的虚拟机环境如下:
- 主机:Win11
- 虚拟机容器:VMWare Workstation 16
- 虚拟机:Ubuntu 22.04
首先需要了解到,VMWare
场景下,我们通常用NAT
模式新开一个网段来管理虚拟机的网络配置,而虚拟机内部,假设使用IPV4
,会默认采取DHCP
机制,自动设置一个IP
跟相应的网络配置。相关资料可以看这几篇文档:
- 网络中的NAT模式
- DHCP百度百科
而为了让我们主机能连到虚拟机内部,实际上是满足下面两个条件之一即可:
- 主机知道虚拟机的IP,能够直连虚拟机IP
- 主机端口和某个IP的虚拟机端口存在转发映射关系
在本文的场景下,解决方案是第二种。具体配置如下:
首先,在VMWare
的编辑
菜单打开虚拟网络编辑器
,选中用于管理你虚拟机网络的一组虚拟网络(比如是NAT模式
,名字是VMnet8
这种)。如果你不确定你的虚拟机是不是NAT模式
,可以在虚拟机自己的设置里查看硬件 -> 网络适配器
项目,看是不是NAT模式
。
选中NAT模式
虚拟网络配置之后,点击NAT设置
按钮,即可进入到端口转发映射设置。
在其中,我们可以看到NAT
网络的子网IP
、子网掩码
跟网关IP
,这些信息都会在后续的虚拟机内部设置里用上,而再下面的端口转发
部分,就是需要我们手动配置的内容。其中包括几项:
- 虚拟机IP地址:虚拟机的IP+端口
- 类型:TCP/UDP,标识什么类型的数据包会被转发
- 主机端口:选定一个主机端口,这样发到主机端口的指定
类型
的数据包会被转发到对应虚拟机IP地址
比如虚拟机里面MySQL
开在3306
端口,那么虚拟机IP地址
一项就填虚拟机IP:3306
,类型填TCP
,主机端口填一个自己喜欢的即可。
那么这里就遗留另外一个问题:虚拟机IP怎么填?这里的话,以Ubuntu
为例,由于默认是用DHCP
机制分配IP,因此IP可能不是固定的。所以我们要做的是,在虚拟机中去设置固定一个IP,然后把这个IP回填到虚拟机IP地址
一项当中。
在此之前,首先回到VMWare
的虚拟网络编辑器
当中,选中刚才NAT
的一组虚拟网络,点击DHCP
设置按钮,我们可以看到网络的配置跟DHCP
的分配地址:
这里我们只需要记住的信息是起始IP地址
跟结束IP地址
。我们后面设置虚拟机固定的IP地址时,需要在这个范围之内。
然后进入虚拟机,以笔者用的Ubuntu 22.04
为例,右上角开关按钮
点击下拉Settings
一栏,选择Network
页签,然后选中当前连接到的网络点设置图标
进入设置界面。
由于先前设置的网络IP都是IPV4
的,因此在网络选项当中,选中IPV4
页签,即可开始编辑。编辑的内容如下所示:
这里需要编辑几个点:
IPV4 Method
:选择Manual
,表示手动配置Addresses
:地址,这里新建一行Address
:网段分配的IP地址,也就是我们所要设置的虚拟机固定IP
,参考上面DHCP设置
里的网段范围自选一个Netmask
:子网掩码,在上面NAT设置
当中有相关信息Gateway
:网关IP,在上面NAT设置
当中有相关信息
DNS
:DNS的IP,这个场景填写跟Gateway
一样的即可
弄好之后Apply
,然后重启虚拟机,就可以试试看行不行了。注意,主机一边,需要发请求到先前端口转发
设置里的主机端口
,才能够生效!