欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

宁皓网 Vagrant:虚拟机管理 有大用

2016-08-08-更新:插件

Vagrant,如果你想在本地的电脑上去虚拟一个接近真实的运行 Web 应用的服务器环境,我们就可以去使用 Vagrant 。通过命令,去安装虚拟机的镜像,这个镜像在 Vagrant 里面叫做 box ,比如你的服务器打算使用 CentOS 系统,你就可以在本地也去安装一个 CentOS 系统的 Box ,使用命令,去管理这些 box ,添加,删除,启动,还有停止。

用 Vagrant 启动虚拟机以后,可以使用 ssh 连接到虚拟机,虚拟机与本地电脑之间会有一个同步的目录,也就是你可以把项目的文件直接放到本地电脑上的某个目录下面,然后使用在虚拟机上配置的环境去运行它。

https://www.vagrantup.com/

1) 主机名管理插件:hostmanager

我的这个项目需要用到三台虚拟机,在定义它们的时候,我用了 hostname 设置了虚拟机的主机名,node1,node2,还有 node3 .. 现在我想让它们之间可以直接使用各自的主机名访问到对方 .. 而且我希望在本机上也可以使用虚拟机的主机名访问到这些虚拟机 ..

实现这个功能可以手工的去配置每台机器上的 hosts 文件,分别设置主机名,还有对应的 IP 地址 .. vagrant 的 hostmanager 插件可以帮我们自动实现这个功能 ..

先去安装一下这个插件 ..

vagrant plugin install vagrant-hostmanager

然后再去配置一下虚拟机 ... 先把 config.hostmanager.enabled 的值设置成 true .. 表示我们要使用 hostmanager 插件提供的功能 .. 再添加一个 config.hostmanager.manage_guest .. 把它的值也设置成 true .. 表示我们要更新虚拟机上的 hosts 文件 ..

再用一个 config.hostmanager.manage_host,它的值也设置成 true .. 意思是我们要更新主机上的 hosts 文件 ... 这样在主机上就可以使用虚拟机上的主机名访问到它们了 ..

config.hostmanager.enabled = true
config.hostmanager.manage_guest = true
config.hostmanager.manage_host = true

保存一下 .. 回到终端 .. 在这个项目的下面,可以执行一下 vagrant hostmanager .. 这个命令就是 vagrant-hostmanager 提供的 .. 它会更新虚拟机上的 hosts 文件 .. 还会更新主机上的 hosts 文件 ..

[node1] Updating /etc/hosts file...
[node2] Updating /etc/hosts file...
[node3] Updating /etc/hosts file...
Updating /etc/hosts file on host machine (password may be required)...

在主机上,我们可以试一下 ... ping node1 ... 这个 node1 就是其中的一台虚拟机的主机名 .. 在主机上可以连接到它 ..

再登录到一台虚拟机 .. vagrant ssh node1 ... 然后可以再试着去连接一下另外的一台虚拟机 .. ping node2 ... 在虚拟机上,我们也可以使用虚拟机上的主机名访问到对方 ...

2)更新虚拟机的 Guest Additions:vagrant-vbguest

有些 virtualbox 类型的 box 你会发现没法设置 virtualbox 类型的共享目录,这是因为 box 里面没有安装 VirtualBox Guest Additions 。

vagrant-vbguest 插件可以帮助我们在虚拟机上安装或者更新 VirtualBox Guest Additions 。先安装一下这个插件 ...

vagrant plugin install vagrant-vbguest

在这个目录下我已经创建了一个使用了 centos/7 这个 box 的虚拟机,这个 box 没有安装 VirtualBox Guest Additions .. 可以查看一下 ..

vagrant vbguest --status

提示 No installation found ... 想在运行中的虚拟机中安装 VirtualBox Guest Additions,可以执行一下 .. vagrant vbguest --do install .. 后面可以加上一个具体的虚拟机 ..

vagrant vbguest --do install node1

安装的过程需要等一会儿 .. 完成以后 ... 再查看一下虚拟机的 GuestAdditions 的状态 ...

vagrant vbguest --status

你会看到,node1 这台虚拟机的上面,会出现 GuestAdditions 的版本 .. 还有它的状态 .. 我们每次重启虚拟机的时候都会检查 GuestAdditions 的版本 .. 有更新的话会自动去更新它 ..

如果你不想自动更新,可以配置一下 .. 打到 Vagrantfile ... 添加一行配置 .. config.vbguest.auto_update .. 让它等于 false ..

config.vbguest.auto_update = false

https://github.com/dotless-de/vagrant-vbguest

3)插件设置 nfs 类型的共享目录:vagrant-bindfs

Vagrant 支持设置多种类型的主机与虚拟机之间的共享目录,如果你用的是 virtualbox,默认的共享目录的类型是 virtualbox 自带的... 这种类型的文件系统性能比较慢 .. 想提升性能可以使用其它类型的共享目录,比如 nfs ... 不过这样你很可能又会遇到权限的问题 ..

解决的方法就是使用 bindfs 重新再绑定一下虚拟机上的那个共享目录到一个新的位置上 .. 这样你就可以设置目录的权限了 ... 先安装一下这个插件 ..

