Vagrant实现自动化创建虚拟机

0.环境

一台已经安装了VirtualBox的MacOS。

1.安装Vagrant

下载并安装Vagrant:https://www.vagrantup.com/downloads.html
完成后使用vagrant -v命令查看版本,确认Vagrant已经成功安装。

➜  ~ git:(master) ✗ vagrant -v
Vagrant 2.2.5

2.创建vagrantfile

在Vagrant文件夹中,创建一个名为CentOS7_Docker的文件夹,并进入该文件夹。(这里的git:(master)仅是一个提示符,可以忽略不计)

➜  Vagrant git:(master) ✗ mkdir CentOS7_Docker
➜  Vagrant git:(master) ✗ cd CentOS7_Docker
➜  CentOS7_Docker git:(master) ✗

在CentOS7_Docker文件夹内创建VagrantfileVagrantfile的内容如下。(可以使用vi或者使用文本编辑器等)

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.require_version ">= 1.6.0"

boxes = [
    {
        :name => "docker-host",
        :eth1 => "192.168.205.10",
        :mem => "1024",
        :cpu => "1"
    }
]

Vagrant.configure(2) do |config|

  config.vm.box = "centos/7"
  boxes.each do |opts|
    config.vm.define opts[:name] do |config|
      config.vm.hostname = opts[:name]
      config.vm.provider "vmware_fusion" do |v|
        v.vmx["memsize"] = opts[:mem]
        v.vmx["numvcpus"] = opts[:cpu]
      end
      config.vm.provider "virtualbox" do |v|
        v.customize ["modifyvm", :id, "--memory", opts[:mem]]
        v.customize ["modifyvm", :id, "--cpus", opts[:cpu]]
      end
      config.vm.network :private_network, ip: opts[:eth1]
    end
  end
  config.vm.synced_folder "./labs", "/home/vagrant/labs"
  config.vm.provision "shell", privileged: true, path: "./setup.sh"
end

在同一文件夹内创建setup.sh,来实现Docker的自动安装和启动。

#/bin/sh

# install some tools
sudo yum install -y git vim gcc glibc-static telnet bridge-utils net-tools

# install docker
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh

# start docker service
sudo systemctl start docker

rm -rf get-docker.sh

为了使CentOS7虚拟机和宿主机(本地)之间方便传输文件,需要将虚拟机中的/home/vagrant/labs挂在到当前目录的labs文件夹下。因此需要穿件一个名为labs的文件夹。

➜  CentOS7_Docker git:(master) ✗ mkdir labs
➜  CentOS7_Docker git:(master) ✗ ls
Vagrantfile labs        setup.sh

至此,Vagrantfilesetup.sh以及labs文件夹已经创建完成。

3.创建CentOS7的虚拟机

在上述目录中输入vagrant up命令创建一台CentOS7的虚拟机。第一创建时会自动下载CentOS7的镜像文件,需要等待一段时间。

➜  CentOS7_Docker git:(master) ✗ vagrant up

等待片刻后,虚拟机就创建完成了。

4.连接和退出虚拟机

使用vagrant ssh命令启动创建好的CentOS7的虚拟机,并确认Docker版本。

➜  CentOS7_Docker git:(master) ✗ vagrant ssh
-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
[vagrant@docker-host ~]$ sudo docker version
Client: Docker Engine - Community
 Version:           19.03.1
 API version:       1.40
 Go version:        go1.12.5
 Git commit:        74b1e89
 Built:             Thu Jul 25 21:21:07 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.1
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.5
  Git commit:       74b1e89
  Built:            Thu Jul 25 21:19:36 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.6
  GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb
 runc:
  Version:          1.0.0-rc8
  GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

使用exit命令退出虚拟机。

[vagrant@docker-host ~]$ exit
logout
Connection to 127.0.0.1 closed.

5.停止并销毁虚拟机

使用vagrant status命令查看当前虚拟机状态。此虚拟机的状态为running,即正在运行。

➜  CentOS7_Docker git:(master) ✗ vagrant status
Current machine states:

docker-host               running (virtualbox)

The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.

使用vagrant halt 命令停止虚拟机。

➜  CentOS7_Docker git:(master) ✗ vagrant halt
==> docker-host: Attempting graceful shutdown of VM...

再次使用vagrant status命令查看当前虚拟机状态。此时,该虚拟机的状态为poweroff,即已经关闭。

➜  CentOS7_Docker git:(master) ✗ vagrant status
Current machine states:

docker-host               poweroff (virtualbox)

The VM is powered off. To restart the VM, simply run `vagrant up`

最后,使用vagrant destroy 销毁创建的虚拟机,并查看状态。

➜  CentOS7_Docker git:(master) ✗ vagrant destroy
    docker-host: Are you sure you want to destroy the 'docker-host' VM? [y/N] y
