专栏首页云架构修炼手册vagrant学习笔记 - 基本命令的使用

vagrant学习笔记 - 基本命令的使用

vagrant基本命令,根据操作的目的,可以对基本命令进行分类:

1 操作镜像

box package

2 操作虚拟机

connect destroy halt init powershell provision rdp reload resume share snapshot ssh suspend up

3 监控虚拟机

global-status ssh-config port status

4 其他

help login plugin push version

1 操作镜像

该命令有两个,用来管理本地镜像

1.1 vagrant box

1.1.1 添加镜像到本地仓库

$ vagrant box add [box-name] [box镜像文件或镜像名]

1.1.2 移除本地镜像

$ vagrant box remove [box-name]

box多版本共存的情况 如果box升级过,那么在box list中会出现两个同名,但版本不同的镜像。如:

$ vagrant box list |grep coreos
coreos-alpha                         (virtualbox, 745.1.0)
coreos-alpha                         (virtualbox, 928.0.0)

使用该镜像创建虚拟机的时候,默认会使用高版本的box。 如果想使用低版本,需要修改Vagrantfile,指定box-version 在config.vm.box=xxx下一行,如上面的例子中,在“config.vm.box = "coreos-alpha"”后面增加一行配置信息:

config.vm.box_version = "745.1.0"

同样,如果想删除一个box,如下操作会失败:

$ vagrant box remove coreos-alpha
You requested to remove the box 'coreos-alpha' with provider
'virtualbox'. This box has multiple versions. You must
explicitly specify which version you want to remove with
the `--box-version` flag or specify the `--all` flag to remove all
versions. The available versions for this box are:

 * 745.1.0
 * 928.0.0

这时有两个选择:

  • vagrant box remove coreos-alpha --all

#删除所有同名镜像

  • vagrant box remove coreos-alpha --box-version=745.1.0

删除指定版本的镜像

1.1.3 升级镜像

检查镜像是否有升级?

$ cd ~/vm/ubuntu
$ vagrant box outdated
Checking if box 'ubuntu/trusty64' is up to date...
A newer version of the box 'ubuntu/precise64' is available! You currently
have version '20160122.0.0'. The latest is version '20160209.0.0'. Run
`vagrant box update` to update.

中央仓库有新版更新了,手动更新box。更新的结果并不是替换旧版本,而是在本地仓库中增加了新版的box镜像。

$ cd ~/vm/ubuntu
$ vagrant box update
==> default: Checking for updates to 'ubuntu/precise64'
    default: Latest installed version: 20160120.0.0
    default: Version constraints:
    default: Provider: virtualbox
==> default: Updating 'ubuntu/precise64' with provider 'virtualbox' from version
==> default: '20160120.0.0' to '20160201.0.0'...
==> default: Loading metadata for box 'https://atlas.hashicorp.com/ubuntu/precise64?access_token=cXR0wCgWXoRpMw.atlasv1.ydBAS4ev1YCWzSK4S1l6iVjssRbO5Q50a8YVnEPqoyYjcQVeaMdEsiQ8rz8tOcSHLuY'
==> default: Adding box 'ubuntu/precise64' (v20160201.0.0) for provider: virtualbox
    default: Downloading: https://atlas.hashicorp.com/ubuntu/boxes/precise64/versions/20160201.0.0/providers/virtualbox.box
==> default: Successfully added box 'ubuntu/precise64' (v20160201.0.0) for 'virtualbox'!

$ vagrant box list | grep precise64
ubuntu/precise64                     (virtualbox, 20160120.0.0)
ubuntu/precise64                     (virtualbox, 20160201.0.0)

也可以检查本地仓库中的所有镜像是否有升级,使用 --global 开关,这时候不需要进入工作目录