vagrant plugin install vagrant-bindfs

打开虚拟机的配置文件 .. 找一台虚拟机去配置一下 .. 比如这个 node1 ... 先设置一个 nfs 类型的共享目录 ... node1.vm.synced_folder "./app", "/mnt/app-data", type: "nfs" ..

然后再用 bindfs 重新绑定一下它 .. node1.bindfs.bind_folder "/mnt/app-data", "/app", 再设置一下权限相关的东西,force_user 可以设置目录的拥有者 .. force_group 设置的是目录的群组 .. 如果虚拟机上的这个 /app 目录里面不是空白的,可以再用一个 o: "nonempty" ..

config.vm.define "node1" do |node1|
node1.vm.network "private_network", ip: "192.168.33.11"
node1.vm.hostname="node1"
node1.vm.synced_folder "./app", "/mnt/app-data", type: "nfs"
node1.bindfs.bind_folder "/mnt/app-data", "/app",
force_user: 'root', force_group: 'root', o: "nonempty"
end

保存 .. 在项目的目录下面创建一个新的目录 .. 名字是 app ... 在这个目录的下面再添加一个文件 .. index.html .. 随便添加点东西 .. 再保存一下 ..

回到终端 .. 重新再启动一下 node1 这台虚拟机 .. 在启动的时候会在虚拟机上安装 bindfs ,然后再给我们绑定共享目录 .. 完成以后,登录到 node1 ..

查看一下 /app 这个目录 .. 它的拥有者是 root ,群组也是 root ... 现在这个目录跟我们的项目下面的 app 目录是同步的 ..

准备
4)安装 Vagrant 与 Virtualbox

使用 vagrant ,我们需要两样东西,一个是 vagrant 本身,还有就是一个虚拟机的软件,可以使用 virtual box ,或者 vmware_desktop ...

下面,我们先去下载 vagrant ,打开 vagrantup.com ...

再打开 downloads 下载页面 ..

vagrant 是跨平台的软件,你可以根据自己的操作系统去下载对应的 vagrant 。

我用是 OSX,所以需要下载这个软件的 vagrant ...

下载完成以后,再去安装一下它 ...

双击打开 ... 继续 ... 安装 输入用户的密码 ...

点击 安装软件 ...

完成以后,点击 关闭 ..

然后我们可以打开命令行工具去试一下。 Windows 用户可以使用命令提示符工具 ... OSX 可以使用终端工具 ...

输入 vagrant ...

如果你能看到这些帮助的信息 ... 说明 vagrant 已经安装好了 ...

安装 virtualbox

下面,我们可以再去安装一下 virtualbox ... 打开 virtualbox.org ...

virtualbox 同样是跨平台的软件,你可以选择下载跟自己使用的操作系统相符的 virtualbox ...

下载完成以后,找到下载下来的 virtualbox

双击安装 ... 点击 继续 ... 继续 ...

再点击 安装 ...

输入密码 ... 然后 安装软件

完成以后,我们可以找到 virtualbox ...

能看到这个界面,说明我们已经安装好了 virtualbox ...

基础
5)添加 box

box 其实就是某种操作系统的镜像文件,你也可以把它想像成是虚拟机本身。你可以去添加想要的 box ,vagrant 可以管理这些 box。在创建项目的时候,你可以决定使用哪个 box 。 这个视频我们就去添加一个 box 。

这里我们需要使用命令行工具。Mac 用户可以使用终端工具,PC 用户可以使用命令提示符。

打开以后,可以先查看一下系统里可以使用的 box ... 输入 vagrant box list ..

这里提示说,还没有安装 box ,可以使用 vagrant box add 去添加一个 box ...

我们可以在 vagrantclound 上面找到想要的 box

点击 discover boxes ...

在这里显示的是推荐使用的 box ,这个名字分成两个部分,左边这块是创建这个 box 的用户的名字 ... 后半部分说明了这个 box 的操作系统 ... 比如这个 chef/content-6.5 ,表示这是 chef 这个用户创建的一个 centOS 6.5 操作系统的 box 。

在下面,还有一行更详细的描述,说明这是一个 64 位的操作系统。

注意,如果你的电脑不支持 64 位的操作系统,你就需要去下载一个 32 位的操作系统的 box 。

我们可以在这里去搜索一下,比如我要找一个 centOS 系统 ... 版本是 6.5 ... 并且是 32 位的 ...

在这个返回来的搜索结果里面,你要判断自己需要哪一个。

在这里,我测试过这个 box ,是可以使用的。

再回过来。

我们去安装一个这个 chef/centOS-6.5 这个 box ,可以复制一下这个名字 ...

再回到命令行工具 ...

输入 vagrant box add ,这个命令可以去安装新的 box ,后面加上要安装的 box 的名字 ...

把刚才复制的东西粘贴过来 ... 然后回车 ...

vagrant 会判断出是否要到 vagrantclound 去下载这个 box ... 这里会出现提示 ...

