在windows系统下搭建环境需要注意事项:
安装软件前先检查电脑是否开启虚拟机的硬件加速技术, 开机进入BIOS选项 ,依次选Config –> CPU –> Intel Virtualization Technology,里面有个Intel VT-d Feature ,改成Enabled ,保存退出。
安装软件顺序是先安装VirtualBox,再安装vagrant。
1 安装VirtualBox和vagrant工具
1.1 在window系统搭建的虚拟开发环境
(1) 安装VirtualBox
如果安装过程中出现提示的错误是:VirtualBox Installation failed! Error,原因是有些服务未启动。
解决的方法: 我的电脑 –> 右键管理 –> 服务和应用程序 –> 服务 –> 启动Device Install Service和Device Setup Manager两个服务。
(2) 安装vagrant
下载安装完后在终端输入命令vagrant version查看是否安装成功,如果找不到命令添加vagrant的bin目录到系统path中。
1.2 在linux系统搭建的虚拟开发环境
sudo apt update
# 安装virtualBox虚拟机
sudo apt install virtualbox
# 安装vagrant
# 下载
curl -O https://releases.hashicorp.com/vagrant/2.2.9/vagrant_2.2.9_x86_64.deb
# 安装
sudo apt install ./vagrant_2.2.9_x86_64.deb
# 查看版本
vagrant --version
2 vagrant命令说明
| 命令 | 说明 | 
|---|---|
| vagrant init 名称 | 初始化box的操作 | 
| vagrant box add 虚拟机名 box文件名 | 添加box的操作 | 
| vagrant up | 启动虚拟机的操作 | 
| vagrant ssh | 登录拟机的操作,也可以指定ID号登陆 | 
| vagrant box list | 显示当前已经添加的box列表 | 
| vagrant box remove 名称 | 删除相应的box | 
| vagrant destroy | 停止当前正在运行的虚拟机并销毁所有创建的资源 | 
| vagrant halt | 关机 | 
| vagrant status | 获取当前虚拟机的状态 | 
| vagrant suspend | 挂起当前的虚拟机 | 
| vagrant resume | 恢复前面被挂起的状态 | 
| vagrant reload | 重新启动虚拟机,主要用于重新载入配置文件 | 
| vagrant global-status | 查看所有虚拟机的ID号 | 
| vagrant plugin | 用于安装卸载插件 | 
| vagrant ssh-config | 输出用于ssh连接的一些信息 | 
| vagrant package | 打包命令,可以把当前的运行的虚拟机环境进行打包 | 
| vagrant ssh-config | 查看ssh登录信息,可以把这些信息 保存到.ssh文件下config中,先用vagrant ssh 登录,然后把宿主机的ssh公钥保存到虚拟机的authorized_keys文件里,然后在宿主机ssh <名称>就可以免密码登录 | 
3 Vagrantfile配置文件说明
虚拟机镜像版本
config.vm.box = “centos8.1”
如果指定的镜像名称不存在,会自动去官网找拉取,过程会但非常慢长,建议在国内镜像库 http://mirrors.ustc.edu.cn/centos-cloud/centos/8/vagrant/ 下载到本地。
设置虚拟机硬件资源
config.vm.provider "virtualbox" do |v|
    v.customize ["modifyvm", :id, "--memory", 1024]
    v.customize ["modifyvm", :id, "--cpus", 1]
end
设置端口映射
config.vm.network “forwarded_port”, guest: 80, host: 8080
设置网络
# (1) 设置虚拟机私有网络 不能和主机同一个网段,如果只设置private_network,除了主机,其他机器不能访问。
config.vm.network "private_network", ip: "172.17.0.100"
# (2) 设置公有网络绑定网桥,使得除了主机以外可以访问虚拟机
    config.vm.network "public_network", bridge: "宿主机的网络名称", adapter: 2, auto_config: false
# 其中adapter值1(nat)、2(hostonly)、3(bridged),必须选择bridged模式才能允许外网访问。
# 使用命令ifconfig查看宿主机网络名称为 eno1
eno1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.3.5  netmask 255.255.255.0  broadcast 192.168.3.255
        inet6 fe80::8455:4306:723e:a1d  prefixlen 64  scopeid 0x20<link>
        ether 54:bf:64:6d:a3:dc  txqueuelen 1000  (以太网)