$ vagrant box outdated --global
* 'ubuntu/trusty64' is outdated! Current: 20160122.0.0. Latest: 20160209.0.0
* 'ubuntu/precise64' (v20160201.0.0) is up to date
* 'pollyduan/bento_oracle_xe' wasn't added from a catalog, no version information
* 'phusion/ubuntu-14.04-amd64' (v2014.04.30) is up to date
* 'hashicorp/precise32' (v1.0.0) is up to date
* 'hashicorp/boot2docker' (v1.7.8) is up to date
* 'debian/jessie64' wasn't added from a catalog, no version information
* 'coreos-alpha' is outdated! Current: 928.0.0. Latest: 955.0.0
* 'centos7' wasn't added from a catalog, no version information
* 'centos65' wasn't added from a catalog, no version information
* 'centos64' wasn't added from a catalog, no version information
* 'bento/ubuntu-14.04' (v2.2.3) is up to date
* 'bento/opensuse-13.2-x86_64' (v2.2.1) is up to date
* 'bento/freebsd-10.2' (v2.2.3) is up to date
* 'bento/fedora-22' (v2.2.3) is up to date
* 'bento/debian-8.2' (v2.2.3) is up to date
* 'bento/centos-7.2' (v2.2.3) is up to date
* 'bento/centos-6.7' (v2.2.3) is up to date

不进入工作目录进行升级

$ vagrant box update --box coreos-alpha
Checking for updates to 'coreos-alpha'
Latest installed version: 928.0.0
Version constraints: > 928.0.0
Provider: virtualbox
Updating 'coreos-alpha' with provider 'virtualbox' from version
'928.0.0' to '955.0.0'...
Loading metadata for box 'http://alpha.release.core-os.net/amd64-usr/current/coreos_production_vagrant.json'
Adding box 'coreos-alpha' (v955.0.0) for provider: virtualbox
Downloading: http://alpha.release.core-os.net/amd64-usr/955.0.0/coreos_production_vagrant.box
Box download is resuming from prior download progress
Progress: 1% (Rate: 92912/s, Estimated time remaining: 0:38:09)
...

1.2 打包镜像

创建vm以后,我们自己根据需要安装软件,配置环境,都一切就绪了。如何分发给小伙伴使用呢?这里就要涌到package命令了,把镜像打包分发。

$ ll ~/VirtualBox\ VMs/ |grep ubuntu
drwx------  6 pollyduan  staff  204  2  2 11:18 ubuntu_default_1453944793418_7699

先看一下我们的vm目录名,这里有个容易混淆的目录:

  • Vagrantfile所在的目录——vagrant的工作目录
  • 虚拟机文件所在的目录——virtualbox的工作目录

这两个目录名不一定相同,如果在Vagrantfile中指定了vb.name,virtualbox工作目录就取这个名字;否则,命名为:vagrant工作目录_随机字符串。

或者,也可以使用virtual box的管理工具来看vm的名称。

$ VBoxManage list vms|grep ubuntu
"ubuntu_default_1453944793418_7699" {0362edc2-548b-400b-a55d-776b0a24cd8d}

package命令要使用的是virtual box工作目录。

格式:vagrant package --base [virtualbox的工作目录] --output [保存的文件名,缺省为package.box]

$ vagrant package --base ubuntu_default_1453944793418_7699 --output ubuntu_myproject_test.box
==> ubuntu_default_1453944793418_7699: Clearing any previously set forwarded ports...
==> ubuntu_default_1453944793418_7699: Exporting VM...
==> ubuntu_default_1453944793418_7699: Compressing package to: /Users/pollyduan/vm/tmp/ubuntu_myproject_test.box

导出后,可以通过IM、ftp或其他方式分发给小伙伴,那么大家使用的环境就是一致的了。

2 操作虚拟机

2.1 启动vm

2.1.1 对于单虚拟机

$ vagrant up

2.1.2 如果同一个Vagrantfile定义了一个以上的虚拟机,则:

$ vagrant up [vm-name]

其他命令类似。如果省略vm-name,则依次启动所有vm。

2.2 重启

$ vagrant reload [vm-name]

2.3 关机

$ vagrant halt [vm-name]

2.4 销毁虚拟机

$ vagrant destroy [vm-name]

2.5 ssh登录虚拟机

$ vagrant ssh [vm-name]