让我们选择 box 的版本。因为这里我们用的是虚拟机的软件是 virtualbox ,所以,这里要选择 1

如果你用的是 vmware_desktop ,你要选择 2 ,输入 1 ,回车 ..

这样 vagrant 会去下载对应的版本的 box ...

因为这些 box 的体积都比较大,可能几百 MB,也可能几个 G 。

如果你觉得下载的比较慢,也可以复制一下这个下载的地址,然后用下载工具去下载 ... 完成以后,可以再用 vagrant box add 去安装在本地上下载好的 box ..

完成以后,再查看一下安装好的 box 。

vagrant box list

现在这里就会有一个可以使用的 box 了,就是刚才我们安装的 chef/centos-6.5 ...

6)初始化,启动,连接

在我们的 Vagrant 里面,已经有了一个 CentOS 系统的 Box,下面,我们就可以使用这个 box 去初始化一个项目了。

打开命令行工具,然后去给项目创建一个目录,我要把它放到桌面上,先进入到桌面,新建一个目录,可以使用 mkdir 命令 ... 目录的名字是 ninghao ... 再进入到这个目录 ..

首先我们要初始化一下,在初始化的时候,你要选择想要使用的 Box,可以先查看一下可以使用的 box ..

vagrant box list

我这里暂时只有一个 chef/centos-6.5 ...

初始化用的是 vagrant init 这个命令 ... 在它后面要指定一下要使用的 box ...

vagrant init chef/centos-6.5

成功以后,会出现这样的提示 ... A `Vagrantfile` has been placed in this directory ... 在这个目录的下面创建了一个 vagrantfile 这个文件 ...

可以查看一下 ... 输入 ls ...

这个 Vagrantfile ,有点像是一个配置文件 ... 在后面的视频里,我们会再回来去修改这个文件里面的一些东西 ...

初始化以后,就可以启动这个 box 了 ... 用的命令是

vagrant up

这里提示正在导入 chef/centos-6.5 这个 box .. 它会基于我们之前添加的 box ,复制一份,放到一个特定的目录下面,这个虚拟机只会用到这个项目上,也就是,你在虚拟机上安装的软件,做的配置,只会影响到这个项目使用的这台虚拟机。

完成以后,会做一些配置,比如网络的配置,然后会启动这个 box ...

最后这行提示说,挂载了一个共享的目录 ... 默认就是在 根目录下面的 vagrant 这个目录,对应的是我们的这个项目的目录。

我们可以把项目的文件,放在这个项目所在的目录里面,这个目录跟 box 里面的根目录下的 vagrant 这个目录是同步的。

启动以后,可以使用 ssh 连接到这个 box ,这跟我们用 ssh 连接到 Linux 服务器是一样的 ... 不过在这里,我们可以使用一条特别的命令 ...

输入 vagrant ssh ...

默认会用 vagrant 这个用户连接到这个 CentOS 系统的 box ...

现在,我们就可以像操作一般的 Linux 服务器那样去控制它了,可以在上面安装项目需要的软件,搭建 Web 服务器等等。

7)Windows 用户的补充

1.7 版的 Vagrant ,在 SSH 的时候,端口号用 2200,视频里用的是 2222,请注意:)

Windows 用户可以使用命令提示符工具,先打开它 ... 然后进入到你想要保存项目的位置... 改变工作目录可以使用 cd 命令 ... 先进入到桌面上 ... cd desktop

然后为项目创建一个目录 ... 可以使用 md 命令 .. 后面加上要创建的目录的名字 ... md ninghao

ninghao 就是我们要保存项目文件的地方 ... 再进入到这个目录里面 ... cd ninghao

查看一下可以使用的 box ...

vagrant box list

再用 vagrant init 去初始化一下 ... 在后面加上要使用的 box ...

完成以后,会在这个项目的目录里面创建一个叫 Vagrantfile 的文件,这个文件会控制一些功能。

查看目录里面的东西,可以使用 dir 命令 ...

清空一下屏幕的显示用的是 cls 命令 ...

然后我们可以启动这个 box ... 输入 vagrant up ...

启动以后,就可以使用 ssh 连接到这个虚拟机了... Windows 用户需要下载一个叫 putty 的小工具 ...

打开它 ...

Host Name ,主机名 ... 输入 127.0.0.1 ... Port 端口号输入 2222

连接的类型选择 ssh

然后点击 Open ..

login as ... 登录的用户,输入 vagrant ... 回车 ...

又提示输入密码 ... 默认密码也是 vagrant ...

输入密码,然后回车 ... 这样就连接到了这个 CentOS 系统的虚拟机。

8)启动,停止,重启,销毁

进入到项目所在的目录以后,我们可以查看一下虚拟机的状态,输入:

vagrant status

status 就是状态的意思 ... 这里显示的是 running ,表示虚拟机现在是正在运行的状态 ...

要停止它,可以使用 vagrant halt 命令 ...

vagrant halt

halt 这个命令,可以完全关闭虚拟机,有点像是一个关机的命令。再查看一下虚拟机的状态

vagrant status

状态是 poweroff ,已经关机了。