设置provision任务
provision任务会在原生镜像的基础上,进行一些附加的操作,以改变虚拟机的环境,比如安装应用,发布程序等。可以编写一些命令,让vagrant在启动虚拟机的时候自动执行,节省手动配置环境的时间。
脚本什么时候会被执行?
- 第一次执行vagrant up命令
 - 执行vagrant provision命令
 - 执行vagrant reload –provision或者vagrant up –provision命令
 - 你也可以在启动虚拟机的时候添加–no-provision参数以阻止脚本被执行
 - 
 
provision任务一些默认值:
- 默认只执行一次,如果需要每次执行,添加参数run:“always”
 - 默认是sudo权限执行脚本,可以使用privileged: false改为非root权限执行。
 - 脚本分为行内脚本和外部脚本,外部脚本既可以是本地,也可以是网络地址,例如”https://example.com/provisioner.sh"
 
# (1) 外部脚本,Vagrant会上传这个脚本到虚拟机并执行。
config.vm.provision "shell", path: <脚本位置>
# (2) 行内脚本
    # 单行脚本
    config.vm.provision "shell",inline: "echo Hello World"
    # 对于多行命令脚本,需要明确命令边界
    config.vm.provision "shell" do |s|
      s.inline = <<-SHELL
        # 更改时区
        cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
      SHELL
    end
设置上传文件
# 将host主机的./config上传到 vm虚拟机的目标文件./Vagrantfile。
config.vm.provision "file", source: "./config", destination: "Vagrantfile"
通过Vagrantfile配置可以很方便一次创建一个或多个自定义环境的虚拟机,例如启动一个安装有docker环境的虚拟机,因为第一次启动虚拟机时可以执行自定义脚本文件。
4 Vagrantfile配置文件模板示例
Vagrant.require_version ">= 1.6.0"
# 设置虚拟机参数
opts = {
      # 虚拟机名称
      :name => "mydemo",
      # 虚拟机内存大小
      :mem => "2048",
      # 虚拟机CPU核数
      :cpu => "2",
      # 虚拟机私有ip地址,不可以设置和宿主机在同一网段
      :host_ip => "192.168.6.100",
      # 如果需要,可以连接网桥
      :bridge_network => "en0: Wi-Fi (AirPort)",
      # 宿主机共享文件夹路径,虚拟机共享文件夹在/home/vagrant
      #:synced_folder => "./synced_folder",   
      # 第一次启动虚拟机执行外部脚本    
      :script_path => "./setup.sh",
      # 端口映射,可以添加多个端口,
      # 然后在虚拟机configure添加demo.vm.network :"forwarded_port", guest: opts[:guest_portN], host: opts[:host_portN] 
      :guest_port1 => "80",
      :host_port1 => "8080",
      :guest_port2 => "3306",
      :host_port2 => "13306"
}
# 如果需要创建多个虚拟机,复制上面参数列表改名并设置参数
Vagrant.configure(2) do |config|
  # 虚拟机镜像版本,如果本地不存在,会去官网拉取
  config.vm.box = "centos/7"
  # 起始---------------------------------------------------------------------
  config.vm.define opts[:name] do |demo|
    # 虚拟机名称
    demo.vm.hostname = opts[:name]
    # 虚拟机硬件资源
    demo.vm.provider "virtualbox" do |v|
      v.customize ["modifyvm", :id, "--memory", opts[:mem]]
      v.customize ["modifyvm", :id, "--cpus", opts[:cpu]]
    end
  
    # 虚拟机私有网络, 不能和主机同一个网段,如果只设置private_network,除了主机,其他机器不能访问。
    demo.vm.network "private_network", ip: opts[:host_ip]
    # 设置桥接网络,使得除了主机以外可以访问虚拟机,如果指定ip值表示为静态ip,不指定ip值就随机分配
    #config.vm.network "public_network", bridge: opts[:bridge_network], ip: opts[:host_ip], adapter: 2, auto_config: false
    
    # 端口映射,映射端口个数根据设置而定
    demo.vm.network :"forwarded_port", guest: opts[:guest_port1], host: opts[:host_port1]
    demo.vm.network :"forwarded_port", guest: opts[:guest_port2], host: opts[:host_port2] 
    
    # 设置共享目录,注意:如果使用了最小化centos系统,是没有安装VirtualBox增强功能的,
    # 可以在外部脚本或进入添加"yum update -y"、"yum install -y kernel-devel"这两条命令,
    # 然后取消注释共享命令,重新加载Vagrantfile启动虚拟机。
    #demo.vm.synced_folder opts[:synced_folder], "/home/vagrant"
    
    # 执行外部脚本
    demo.vm.provision "shell", path: opts[:script_path]
  end