2.6 休眠与唤醒

这一对冤家也无需多说,对于开发环境来说,个人觉得用处不是很大。

$ vagrant suspend
==> default: Saving VM state and suspending execution...
$ vagrant status
Current machine states:

default                   saved (virtualbox)

To resume this VM, simply run `vagrant up`.
$ vagrant resume
==> default: Resuming suspended VM...
==> default: Booting VM...
…...

2.7 快照

vagrant snapshot命令是vm的月光宝盒,如果vm中有任务没有跑完,需要关闭virtual box,就可以给vm做一个快照,保存vm当前所有的状态,在virtualbox重新启动后,再回复快照。

2.7.1 查看当前保存的快照

$ vagrant snapshot list
==> default: No snapshots have been taken yet!

2.7.2 创建一个命名快照

$ vagrant snapshot save shot1
==> default: Snapshotting the machine as 'shot1'...
$ vagrant snapshot list
shot1

2.7.3 恢复快照

$ vagrant snapshot restore shot1
==> default: Forcing shutdown of VM...
==> default: Restoring the snapshot 'shot1'...
…...

恢复后,快照会一直存在,直到你手动删除它。

2.7.4 删除快照

$ vagrant snapshot delete shot1
==> default: Deleting the snapshot 'shot1'...
Progress: 90%
Progress: 100%
==> default: Snapshot deleted!

这个操作会删除持久化的数据文件,稍微有点慢,耐心等待。这个内在的原理没有深入研究,有点不太理解,删除一个文件理论上应该比保存一个文件更快才对。

2.7.5 盗梦空间

push和pop,每调用一次push命令会自动创建一个命名快照,名为:push+一串随机数,如:push_1455524411_6632;每调用一次pop,会逐级恢复到最新的快照,并删除快照。看例子:

$ vagrant snapshot list
==> default: No snapshots have been taken yet!
$ vagrant snapshot push
==> default: Snapshotting the machine as 'push_1455525041_2882'...
$ vagrant snapshot list
push_1455525041_2882
$ vagrant snapshot push
==> default: Snapshotting the machine as 'push_1455525049_7456'...
$ vagrant snapshot push
==> default: Snapshotting the machine as 'push_1455525058_6891'...
$ vagrant snapshot list
push_1455525041_2882
push_1455525049_7456
push_1455525058_6891
$ vagrant snapshot pop
==> default: Forcing shutdown of VM...
==> default: Restoring the snapshot 'push_1455525058_6891'...
==> default: Deleting the snapshot 'push_1455525058_6891'...
==> default: Snapshot deleted!
$ vagrant snapshot list
push_1455525041_2882
push_1455525049_7456

Tips: 文本的日志看起来还不够形象,在push三个snapshot后在virtual box中是树形显示的;每次pop,树枝会逐级退回,看起来更像穿越的感觉。 Tips: 在pop清空之前,随时可以通过restore恢复其中一个快照,同样快照不会删除;不影响pop的测试。

2.8 远程连接分享

远程连接通过share connect两个命令可以实现通过本机vagrant连接另外一台host上的虚机。

2.8.1 允许ssh连接

$ vagrant share --ssh
==> default: Detecting network information for machine...
    default: Local machine address: 127.0.0.1
    default:
    default: Note: With the local address (127.0.0.1), Vagrant Share can only
    default: share any ports you have forwarded. Assign an IP or address to your
    default: machine to expose all TCP ports. Consult the documentation
    default: for your provider ('virtualbox') for more information.
    default:
    default: An HTTP port couldn't be detected! Since SSH is enabled, this is
    default: not an error. If you want to share both SSH and HTTP, please set
    default: an HTTP port with `--http`.
    default:
    default: Local HTTP port: disabled
    default: Local HTTPS port: disabled
    default: SSH Port: 2200
    default: Port: 2200
==> default: Generating new SSH key...
    default: Please enter a password to encrypt the key: [输入授权密码]
    default: Repeat the password to confirm:[再输一次]
    default: Inserting generated SSH key into machine...