另外,我们还可以暂停虚拟机,它会保存虚拟机的运行的状态,把虚拟机内存里的东西存储到电脑里的硬盘上,这样下次再恢复虚拟机的时候,在暂停它的时候正在运行的东西都可以恢复到暂停之前的状态。

我们可以先启动一下 ...

vagrant up

然后 ssh 到这个虚拟机,我们可以去安装一个 apache 服务器 ...

sudo yum install httpd

因为当前我们用的是 vagrant 这个用户连接的, 在安装软件的时候,需要超级管理员的权限才行,所以,需要加上一个 sudo ...

查看一下 httpd 这个服务的状态

sudo service httpd status

显示的是,停止的状态 ... 下面,我们可以启动它 ...

sudo service httpd start

然后退出一下 ... exit

暂停虚拟机,用的是 vagrant suspend ....

再查看一下虚拟机的状态 ... 现在显示的是 saved ... 暂停以后,虚拟机只会耗费你的一点硬盘的存储空间,不会再使用你的内存了。

暂停以后恢复过来,用的是 vagrant resume ...

再 ssh 到虚拟机 ... vagrant ssh ...

查看一下 httpd 服务的状态 ...

sudo service httpd status

显示正在运行 ... 因为我们刚才用了 vagrant suspend 命令,暂停了虚拟机的状态,当恢复过来的时候,虚拟机之前运行的软件仍然会继续运行 ...

要重启虚拟机,可以使用 vagrant reload ... 先退出一下 ... exit ... 再输入 vagrant reload ... 这样虚拟机会先关机,然后再重新启动 ...

如果你不再想要这个项目的虚拟机了,需要再执行一下 vagrant destory,把它销毁掉 ...

这个命令不会删除之前我们添加的 box,只会销毁当前这个项目的 box 。

vagrant destroy

确定要销毁吗?输入 y ,然后回车 ..

完成以后,可以再查看一下状态 .. .

vagrant status

这次会提示 not created ...

共享目录
9)共享的目录

默认情况下,vagrant 会共享我们的项目的目录,也就是,在项目的虚拟机里面,会有一个目录跟我们的项目的目录是同步的。这样我们可以在本地的电脑上,去编辑项目的文件,然后在虚拟机,可以运行它们。

进入到项目所在的目录 ... 然后启动虚拟机 ...

vagrant up

启动的时候,会出现提示,说虚拟机根目录下面的 vagrant ,跟我们的项目的目录是同步的。

先 ssh 到虚拟机 ...

vagrant ssh

然后进入到根目录下面的 vagrant 里面。 可以使用 cd 命令改变工作目录 ...

cd /vagrant

查看一下这个目录里的东西 ...

ls

你会看到,这里有一个 Vagrantfile 文件 ...

下面,我们可以在本地电脑上,在项目所在的目录里面,添加点东西 ... 打开编辑器 ... 这里我用的是 Brackets 编辑器 ...

打开目录 ... 找到桌面上的项目所在的目录 ... 就是 ninghao 这个目录

然后在这个项目目录里面,再新建一个目录 ... 可以命名为 www

然后在这个 www 目录下面,再新建一个 html 文件 ... 命名为 index.html

简单的在这个文件里添加点东西 ...

! <h1>hello ninghao :)</h1>

保存 ...

然后,我们可以再去看一下虚拟机的 vagrant 这个目录 ...

输入 ls ...

你会看到这里会多了一个 www 目录 ...

再查看一下 www 这个目录 ... ls www

在这里,会出现之前我们在编辑器里创建的这个 index.html ,再去查看一下这个文件里的内容 ..

cat www/index.html

显示的东西跟我们在编辑器里输入的东西是一样的。

10)配置共享目录

如果你有额外的目录要跟虚拟机同步的话,可以通过修改 Vagrantfile 这个文件,去添加这些额外的共享目录 ...

我们可以使用编辑器,打开项目里面的 Vagrantfile 这个文件 ... 这个文件是用 ruby 语言写的 ...

在这里,找到 config.vm.synced_folder ... 虚拟机的同步目录的相关配置 ...

去掉这行代码前面的注释符号 ... 可以让这行代码起作用。

这个配置后面的第一个参数就是在本地电脑上的一个目录 ... 两个点一个斜线,表示当前目录的上一级目录 ... data 就是目录的名字 ... 在它后面就是虚拟机上的一个目录 ..

/vagrant_data ,表示根目录下面的 vagrant_data 这个目录 ...

它的意思就是,当前这个项目的上一组目录的 data 这个目录,跟虚拟机上的根目录下面的 vagrant_data 设置成同步的目录。

另外,还有一些选项,输入一个逗号 ... 然后把 create,设置成 true ... 这样电脑上的这个同步的目录不存在的话,就会创建一个 ..

再输入一个逗号 ... 我们还可以设置一下这个目录在虚拟机上的拥有者,还有所属的群组 ...

这里我们把 ower ,也就是目录的拥有者,设置成 root ... 再添加一个 group ,把它也设置成 root 。这样在虚拟机上根目录下面的这个 vagrant_data 目录的拥有者会是 root ,所属的群组也会是 root ...