==> docker-host: Destroying VM and associated drives...
➜  CentOS7_Docker git:(master) ✗ vagrant status
Current machine states:

docker-host               not created (virtualbox)

The environment has not yet been created. Run `vagrant up` to
create the environment. If a machine is not created, only the
default provider will be shown. So if a provider is not listed,
then the machine is not created for that environment.

可以上到,该虚拟机的状态为not created(未被创建),确认删除成功。
删除虚拟机并不需要先将其停止,在运行的状态下也可以直接删除。
※上述命令必须在CentOS7_Docker目录下执行。

6.关于Vagrant的其他一些常用命令

vagrant init <名称>   # 初始化box的操作
vagrant box add <虚拟机名>    # 添加box的操作
vagrant up   # 启动虚拟机的操作
vagrant ssh    # 登录拟机的操作,也可以指定hostname登陆
vagrant box list   # 显示当前已经添加的box列表
vagrant box remove 名称   # 删除相应的box  
vagrant destroy   # 停止当前正在运行的虚拟机并销毁所有创建的资源
vagrant halt   # 关机
vagrant status    # 获取当前虚拟机的状态,也可以查看指定hostname
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 <名称>就可以免密码登录

6.vagrant 用户权限不足的解决方案

利用上述方法创建一个虚拟机,使用vagrant ssh命令进入上述系统。

➜  CentOS7_Docker git:(master) ✗ vagrant ssh
-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
[vagrant@docker-host ~]$

使用docker version用查看Docker版本。

[vagrant@docker-host ~]$ docker version
Client: Docker Engine - Community
 Version:           19.03.1
 API version:       1.40
 Go version:        go1.12.5
 Git commit:        74b1e89
 Built:             Thu Jul 25 21:21:07 2019
 OS/Arch:           linux/amd64
 Experimental:      false
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/version: dial unix /var/run/docker.sock: connect: permission denied

系统返回permission denied错误,这是因为vagrant用户没有权限查看Docker的Server端版本信息。需要在docker version命令前加上sudo来提升其权限。

[vagrant@docker-host ~]$ sudo docker version
Client: Docker Engine - Community
 Version:           19.03.1
 API version:       1.40
 Go version:        go1.12.5
 Git commit:        74b1e89
 Built:             Thu Jul 25 21:21:07 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.1
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.5
  Git commit:       74b1e89
  Built:            Thu Jul 25 21:19:36 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.6
  GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb
 runc:
  Version:          1.0.0-rc8
  GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

不仅如此,使用docker命令时通常都需要加上sudo来提升vagrant用户的权限。为了避免每次输入sudo的麻烦,可以将vagrant用户添加到docker的用户组。

# 查找 docker 组,确认其是否存在
[vagrant@docker-host ~]$ cat /etc/group | grep docker
docker:x:992:

# 如果 docker 组不存在,则创建组
sudo groupadd docker

# 将当前用户添加到 docker 组
[vagrant@docker-host ~]$ sudo gpasswd -a ${USER} docker
Adding user vagrant to group docker

# 查看 docker 组用户,确认添加成功
[vagrant@docker-host ~]$ cat /etc/group | grep docker
docker:x:992:vagrant

# 重启服务
[vagrant@docker-host ~]$ sudo service docker restart
Redirecting to /bin/systemctl restart docker.service

#测试
[vagrant@docker-host ~]$ docker version
Client: Docker Engine - Community
 Version:           19.03.1
 API version:       1.40
 Go version:        go1.12.5
 Git commit:        74b1e89
 Built:             Thu Jul 25 21:21:07 2019
 OS/Arch:           linux/amd64
 Experimental:      false
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/version: dial unix /var/run/docker.sock: connect: permission denied

仅仅重启服务仍不能解决这个问题,还需要注销并重新连接。

[vagrant@docker-host ~]$ exit
logout
Connection to 127.0.0.1 closed.
➜  CentOS7_Docker git:(master) ✗ vagrant ssh
Last login: Thu Aug  8 12:53:19 2019 from 10.0.2.2
-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
[vagrant@docker-host ~]$ docker version
Client: Docker Engine - Community
 Version:           19.03.1
 API version:       1.40
 Go version:        go1.12.5
 Git commit:        74b1e89
 Built:             Thu Jul 25 21:21:07 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.1
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.5
  Git commit:       74b1e89
  Built:            Thu Jul 25 21:19:36 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.6
  GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb
 runc:
  Version:          1.0.0-rc8
  GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

使用上述方法,可以实现在不使用sudo命令获取Docker版本信息,从而根本解决这个问题vagrant用户权限不足的问题。

参考

Mac 下使用 Vagrant 快速搭建 Centos/7 虚拟机
Mac下使用Vagrant配置CentOS虚拟环境
不加 sudo 执行 Docker 命令

.

你可能感兴趣的:(Vagrant实现自动化创建虚拟机)