==> default: Checking authentication and authorization...
==> default: Creating Vagrant Share session...
    default: Share will be at: vile-ibex-8238
==> default: Your Vagrant Share is running! Name: vile-ibex-8238
==> default:
==> default: You're sharing your Vagrant machine in "restricted" mode. This
==> default: means that only the ports listed above will be accessible by
==> default: other users (either via the web URL or using `vagrant connect`).
==> default:
==> default: You're sharing with SSH access. This means that another user
==> default: simply has to run `vagrant connect --ssh vile-ibex-8238`
==> default: to SSH to your Vagrant machine.
==> default:
==> default: Because you encrypted your SSH private key with a password,
==> default: the other user will be prompted for this password when they
==> default: run `vagrant connect --ssh`. Please share this password with them
==> default: in some secure way.

Tips: 你可以通过--name指定一个名称,否则会随机生成一个共享名,如本例中的vile-ibex-8238

2.8.2 连接远端ssh虚机

$ vagrant connect --ssh vile-ibex-8238 --static-ip 10.2.136.211
Loading share 'vile-ibex-8238'...
The SSH key to connect to this share is encrypted. You will require
the password entered when creating to share to decrypt it. Verify you
access to this password before continuing.

Press enter to continue, or Ctrl-C to exit now.[回车]
Password for the private key:[输入授权密码]
Executing SSH...
vagrant@vagrant-ubuntu-trusty-64:~$

2.8.3 共享http

vagrant share可以把host主机的http开放到远端,供任何人访问,这好像跟vm没什么关系,但的确它发生了。

$ ~/apache-tomcat-8.0.28/bin/startup.sh
$ vagrant share --http 80
==> default: Detecting network information for machine...
    default: Local machine address: 127.0.0.1
    default:
    default: Note: With the local address (127.0.0.1), Vagrant Share can only
    default: share any ports you have forwarded. Assign an IP or address to your
    default: machine to expose all TCP ports. Consult the documentation
    default: for your provider ('virtualbox') for more information.
    default:
    default: Local HTTP port: 80
    default: Local HTTPS port: disabled
    default: Port: 2200
==> default: Checking authentication and authorization...
==> default: Creating Vagrant Share session...
    default: Share will be at: enchanting-buffalo-1493
==> default: Your Vagrant Share is running! Name: enchanting-buffalo-1493
==> default: URL: http://enchanting-buffalo-1493.vagrantshare.com
==> default:
==> default: You're sharing your Vagrant machine in "restricted" mode. This
==> default: means that only the ports listed above will be accessible by
==> default: other users (either via the web URL or using `vagrant connect`).

我的host电脑在内网,在外网的任意一台电脑上,访问http://enchanting-buffalo-1493.vagrantshare.com,奇迹发生了。

话说这个有什么用呢?别忘记,vagrant有一个端口映射的功能,在后面的Vagrantfile配置里会提到,这样做的结果,就是可以在互联网任意一个角落可以访问到你的虚机的http服务。

2.9 windows相关的操作

powershelgl和rdp是windows vm相关的操作,未做测试,忽略。

2.10 虚机环境部署

provision用于通过Vagrantfile配置文件,对vm进行部署,如安装软件,发布应用等,在这里不多说,专门一章来记录。

2.11 指定vmid操作虚拟机

在3.3.2中,我们可以看到当前工作机中的所有虚机,其中第一列数据为vmid,我们可以无需进入vagrant工作目录,操作这些虚机。如:

$ vagrant up 63093ce

该方式适用于前面提到的up、reload、halt、destroy等命令。

3 监控虚拟机

3.1 查看sshd配置信息

$ vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile "/Users/pollyduan/vm/ubuntu/.vagrant/machines/default/virtualbox/private_key"
  IdentitiesOnly yes
  LogLevel FATAL

3.2 查看虚拟机开放的端口

$ vagrant port
The forwarded ports for the machine are listed below. Please note that
these values may differ from values configured in the Vagrantfile if the
provider supports automatic port collision detection and resolution.

    22 (guest) => 2222 (host)