config.vm.synced_folder "../data", "/vagrant_data",
create: true, owner: "root", group: "root"

保存一下 ...

回到命令行 ... 我们可以重启一下虚拟机 ...

vagrant reload

在这里,你会看到提示,除了项目目录跟根目录下面的 vagrant 是同步的目录以后,还有 data 目录会跟根目录下面的这个 vagrant_data 也是同步的目录 ...

ssh 到虚拟机 ... vagrant ssh

进入到虚拟机的根目录 ... cd /

然后查看一下根目录下面的所有的东西 ... ls -la

在这里,你会发现,vagrant 这个目录的拥有者与群组会是 vagrant ,也就是当前连接到虚拟机的用户的名字 ...

再看 vagrant_data 这个目录,它的所有者是 root ,所属的群组也会是 root ... 因为我们手工配置了它的所有者还有群组。

网络
11)网络配置

我们的电脑要跟虚拟机之间进行通信,比如你可能希望在虚拟机上配置成一台 Web 服务器,你打算在自己的电脑的浏览器上,打开在虚拟机上搭建的 Web 服务器,或者,你可能希望让同在一个网络里面的其它的设备,也可以访问到在虚拟机上搭建的 Web 服务器。

这就需要我们去配置一下 ...

Vagrant 提供了三种方法,私有网络,,公有网络,还有端口转发。

端口转发的方法就是,你可以配置好要转发的端口,比如把 8080 端口转向 80 端口。这样你在自己的电脑上访问 localhost:8080 ,会转发到虚拟机的 80 端口。

这种方法不太灵活,因为你需要手工去配置所有需要转发的端口。

私有网络的功能就是为虚拟机手工指定一个 ip 地址,通过这个 ip 地址,你的电脑可以与虚拟机进行通信。并且,只能通过你的电脑访问虚拟机。也就是,如果你在虚拟机上搭建了一台 Web 服务器,这台服务器,只能在你的电脑上访问。

公有网络的配置会把虚拟机配置成一台可以在同一网络里访问的设备。

比如你的电脑是在一台路由器配置好的网络里面,那么在这个网络里面的其它的设备,也可以访问到你的虚拟机,比如其它的电脑,平板电脑或者手机 ...

12)私有网络

下面, 我们去配置一个私有网络。先用编辑器打开项目里的 Vagrantfile 文件 ...

然后找到 config.vm.network "private_network" ... 私有网络的配置 ... 去掉这行代码前面的 # 号 ...

你可以修改这个 ip 地址 ... 这个 ip 地址会是虚拟机的 ip 地址,通过它,你的电脑就可以访问到虚拟机了。

复制一下这个 ip 地址 ... 然后保存一下这个文件 ..

回到命令行工具 ... 重启一下虚拟机 ...

vagrant reload

在启动虚拟机的时候,你会看到配置网络的提示信息 ...

启动以后,我们的电脑与虚拟机之间就可以通信了。确定你的电脑能不能跟虚拟机通信,可以使用 ping 命令 ...

输入 ping ... 后面再加上虚拟机的 ip 地址 ...

ping 命令会向指定的主机发送数据包,主机收到数据包会返回信息,如果你能看到这个 time 等于多少毫秒 ... 就说明,你可以跟这台主机通信 ...

ctrl + C

可以停止执行这个任务 ...

如果出现 timeout 或者 unreachable 之类的提示,就说明你不能跟这个主机通信 ..

下面,我们再连接到虚拟机 ...

vagrant ssh

然后输入 ifconfig ...

这个命令可以配置系统的网络 ... 这里会给我们返回一些有用相信 ... 你会看到,这个 eth1 ,它的 ip 地址,就是我们在配置虚拟机私有网络的时候,手工设置的那个 ip 地址 ...

13)公有网络

如果你想让在同一网络里面的其它的设备,也可以访问虚拟机的话,我们需要去配置一下共有网络。

打开项目里面的 Vagrantfile 文件 ... 注释掉之前配置私有网络的这行代码 ... 在它前面加上一个 # 号 ...

再找到 config.vm.network "public_network"

去掉前面的注释符号 ... 然后再保存一下文件 ...

打开命令行工具 ... 重启一下虚拟机

vagrant reload

在启动的时候,你会看到网络配置的提示信息 ...

如果你跟我一样,用的是无线路由,在这里,你可能要选择 1 ..

启动以后,在同一网络,比如同一个局域网里面的其它的设备,都可以访问到这个虚拟机了 ..

不过我们要知道虚拟机的 ip 地址 ...

先 ssh 到虚拟机 ...

vagrant ssh

输入 ifconfig ...

eth1 应该就是现在这台虚拟机在内网里面的 ip 地址 ... 这个地址应该是通过路由器自动分配的 ....

复制一下它 ...

打开一个新的命令行的窗口 ... 然后使用 ping 命令去检测一下 ..

ping x.x.x.x

你会发现,你的电脑跟虚拟机是通的...

你可以再同一网络里面的其它的设备上,使用类似的方法去试一下,应该也可以跟虚拟机通信 ...

