zeweig 2015-06-29
想了解多主机是如何定义和使用的, 所以又学习了一遍vagrant
1. vagrant virtualbox 下载安装
https://www.vagrantup.com/downloads.html
https://www.virtualbox.org/wiki/Downloads
查看安装在命令行输入vagrant
2. 添加box
把box理解为系统的镜像文件,或者是虚拟机本身
cd ~/test
vagrant box list //查看box列表
找到想要的box
https://atlas.hashicorp.com/boxes/search?utm_source=vagrantcloud.com&vagrantcloud=1
64位的很容易找到, 如果要找32位的, 这样搜索 centos 6.5 32
复制一下名字, chef/centos-6.5
在命令行安装, vagrant box add chef/centos-6.5
大小有几百M到几个G不一定, 如果觉得网速慢可以用下载工具下载下来, 然后进行vagrant box add 来安装, 本地安装需要使用--name参数
vagrant box add ~/Downloads/virtualbox.box --name sentos6.5
vagranb box list //现在就可以看到一个已经安装的box
3.初始化, 启动, 连接
cd ~/desktop
mkdir maxwelldu
cd maxwelldu
vagrant box list
vagrant init centos6.5 初始化
ls
vagrant up 启动
导入之前的box, 之前的box只会用到这一次, 以后box的修改只会影响当前的box
看到最后一行是共享目录的对应关系
vagrant ssh 连接, 默认会用vagrant用户来连接到box
windows用户下载putty, 然后连接127.0.0.1 端口为2222 用户 vagrant 密码也是 vagrant
4.启动, 停止, 重启, 销毁
vagrant status 查看状态
vagrant halt 停止
vagrant status
vagrant ssh
sudo yum install httpd
sudo service httpd status
sudo service httpd start
exit
vagrant suspend 将正在运行的内存存到硬盘上, 下次启动的时候再恢复到上次的状态
vagrant status
vagrant resume 或者 vagrant up 来恢复
vagrant ssh
sudo service httpd status 查看状态, 发现还是启动着的
exit
vagrant reload 重启, 先关机, 再启动
vagrant destory 不会删除之前添加的box, 只会删除当前的box, 如果希望完全删除某个已经初始化的vagrant
5.共享的目录
vagrant init
vagrant up
vagrant ssh
cd /vagrant
在本地打开编辑器brackets, 打开目录 ~/Desktop/maxwelldu
在里面建立一个www目录, 再www里面新建一个index.html
写点内容
再回到vagrant
ls
ls www
cat www/index.html
6.配置共享目录
打开Vagrantfile, 这个文件是用ruby语言写的
找到synced_folder , 把前面的#去掉就打开了
config.vm.synced_folder "../data", "/vagrant_data"
"../data" 表示当前物理机上的当前目录上一级的data目录, "/vagrant_data" 表示虚拟机上面的目录
config.vm.synced_folder "../data", "/vagrant_data", create:true, owner:"root", group:"root"
在后面添加一个create选项, 设置为true,默认只是flase.如果值为true,vagrant up的时候会帮你再主机里面创建这个要同步的目录, 后面表示将虚拟机上面目录的拥有者为root, 组也为root
vagrant_data的拥有者和组都是root
exit
vagrant reload
重启完了发现除了之前同步的目录之外, /vagrant_data也是一个同步的目录
vagrant ssh
cd /
ls -la 发现vagrant的用户和群组是vagrant, 下面有一个vagrant_data, 他的用户和群组都是root
7.网络配置
私有网络 private_network 为虚拟机手工的指定一个ip地址, 只能在自己机器上访问
公有网络 public_network 可以配置为在同一个网络的设备可以访问, 比如你的电脑是在一台路由器配置好的网络里面, 在这台网络里面的其他设备也可以访问到你的虚拟机
端口转发 比如本地端口8080, 配置转发到虚拟机上的80端口, 这种不是很灵活, 使用较少
8.私有网络
打开Vagrantfile
修改config.vm.network "private_network"
比如配置为: config.vm.network "private_network", ip: "192.168.33.22"
exit;
vagrant reload
ping 192.168.33.22
ctrl+c 停止, 没有出现timeout就说明能够ping通
vagrant ssh
ifconfig
查看eth1 的网络地址就是我们手工设置的网络地址
9.公有网络
同一个网络的设备也可以访问的话, 打开Vagrantfile的文件, 把私有网络的配置注释起来, 打开public_network
exit;
vagrant reload
如果是使用的wifi连接, 请选择1
vagrant ssh
ifconfig 查看eth1, 这个是在内网的ip地址, 复制这个ip地址, 打开新的命令窗口, 用ping检查一下, 可以在同一个网络的其他设备上面也ping一下, 应该也可以通信
ping 192.168.31.112
10.搭建一个Web服务器
sudo yum -y install httpd
sudo yum -y install vim
sudo vim /etc/httpd/conf/httpd.conf
G
i
打开以下行并修改内容如下
NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot /vagrant/www
</VirtualHost>
:wq
cat /vagrant/www/index.html
sudo service httpd start
ifconfig 查看一下ip地址
现在就可以在本地开发项目, 然后通过在虚拟机上配置好的环境来运行项目
192.168.31.112 在物理机访问, 发现访问不了, 报错信息, httpd: apr_sockaddr_info_get() failed for MiWiFi-R1D
解决问题地址: http://www.metsky.com/archives/25.html
后面换成私有网络之后不能启动, 建议可以不要尝试公有网络
vagrant destroy 删除
rm Vagrantfile
vagrant init
vim Vagrantfile 打开私有网络
vagrant up
vagrant ssh
...
11.打包
vagrant ssh
sudo rm -rf /etc/udev/rules.d/70-persistent-net.rules //打包前的准备
exit
vagrant package
vagrant box add 打包好的box目录
vagrant box list
vagrant init 新添加的box名称
后面可以将这个box传给其他队友使用
12.多主机
在本地配置多台服务器, 可能多台web服务器, 数据库服务器, 每台服务器都可以有独立的配置, ip地址,
多主机就是解决怎么样将本地开发的网站与正常的服务器环境同步
13.定义多主机
cd ~/Desktop/maxwelldu/projects
mkdir workflow-project
cd workflow-project
vagrant box list
vagrant init sentos6.5
open .
编辑Vagrantfile
在config.vm.box 下面定义两台主机
config.vm.define "development" do |development|
end
config.vm.define "production" do |production|
end
这样就定义好了两台主机
vagrant status
看到两台是没有创建
vagrant up 默认会启动所有的主机, 如果只想启动某一台, 后面跟上名字就行
vagrant ssh development 连接到development机器, 现在两台机器都启动了, 不过还不能互相通信
control+t
vagrant ssh production
14. 多主机的网络设置
如果多台主机是同样的配置则可以写在定义的主机之外, 在config.vm.box = "sentos6.5" 下面写
前面介绍了公有网络和私有网络, 私有网络的好处是不需要组织一个局域网
我们现在单独给两台主机配置一下私有网络
配置如下
config.vm.define "development" do |development|
development.vm.network "private_network", ip:"192.168.33.11"
end
config.vm.define "production" do |production|
production.vm.network "private_network", ip:"192.168.33.22"
end
exit
vagrant reload 不指定会重启Vagrantfile下定义的所有的主机
vagrant ssh
ifconfig
在11的主机上面ping 22
在22的主机上面ping 11 检查是否能够正常通信
15.多主机的主机名
Hostname 是一个用来设置或显示当前主机,域或者系统的节点名的程序.许多联网程序使用这些名字来标识机器.NIS/YP同样也使用域名.
现在两台主机的主机名都是localhost
vagrant ssh development
hostname 查看主机名
vim /etc/sysconfig/network 下面去修改, 或者在Vagrantfile里面去配置, 当启动以后,vagrant会自动的设置主机名
配置如下:
config.vm.define "development" do |development|
development.vm.network "private_network", ip:"192.168.33.11"
development.vm.hostname = "maxwelldu-dev"
end
config.vm.define "production" do |production|
production.vm.network "private_network", ip:"192.168.33.22"
production.vm.hostname = "maxwelldu-prod"
end
vagrant reload
vagrant ssh development
hostname 查看发现是我们配置的
vagrant ssh production
hostname
cat /etc/sysconfig/network 可以看到HOSTNAME后面的值就是主机名, 可以直接修改这个值, 修改完了 service network restart就可以生效
16.多主机的共享目录
现在这两台主机都会有共同的同步目录, 也就是默认的都会使用项目的目录, 现在可以单独为第一台主机配置一个目录
mkdir development
mkdir production
设置同步的目录
vim Vagrantfile
配置如下:
config.vm.define "development" do |development|
development.vm.network "private_network", ip:"192.168.33.30"
development.vm.hostname = "maxwelldu-dev"
development.vm.synced_folder "development", "/vagrant", create:true
end
config.vm.define "production" do |production|
production.vm.network "private_network", ip:"192.168.33.31"
production.vm.hostname = "maxwelldu-prod"
production.vm.synced_folder "production", "/vagrant", create:true
end
学习和参考地址:
http://ninghao.net/video/1570
http://ju.outofmemory.cn/entry/101490
http://my.oschina.net/jingxing05/blog/158267
http://www.douban.com/note/322249262/