背景:当我需要快速的验证2个虚拟机之间的通信协议时,为了搭建这个开发环境,其实需要virtualbox 自己装vm,而有了vagrant,可以快速搭建开发环境。

我在deepseek中的问题:

vagrant 如何同时启动2个虚拟机,而且这2个虚拟机可以访问互联网,而且这2个虚拟机之间可以通过内网通信,如何编写vagrant文件

deekseek的回答:

要通过 Vagrant 同时启动 2 个虚拟机,并满足以下条件:
1. 两个虚拟机都可以访问互联网。
2. 两个虚拟机之间可以通过内网通信。

你可以通过编写 `Vagrantfile` 来实现这一需求。以下是具体的步骤和示例代码:

---

### **步骤 1:安装 Vagrant 和 VirtualBox**
确保你已经安装了 Vagrant 和 VirtualBox。

---

### **步骤 2:编写 Vagrantfile**
在项目目录中创建一个 `Vagrantfile` 文件,并编写以下内容:

```ruby
Vagrant.configure("2") do |config|
# 定义第一个虚拟机
config.vm.define "vm1" do |vm1|
vm1.vm.box = "generic/ubuntu2404" # 使用 Ubuntu 24.04 镜像
vm1.vm.hostname = "vm1" # 设置主机名
vm1.vm.network "private_network", ip: "192.168.56.10" # 设置内网 IP
vm1.vm.provider "virtualbox" do |vb|
vb.memory = "1024" # 分配 1GB 内存
vb.cpus = 1 # 分配 1 个 CPU 核心
end
end

# 定义第二个虚拟机
config.vm.define "vm2" do |vm2|
vm2.vm.box = "generic/ubuntu2404" # 使用 Ubuntu 24.04 镜像
vm2.vm.hostname = "vm2" # 设置主机名
vm2.vm.network "private_network", ip: "192.168.56.20" # 设置内网 IP
vm2.vm.provider "virtualbox" do |vb|
vb.memory = "1024" # 分配 1GB 内存
vb.cpus = 1 # 分配 1 个 CPU 核心
end
end
end
```

---

### **步骤 3:启动虚拟机**
在终端中运行以下命令启动虚拟机:
```bash
vagrant up
```
Vagrant 会自动下载镜像(如果尚未下载),并启动两个虚拟机。

---

### **步骤 4:验证网络配置**
1. **访问互联网**:
- 默认情况下,Vagrant 虚拟机会通过 NAT 网络访问互联网。
- 你可以登录虚拟机并运行以下命令测试互联网连接:
```bash
ping google.com
```

2. **内网通信**:
- 两个虚拟机通过 `private_network` 配置了内网 IP(`192.168.56.10` 和 `192.168.56.20`)。
- 登录 `vm1`,运行以下命令测试与 `vm2` 的连接:
```bash
ping 192.168.56.20
```
- 登录 `vm2`,运行以下命令测试与 `vm1` 的连接:
```bash
ping 192.168.56.10
```

---

### **步骤 5:登录虚拟机**
1. 登录 `vm1`:
```bash
vagrant ssh vm1
```

2. 登录 `vm2`:
```bash
vagrant ssh vm2
```

---

### **Vagrantfile 配置详解**
1. **虚拟机定义**:
- 使用 `config.vm.define` 定义多个虚拟机(如 `vm1` 和 `vm2`)。
- 每个虚拟机可以独立配置资源(如内存、CPU)和网络。

2. **网络配置**:
- **NAT 网络**:默认情况下,Vagrant 虚拟机会通过 NAT 网络访问互联网。
- **私有网络**:通过 `private_network` 配置内网 IP,使虚拟机之间可以通信。

3. **资源分配**:
- 使用 `vm.vm.provider` 配置虚拟机的资源(如内存、CPU)。

---

### **扩展:使用公有网络(可选)**
如果你希望虚拟机通过公有网络访问互联网(例如,分配一个桥接网络 IP),可以修改 `Vagrantfile`:

```ruby
Vagrant.configure("2") do |config|
config.vm.define "vm1" do |vm1|
vm1.vm.box = "generic/ubuntu2404"
vm1.vm.hostname = "vm1"
vm1.vm.network "private_network", ip: "192.168.56.10"
vm1.vm.network "public_network" # 启用桥接网络
vm1.vm.provider "virtualbox" do |vb|
vb.memory = "1024"
vb.cpus = 1
end
end

config.vm.define "vm2" do |vm2|
vm2.vm.box = "generic/ubuntu2404"
vm2.vm.hostname = "vm2"
vm2.vm.network "private_network", ip: "192.168.56.20"
vm2.vm.network "public_network" # 启用桥接网络
vm2.vm.provider "virtualbox" do |vb|
vb.memory = "1024"
vb.cpus = 1
end
end
end
```

在启动虚拟机时,Vagrant 会提示你选择桥接的网络接口(如 Wi-Fi 或以太网)。

---

### **总结**
通过以上配置,你可以:
1. 同时启动多个虚拟机。
2. 让虚拟机访问互联网。
3. 实现虚拟机之间的内网通信。

`Vagrantfile` 的灵活性使得你可以轻松扩展和定制虚拟机的配置,满足不同的开发需求。

 

【试验结果】经过我的验证,deepseek的回复是正确的。

 

posted on 2025-02-15 23:43  七连长  阅读(72)  评论(0)    收藏  举报