14)搭建一个 Web 服务器

下面,我们可以在虚拟机上搭建一个 Web 服务器来测试一下配置好的网络。

启动虚拟机以后,再 ssh 到虚拟机 ... vagrant ssh

然后去安装一个 Web 服务器,你可以参考宁皓网的相关课程,去配置你想要的 Web 服务器。这里我们可以去安装一个 apache 服务器 ..

sudo yum install httpd ...

完成以后,再去安装一下 vim 编辑器 ...

sudo yum install vim

然后去编辑一下 apache 的配置文件 ...

sudo vim /etc/httpd/conf/httpd.conf

浏览到这个文件的最底部 ... 可以按一下大写的 G 键 ...

配置一个 apache 的虚拟机的功能 ... 按一下小 i 进入到编辑模式 ..

在虚拟机与项目共享的目录里面,我之前已经创建好了一个叫 www 的这个目录,我们可以把它作为这个虚拟机的根目录 ...

在这个目录里面,我之前已经新建了一个 index.html 文件 ...

配置好以后,保存一下 ... esc 退出编辑模式 .. 再输入 :wq

我们可以查看一下根目录下面的 vagrant 里面的 www 下面的 index.html 这个文件的内容 ...

然后启动一下 httpd ...

sudo service httpd start

因为之前我们已经配置好了网络,这里可以查看一下虚拟机的 ip 地址 ...

ifconfig

现在,用这个 ip 地址就可以访问在这个虚拟机上搭建的 Web 服务器了 ...

打开浏览器 ... 输入虚拟机的 ip 地址 ...

这里显示的,应该就是根目录下面的 vagrant 里面的 www 这个目录里面的东西 ...

因为 /vagrant 跟我们的电脑上面的项目的目录是同步的,所以,你可以直接在本地开发项目,然后通过在虚拟机上配置好的环境去运行项目。

1)重新打包 - package

你可以在虚拟机里安装并且配置好需要的环境,然后对它进行重新打包,再把打包之后的 box 安装到系统里面。这样以后在创建项目的时候,我们就可以使用这个新打包的 box 了。

先进入到项目所在的目录,然后启动一下虚拟机 ...

vagrant up

在这个虚拟机,我们之前已经安装好了 httpd ,还有 vim ...

对它进行打包 ... 可以使用 vagrant package 命令 ... 不过再打包之前,需要先清理一样东西 ... ssh 到虚拟机

vagrant ssh

然后使用 rm 命令,删除一个文件 ...

sudo rm -rf /etc/udev/rules.d/70-persistent-net.rules

如果不删除这个文件的话,在使用这个 box 的项目在配置好网络的时候启动以后会遇到问题。

完成以后退出一下 ... exit

打包,用的是 vagrant package ....

完成以后,会在项目的目录下面,生成一个叫 package.box 的文件 ...

下面,我们可以使用 vagrant box add ,去安装一个新的 box ..

vagrant box add 后面加上一个名字,这个名字会显示在 box 的列表里面。 这里我叫它 ninghao/centos-6.5 ...

输入一个空格,再指定一下 box 的地址 ... 因为这里我们在项目的目录下面有一个打包以后生成的 box ,它就是 package.box ...

回车 ... 这样会安装一个新的 box ,

完成以后, 我们就可以把这个生成的 box 删除掉了 ...

rm -rf package.box

查看一下 box 列表 ...

vagrant box list

你会看到一个 ninghao/centos-6.5

下面,我们可以使用这个 box 去初始化一个项目 ...

回到桌面 ... 新建一个目录 ... mkdir ninghao1 ... 进入到这个目录里面 ... cd ninghao1

再去初始化一下 ... vagrant init ,这里我们可以使用新安装的这个 box ...

vagrant init ninghao/centos-6.5

再启动虚拟机 ... vagrant up

然后 ssh 到虚拟机上 ... vagrant ssh

因为在打包之前, 我们在虚拟机上安装了 httpd,也就是 apache 服务器 ...

这里我们可以输入 which httpd ...

会显示出 httpd 的位置,说明现在这个虚拟机上已经安装了 httpd 服务

下面,我们再去查看一下 httpd 的配置文件 ... 因为我们在打包之前也已经安装了 vim 编辑器。所以可以直接使用它 ..

sudo vim /etc/httpd/conf/httpd.conf

浏览文件的最底部 ..

你会看到,这个配置文件也是我们在打包之前修改好的那个配置文件。

如果你想移除到安装在系统里的 box ,可以使用 vagrant box remove ,后面加上要移除掉的 box 的名字就行了。

多主机
16)多主机

有时候我们的项目不仅仅需要一台服务器。比如我们可能会把 web 服务分给一台或者几台服务器,把数据库放到一台服务器上,把搜索放到一台服务器上。这样我们在本地创建开发环境的时候,也需要模拟一下真实的情况,也就是你可能需要为一个创建创建几台虚拟机,然后在这些虚拟机上去配置相应的服务。这样做的好处就是能够接近真实的情况。

