使用Vagrant搭建Ubuntu 24.04开发环境-docker

2 mins to read

文章主要讲述了如何通过vagrant搭建docker环境,可以快速搭建开发环境。但这个方案可能性能比较低,在某些场景下,不如wsl。

Vagrant介绍

大模型

创建虚拟机

前提:安装vm或者virtualbox,这里因为对性能不太敏感,选择了virtualbox。

打开git bash,注意是git bash

mkdir ~/Documents/vagrant_ubuntu2404
cd ~/Documents/vagrant_ubuntu2404
vagrant init bento/ubuntu-24.04 --box-version 202502.21.0
vagrant up

执行以上命令以后,就会拉取镜像,然后创建一个虚拟机。

导入box

若因网络原因,无法拉取远程的box,导致上面一步执行失败,可以从网盘中下载box文件,导入到系统中。

1. 确认本地 box 文件路径

首先找到你的 Vagrant box 文件(通常后缀为 .box),记录其完整路径(例如:/Users/yourname/Downloads/centos7.box 或 C:\Downloads\ubuntu2004.box)。

2. 导入本地 box 文件

打开终端(Linux/macOS)或命令提示符(Windows),执行以下命令:

vagrant box add [自定义名称] [本地 box 文件路径]
  • 参数说明
    • [自定义名称]:给这个 box 起一个便于记忆的名字(后续在 Vagrantfile 中会用到),例如 my-centos7 或 ubuntu2004-local
    • [本地 box 文件路径]:box 文件的绝对路径或相对路径(若终端当前目录与 box 文件一致,可直接写文件名)。

示例

将网盘中的文件放到C:\baidunetdiskdownload\中, 然后执行以下命令

vagrant box add ubuntu2404 C:\baidunetdiskdownload\bentou-buntu-24.04-250221.box

执行成功后,可以通过vagrant box list命令查看。

$ vagrant box list                                                                                                                             
bento/ubuntu-24.04 (virtualbox, 202502.21.0, (amd64))                                                                                          
ubuntu2204         (virtualbox, 0, (amd64))

导入之后,使用别名进行vagrant虚拟机的创建。

vagrant init ubuntu2204

相关配置

增加本地文件映射

在 Vagrant 中,通过配置 Vagrantfile 可以将本地主机的文件夹映射(共享)到虚拟机中,实现主机与虚拟机之间的文件双向同步。具体操作如下:

核心配置:synced_folder

Vagrant 提供了 config.vm.synced_folder 配置项,用于定义共享文件夹。基本语法如下:

Vagrant.configure("2") do |config|
  # 映射本地文件夹到虚拟机
  config.vm.synced_folder "本地文件夹路径", "虚拟机中目标路径", [选项]
end

参数说明

  1. 本地文件夹路径

    主机中要共享的文件夹路径,可以是相对路径(相对于 Vagrantfile 所在目录)或绝对路径

    例:./data(当前目录下的 data 文件夹)、/Users/yourname/Documents(绝对路径)。

  2. 虚拟机中目标路径

    文件夹在虚拟机中挂载的路径(必须是绝对路径)。若路径不存在,Vagrant 会自动创建。

    例:/var/www/home/vagrant/shared

  3. 可选参数(常用):

    • type: "virtualbox":指定同步类型(根据虚拟机提供商选择,如 VirtualBox 用 virtualbox,VMware 用 vmware_fusion 等,默认自动适配)。
    • nfs: true:使用 NFS 协议同步(性能优于默认方式,适合大文件或频繁读写场景,仅支持 Linux/macOS 主机)。
    • read_only: true:设置为只读(虚拟机无法修改主机文件)。
    • create: true:若本地文件夹不存在,自动创建(默认 false)。
    • owner: "vagrant"group: "vagrant":指定虚拟机中文件夹的所有者和组(避免权限问题)。

示例

假设需求:将主机当前目录下的 ./code 文件夹,映射到虚拟机的 /home/vagrant/project 目录,且支持双向读写。

  1. 编辑 Vagrantfile,添加如下配置:

    ruby