3.3 查看虚拟机状态

3.3.1 查看当前vm状态

$ cd ~/vm/ubuntu
$ vagrant status
Current machine states:

default                   poweroff (virtualbox)

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

状态可能是:

not create | 执行vagrant init命令后,从未启动过
poweroff | 关机
running | 运行中
saved | 休眠

3.3.2 查看全部虚机状态

此命令无需进入vagrant工作目录。

$ vagrant global-status
id       name       provider   state    directory
--------------------------------------------------------------------------------
be5dee2  mfsmaster  virtualbox poweroff /Users/pollyduan/vm/mfs
a523de6  mfschunk1  virtualbox poweroff /Users/pollyduan/vm/mfs
8377e0d  mfschunk2  virtualbox poweroff /Users/pollyduan/vm/mfs
b772b1f  metalogger virtualbox poweroff /Users/pollyduan/vm/mfs
8a5f10e  mfsclient  virtualbox poweroff /Users/pollyduan/vm/mfs
63093ce  default    virtualbox poweroff /Users/pollyduan/vm/ubuntu

你可能会发现,为什么有的是default,有的是有名字的。这就是因为mfsxxxx是在vagrantfile中指定了vb.name,他对应的virtualbox工作目录也是这个值,而ubuntu这个虚机没有指定,所以是default,而且其virtualbox工作目录也是比较长的——ubuntu_default_1453944793418_7699。

global-status统计信息不是实时的,所有不能保证数据是绝对准确的。如果在vagrant up启动后,我们在virtualbox管理终端关闭vm,global-status是捕获不到的,它还是会显示running状态。 截至1.8.1还是这样的,应该算是一个bug。处女座可能无法接受这个现实,那么你可以进入vagrant工作目录,手动再指定一次vagrant halt,状态就同步了。

4 其他命令

4.1 help

略。

4.2 login

登录到中央仓库

4.3 plugin

插件管理,略。

4.4 push

发布镜像到中央仓库

###4.5 version 略。

后面的一些命令一般人真是用不到,反正我是用不到。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • vagrant学习笔记 - 入门

    官方下载地址:https://www.vagrantup.com/downloads.html

    pollyduan
  • start.spring.io 访问不了怎么办?

    这个问题坑过我很多次,抽时间把start 官网的项目做了一个包装,增加了一个默认配置,以及定期更新的机制。

    pollyduan
  • SpringCloud的版本

    Spring Cloud 项目目前仍然是快速迭代期,版本变化很快。这里整理一下版本相关的东西,备忘一下。

    pollyduan
  • 基于vagrant+VirtualBox快速搭建虚拟机

    咻一咻
  • vagrant学习笔记 - 入门

    官方下载地址:https://www.vagrantup.com/downloads.html

    pollyduan
  • 如何确定单一产品利润最大化时的定价?

    逍遥之
  • python实现的简单点对点(p2p)聊

    点对点聊天首先是基于多线程的网络编程,其次就是将每一个连接都保存为一个具有独一属性的对象并添加到连接列表中,对于每一个连接对象发送过来的信息必须要包含主要的三项...

    py3study
  • “撬锁”实战:绕过云锁提权某游戏私服

    朋友给我了我一个游戏私服的shell,说是提权不下服务器,让我帮忙看看。本文仅为大家提供一个思路,这个方法可能很多人知道但是并没有公布到网络。我今天写出来只是为...

    FB客服
  • Java集合框架综述

    近被陆陆续续问了几遍HashMap的实现,回答的不好,打算复习复习JDK中的集合框架,并尝试分析其源码,这么做一方面是这些类非常实用,掌握其实现能更好的优化我们...

    哲洛不闹
  • 小试牛刀:基于Golang的腾讯云Serverless使用体验

    | 导语:Serverless符合云计算发展的方向,把用户关注点放在业务功能上,屏蔽底层网络框架、计算资源和机器运维等细节。这里基于Golang试了一把腾讯云S...

    王昂

扫码关注云+社区

领取腾讯云代金券