vagrant 本身就带了一个多主机的功能,它可以让我们使用一个 vagrantfile 去定义多台虚拟机。然后你可以分别启动他们,并且 ssh 到这些主机上。每台主机都可以有自己的特别的配置。我们可以把网络配置好,这样这些主机之间可以相互进行通信。

在下面的视频里,我们会去创建两台主机,一个可以用来开发,一个可以去模拟生产环境。在其它的跟工作流程相关的课程里,我们会遇到这样的情况,主要就是为了演示怎么样在本地开发的网站与生产环境的服务器之间进行同步。

17)定义多个主机

进入到你想保存项目的位置,然后为项目去创建一个目录 ... 使用 mkdir 这个命令去创建一个目录 ... mkdir workflow-project ... 在 Windows 上创建目录应该使用 mk 这个命令。再进入到这个目录 ... cd workflow-project ...

先去初始化一下,也就是在这个项目的目录下面创建一个 vagrantfile ,你可以使用自己配置好的 box 去初始化 ... vagrant box list ... 可以列出在我的电脑上所有可用的 box ... 这里我要使用 ninghao 这个 box ... 所以,可以输入 vagrant init ... 后面加上 box 的名字 .. ninghao ... 回车 ... 去执行一下 ...

vagrant init ninghao

我们可以再用编辑器打开这个目录下面的 vagrantfile 文件 ... 使用图形界面打开项目的目录 ... open .

再找一个编辑器去编辑一下 vagrantfile ... 这里我用的是 Brackets 编辑器 ... 打开以后,可以选择一下语言,这个配置文件是用 ruby 写的 ... 在窗口的右下角这里,选择 Ruby ...

在这个配置文件里,我们可以去定义一下需要的主机。 要用的是 config ,vm,的 define 这个方法 ... 在这个 configure 这段代码的里面,再输入一个 config.vm.define .. 后面加上主机的名字 ... 比如我这里先去添加一个主机叫做 development ... 后面再加上一个 do ... 再指定一个参数 ... 用两个竖线,在它的里面,可以使用定义的这个主机的名字 ... development ... 另起一行 ... 在这段代码的结尾再用一个 end 结束 ...

config.vm.define "development" do |development|
end

在这个 config 还有 end 之间,我们可以单独去给这个主机添加配置,比如去配置一下这台主机的网络,主机名等等,在后面的视频里我们再去看一下。

另起一行,使用类似的方法,再去定义一台主机。 这回我们再定义一个叫 production 的主机。

config.vm.define "production" do |production|
end

然后保存一下这个配置文件 ... 这样我们就定义好了两台主机,一个叫 development ,另一个叫 production 。再回到命令行 ... 可以再查看一下主机的状态 ... 输入 vagrant status ...

这里会列出两个主机,他们的状态现在都是 not created ... 因为我们还没有运行 vagrant up ... 输入 vagrant up .... 这个命令现在默认会启动定义的所有的主机.... 如果你只想启动某个主机的话,可以在后面再加上这台主机的名字 ... 先把这两台主机都启动一下 ... 回车 .. 执行一下 ...

vagrant up

完成以后再查看一下状态 vagrant status ... 现在会显示这两台主机的状态都是 running,表示已经启动了 ... 想要 ssh 到某台主机的话,可以这样 ... 输入 vagrant ssh ... 后面再加上主机的名字 ... 先连接到 development 这台主机 ...

vagrant ssh development

然后再新建一个终端的标签 ... 进入到项目所在的目录以后,再 ssh 到 production 这台主机上 ...

vagrant ssh production ...

现在我们使用了一个 vagrantfile 创建了两台主机,启动,并且使用 ssh 分别连接到了它们。不过现在它们之间还不能通信,在下面的视频里,我们再去配置一下这两台主机的网络。

18)多主机的网络配置

如果是多个主机使用的同样的配置,这些东西可以放在定义主机的代码块以外 ... 比如这个 config.vm.box ,这里设置的是主机使用的 box ,这个配置是在主机定义的代码以外,所以,如果不单独去为主机配置的话,这里我们定义的这两台主机,使用的 box ,都会是这个 ninghao。

首先要分别为两个主机设置的就是网络,在前面的视频里已经介绍过了设置公有网络还有私有网络的方法,如果你想让其它的设备或者主机能访问这两个主机的话,需要使用公有网络。如果你觉得这两台主机之间能相互相信就可以了,我们可以去设置一下私有网络。设置私有网络的好处就是,你不需要组建一个自己的局域网,一般来说,就是你不需要有一台路由器。

在这个定义主机的 config 还有 end 之间,可以去添加要配置的东西。先输入在上面传递进来的这个参数的名字,这里就是这个主机的名字 .. development.vm.network ... 后面是网络的类型,这里我们配置一个私有网络 ... 先输入一组引号,然后是 private_network ,表示私有网络。逗号分隔一下 ... 接着是在这个私有网络里面,这台主机的 ip 地址,这个 ip 地址,我们需要使用专门为私有网络保留的 ip 段 ... 另外,这个私有网络的地址段,不能跟你的公有网络的地址重复,比如你的路由器的 ip 地址段是 192.168.1.x ,这样的话你的私有网络地址段就不能是这个 ... 你可以设置成192.168.2.x ,或者是其它的 ...