Vagrant.configure("2") do |config|
	# 基础配置(已有的虚拟机配置,如 box 名称等)
	config.vm.box = "ubuntu2004"  # 你的 box 名称
	
	# 共享文件夹配置
	config.vm.synced_folder "C:/Users/textworld/Documents", "/home/vagrant/documents",
		create: true,  # 若主机 ./code 不存在,自动创建
		owner: "vagrant",  # 虚拟机中文件夹所有者为 vagrant 用户
		group: "vagrant"
	  # 可选:使用 shell  provisioning 进行额外设置

	config.vm.provision "shell", inline: <<-SHELL
	    # 确保挂载目录有正确权限
	    sudo chown -R vagrant:vagrant /home/vagrant/documents
	SHELL
	
end
  1. 使配置生效:

    保存 Vagrantfile 后,在终端执行以下命令重启虚拟机(加载新配置):

vagrant reload
  1. 验证共享:

    进入虚拟机后,检查目标路径是否存在并同步文件:

    # 进入虚拟机
    vagrant ssh
    
    # 查看虚拟机中的共享目录
    ls /home/vagrant/project
    
    # 在主机的 ./code 中创建文件,虚拟机中会同步出现;反之亦然

注意事项

  • 权限问题:若虚拟机中访问共享文件夹提示 “权限不足”,可通过 owner 和 group 参数指定为虚拟机中的用户(如 vagrant),或手动在虚拟机中执行 chmod 调整权限。
  • 性能优化:对于频繁读写的场景(如开发环境),建议使用 nfs: true(需主机支持 NFS,Windows 主机不适用),或 rsync 类型(单向同步,适合静态文件)。
  • 路径格式:Windows 主机的路径建议用正斜杠(如 C:/Users/yourname/code),避免反斜杠转义问题。

通过以上配置,即可实现本地文件夹与虚拟机的无缝同步,方便开发时直接在主机编辑文件,虚拟机中实时生效。

安装docker

安装采用离线安装的方式,不依赖网络。从网盘中下载几个文件到刚才挂载的文件夹中。

启动虚拟机之后,进入到虚拟机的bash中,执行如下命令,安装docker

sudo su
# 必须将宿主机中的文件拷贝到linux中的文件夹中。因为宿主机中的文件没有执行权限,所以拷贝到系统中也没有执行权限, 不进行额外赋权的话,会导致docker启动失败。
cp -R /home/vagrant/documents/docker-install/ ~/docker-install/
cd ~/docker-install
bash install.sh  -f ./docker-28.5.1.tgz
mkdir -p /usr/libexec/docker/cli-plugins/
cp ~/docker-install/docker-compose-linux-x86_64 /usr/libexec/docker/cli-plugins/docker-compose    
chmod +x /usr/libexec/docker/cli-plugins/docker-compose                       

验证

安装完成之后,执行docker compose 命令如果正常输出,则说明docker 安装完成

root@vagrant:~/docker-install# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
root@vagrant:~/docker-install# chmod +x /usr/libexec/docker/cli-plugins/docker-compose
root@vagrant:~/docker-install# docker compose 
Usage:  docker compose [OPTIONS] COMMAND

Define and run multi-container applications with Docker

Options:
      --all-resources              Include all resources, even those not used by services
      --ansi string                Control when to print ANSI control characters ("never"|"always"|"auto") (default "auto")
      --compatibility              Run compose in backward compatibility mode
      --dry-run                    Execute command in dry run mode
      --env-file stringArray       Specify an alternate environment file
  -f, --file stringArray           Compose configuration files
      --parallel int               Control max parallelism, -1 for unlimited (default -1)
      --profile stringArray        Specify a profile to enable
      --progress string            Set type of progress output (auto, tty, plain, json, quiet)
      --project-directory string   Specify an alternate working directory
                                   (default: the path of the, first specified, Compose file)
  -p, --project-name string        Project name

网盘资源下载

通过网盘分享的文件:bentou-buntu-24.04-250221.box
链接: https://pan.baidu.com/s/1PYQvBI6lJ2LYiUiD5tcYpw?pwd=x8k9 提取码: x8k9
–来自百度网盘超级会员v6的分享

通过网盘分享的文件:docker
链接: https://pan.baidu.com/s/1pjBALmoL9u6NBdeYwrOvkA?pwd=59p7 提取码: 59p7
–来自百度网盘超级会员v6的分享