# 结束---------------------------------------------------------------------
# 如果有多个虚拟机,复制上面信息创建一个新虚拟机
end
5 创建一个已安装docker的虚拟机示例
(1) 下载镜像到本地
wget http://mirrors.ustc.edu.cn/centos-cloud/centos/8/vagrant/x86_64/images/CentOS-8-Vagrant-8.1.1911-20200113.3.x86_64.vagrant-virtualbox.box -O centos8.1.box
(2) 编辑Vagrantfile
修改主机名称、内存大小、cpu核数、宿主机网络名称,内容如下:
Vagrant.require_version ">= 1.6.0"
opts = {
      :name => "vbox",
      :mem => "2048",
      :cpu => "2",
      :bridge_network => "eno1",
      :script_path => "./setup.sh"
}
Vagrant.configure(2) do |config|
  config.vm.box = "centos8.1"
  config.vm.define opts[:name] do |demo|
    demo.vm.hostname = opts[:name]
    demo.vm.provider "virtualbox" do |v|
      v.customize ["modifyvm", :id, "--memory", opts[:mem]]
      v.customize ["modifyvm", :id, "--cpus", opts[:cpu]]
    end
    config.vm.network "public_network", bridge: opts[:bridge_network], adapter: 2, auto_config: false
    demo.vm.provision "shell", path: opts[:script_path]
  end
end
** (3) 编辑安装docker脚本文件 setup.sh,内容如下:**
#/bin/sh
# 设置时区
cp -r /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# -------------------------安装docker-----------------------------
# 安装一些工具
yum install -y vim git yum-utils openssh-server device-mapper-persistent-data lvm2
# 添加yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 查看可安装的版本
yum list docker-ce --showduplicates | sort -r
# 安装最新版本docker
yum install -y docker-ce
# 把docker权限添加到当前用户中,避免每次使用添加sudo
sudo usermod -aG docker vagrant
# 镜像加速
sudo touch /etc/docker/daemon.json
sudo chmod 666 /etc/docker/daemon.json
echo '{"registry-mirrors": ["https://zrxnbavs.mirror.aliyuncs.com"]}' >> /etc/docker/daemon.json
sudo chmod 644 /etc/docker/daemon.json
# 设置开机启动docker和启动docker
systemctl enable docker
systemctl start docker
# 查看docker版本信息
docker version
(4) 启动虚拟机
# 启动,启动完成后会在生成.vagrant目录
vagrant up
# 进入虚拟机终端
vagrant ssh
注:虚拟机默认帐号和密码为vagrant:vagrant
(5) 允许其他主机使用ssh登录
打开sshd配置文件 /etc/ssh/sshd_config,把字段PasswordAuthentication值no改为yes
专题「工具」的其它文章 »
- TLS和SSL (Nov 17, 2020)
 - prometheus基础和使用 (Aug 20, 2019)
 - kubernetes基础和使用 (Sep 30, 2018)
 - 使用gitlab和gitlab-runner实现DevOps (Sep 15, 2018)
 - 一款漂亮的命令行工具——cmder (Sep 10, 2018)
 - 搭建个人代码托管git服务 (Aug 19, 2018)
 - docker基础和使用 (Aug 10, 2018)
 - goland IDE使用说明 (Aug 07, 2018)