这里我设置成 192.168.33.11 ...

development.vm.network "private_network", ip: "192.168.33.11"

再用类似的方法,去设置另一台主机的私有网络,还有它的 ip 地址 ... 复制一下 ... 粘贴过来 ... 把这个 development ,换成 production ,再改一下主机的 ip 地址 .. 设置成 192.168.33.22

production.vm.network "private_network", ip: "192.168.33.22"

保存 ... 再回到命令行 ... 我们可以重启一下这两个主机 ... 先退出 ssh 连接 .. 再输入 vagrant reload ... 如果后面不指定具体的主机名字的话,这条命令会重启所有的在 vagrantfile 里面定义的主机 ... 回车 ... 执行一下 ...

vagrant reload

完成以后,再分别 ssh 到这两个主机上 ... 然后输入 ifconfig ... 查看一下这台主机的 ip 地址 .. 这台主机的 ip 地址是 192.168.33.22 ... 也就是我们为 production 分配的 ip 地址 ...

再到另一台主机上 ... 再输入 ifconfig ... 它的地址是 192.168.33.11,这个就是 development 这台主机的 ip 地址 ... 确定两台主机之间是否能够通信,可以使用 ping 命令 ... 在这台主机上输入 ping ,后面可以加上 production 主机的 ip 地址,也就是 192.168.33.22 ... 你会看到 ping 得通 ... 说明可以进行通信 ... 同样你在 production 主机上,ping 一下 development 的 ip 地址,一样能 ping 得通。

19)多主机的主机名

目前我们定义的这两台主机的主机名,都是 localhost,ssh 到主机以后,可以使用 hostname 这个命令去查看一下主机名 ... 输入 hostname ... 显示出来的就是 localhost ... 注意使用 ssh 登录以后,在这个 @ 符号前面是 ssh 登录的用户名,后面这块就是这台主机的主机名 .. .

在系统里面,我们可以直接去修改主机名,可以去编辑一下 /etc/sysconfig/network 这个文件 ... 或者,在 vagrantfile 里面,可以去配置一下主机的主机名 ... 这样在启动以后,vagrant 会自动给我们设置好主机的主机名 ...

先退出一下 .. 然后编辑一下 vagrantfile ... 在定义这两台主机的代码里面,去指定一下主机的主机名 ... development.vm.hostname ... 等于 ninghao-dev ,这里的这个 ninghao-dev 就是主机的主机名 ..

development.vm.hostname = "ninghao-dev"

再用类似的方法去设置一下另一台主机的主机名 ...

production.vm.hostname = "ninghao-prod"

保存 ... 再去重新启动一下 ... vagrant reload ... 然后再 ssh 到主机 ... 输入 hostname ... 你会看到这里显示的是 ninghao-dev ... 注意现在我的这个命令提示里面,也会出现这个新设置的主机名了 ...

再看一下另一台主机 ... 先 ssh 一下 ... 再输入 hostname ,同样显示的就是我们为这台主机设置的主机名 ... 下面,我们可以再查看一下系统里面的 network 这个文件 ... cat /etc/sysconfig/network ...

注意这里有一个 HOSTNAME ,它后面的值就是主机名 . .. 你也可以直接去编辑这个文件里的这个 HOSTNAME 的值,这样就能改变这台主机的主机名了。保存以后,需要再重新启动一下网络,可以使用 service network restart ...

20)多主机的共享目录

现在我们创建的这两台主机,默认情况下,会有一个共同的同步目录。也就是,默认都会使用这个项目所在的目录,作为主机与我们电脑之间的同步目录。这个同步的目录在我们电脑上就是项目的目录 ... 要主机上,默认就是 /vagrant 这个目录 ...

下面,我们可以单独为每台主机都去设置一个同步的目录 ...

先在我们的项目目录下面,新建两个目录 ... 这个可以命名为 development .. 它可以作为跟开发的主机同步的目录 ... 再去给 production 主机创建一个同步的目录 ... 它的名字也可以是 production ...

然后再去编辑一下 vagrantfile ... 在定义 development 这台主机的代码中间,去设置一下同步的目录 ... development.vm.synced_folder ... 然后是本地电脑上的目录 ... 这里就是 "development" ... 也就是刚才我们创建的 development 这个目录 ... 用一个逗号分隔一下 .. 再指定一下主机上的目录 ... 这里我们设置成 "/vagrant"

再用类似的方法,去设置一下 production 这台主机的同步目录 ... 复制一下这行代码 ... 粘贴过来 ... 然后再修改一下 ... 把这个 development 改成 production ...

保存一下 ... 再回到命令行 ... 重启一下 ... vagrant reload ... 现在 development 这台主机的同步目录就是项目下面的 development 这个目录 ... 也就是你可以把想要跟开发主机同步的文件,放到这个 development 目录里面。

把要跟 production 主机同步的文件放到这个 production 目录里面。在这两台主机上面,你可以在 /vagrant 这个目录里面,找到这些同步的文件。

普通分类: