虚拟化和容器化是近几年非常流行的概念。它使用“隔离”来隔离不同服务的依赖和配置,大大降低管理成本和维护负担。Vagrant是一个抽象层次更高的虚拟环境配置工具,基于virtualbox或docker。通过配置文件定义虚拟环境的参数,然后vagrant就可以自动为你处理这些繁琐的事情。接下来是不是该折腾一下vagrant如何模拟集群,搞devops了?不不不,我用这个大锤的初衷是杀鸡用牛刀,把它当成方便自动化的linux虚拟机,哈哈。沙盒环境在平时的学习和折腾中,比如看到一个新东西,想自己搭建一个看看,玩一玩。这时候,如果你在自己的主系统中摆弄各种陌生的应用和服务,一来,一旦出了问题,系统可能会被炸掉,二来,系统本身的复杂环境也会影响到服务和服务的构建。应用程序。而且,在自己的系统上安装服务和在远程主机上安装服务是完全不同的,无论是ssh还是最终体验自己的结果。所以,我需要:一个完全隔离的沙箱环境,以及一个完整的linux系统,就像一个远程主机。对于一个买不起阿里云的码农来说,虚拟环境会给人一种远程主机的错觉。一种选择是virtualbox,但初始配置和安装很麻烦。而且使用virutlabox的命令行工具有点麻烦。所以,用vagrant解决这个问题。vagrantvagrant安装虽然debian的源中有vagrant,但还是建议从官网下载安装最新版本。老版本的vagrant有一些bug,之前使用的时候遇到过。使用命令:sudoapt-getinstallvirtualboxwgethttps://releases.hashicorp.com/vagrant/2.1.4/vagrant_2.1.4_x86_64.debsudodpkg-ivagrant_2.1.4_x86_64.deb由于vagrant是virtualbox的前端,如果没有安装virtualbox的话,必须先安装virtualbox。安装虚拟机,执行命令:mkdir~/myproject&&cd~/myprojectvagrantinitdebian/contrib-jessie64vagrantup#下载box镜像,安装vagrantinit命令,在本地目录创建一个vagrantFile。打开这个文件,可以看到:Vagrant.configure("2")do|config|config.vm.box="debian/contrib-jessie64"endconfig.vm.box是debian/contrib-jessie64,这个配置指定了用什么镜像来初始化虚拟机。Vagrant为我们预制了大量丰富的图像,变成了盒子。比如上面的debian/contrib-jessie64,那么vagrant在初始化的时候,会下载对应的镜像,安装虚拟机。更多的盒子可以在这里找到:https://app.vagrantup.com/box...好了,当vagrantup执行成功后,虚拟机环境就创建好了。如果这时候打开virtualbox,你会发现vagrant实际上创建了一个virtualbox虚拟机。Vagrantfile在Vagrantfile中配置虚拟机的基本参数。网络配置首先是虚拟机网络。和virtualbox一样,它有三种网络:NAT映射。仅限主机。桥接。Vagrant默认使用NAT映射。虚拟机在私网内,通过NAT访问外网。这样宿主机就看不到虚拟机了,所以需要配置端口映射:config.vm.network"forwarded_port",guest:80,host:8080这样就把虚拟机的80端口映射到了端口主机的8080。第二种方式,私有网络,配置如下:config.vm.network"private_network",ip:"192.168.50.4"虚拟机和宿主机在同一个私有网络中,宿主机和虚拟机可以互访其他。但是这个私有网络是虚拟出来的,根本不连接外网,所以虚拟机是无法访问外网的。当然,从网络的角度来看,宿主机也在这个私有网络中,宿主机可以连接外网。理论上,通过将主机配置为跳板(桥接私有网卡和真实网卡),这个私有网络中的虚拟机也可以访问网络。第三种方式,桥接网络:config.vm.network"public_network"#DHCP获取ipconfig.vm.network"public_network",ip:"192.168.0.17"#Staticipconfig.vm.network"public_network",bridge:"en1:Wi-Fi(AirPort)”#指定桥接网卡。桥接网络就是把虚拟机和宿主机放在同一个网络中。如果宿主机通过无线网卡连接到自己的wifi,那么虚拟机也和真机一样连接到这个wifi,并且拥有wifi网络的ip地址。您可以根据自己的需要进行选择。比如我想自我催眠把这个虚拟机想象成一个远程服务器,我就用第三种方法,然后给一个主机名来访问里面的服务。SharedFolder默认情况下,Vagrant已经将存放vagrantfile的目录映射到了虚拟机的/vagrant中。当然你也可以自己配置添加更多的目录:config.vm.synced_folder"src/","/srv/website"主机名config.vm.hostname="myserver"主机名不仅仅用于网络,当有多个虚拟机的情况下,也用于标记和区分不同的虚拟机。内存和CPU默认为512M,修改配置如下:config.vm.provider"virtualbox"do|v|有效的。vagrantup启动虚拟机,vagranthalt命令关闭虚拟机,vagrantstatus检查运行状态。vagrantdestroy删除虚拟机。最重要的是,vagrantsshssh到虚拟机。docker和docker-compose的安装就完成了,至此我的虚拟远程服务器就搭建完成了。接下来,是时候在服务器上安装一些有趣的服务了。首先安装docker:sudoapt-getupdatesudoapt-getinstallapt-transport-httpsca-certificates\curlgnupg2software-properties-commoncurl-fsSLhttps://download.docker.com/linux/debian/gpg|sudoapt-keyadd-sudoadd-apt-repository\"deb[arch=amd64]https://download.docker.com/linux/debian\$(lsb_release-cs)\stable"sudoapt-getupdatesudoapt-getinstalldocker-ceDockerCompose是docker的一个辅助工具,可以将一套docker配置,启动参数等写入配置文件,然后通过dockercompose进行管理。安装docker-compose,这个工具是python写的,所以用pip安装:pipinstalldocker-composedockerinstallnginx由于使用了docker-compose,所以安装nginx非常方便,所有的配置文件都有文档说明。首先在本地新建一个目录,所有nginx相关的配置文件都放在这里:mkdirnginxcdnginx然后,编辑docker-compose.yml文件:#vim:setshiftwidth=2tabstop=2softtabstop=-1expandtab:version:'2'服务:nginx:图像:nginx:stable-alpinenetwork_mode:主机卷:-./conf:/etc/nginx-./html:/var/www/html-./log:/var/log/nginx端口:-"80:80"environment:-NGINX_HOST=your.domain-NGINX_PORT=80其中nginx:stable-alpine是选择的docker镜像。第一次启动时,会自动下载镜像并创建docker容器。这里docker镜像不存储任何状态信息,镜像中所有服务可以读写的文件目录都映射到宿主机的文件系统中。之后,执行docker-composeup来初始化容器。另外:如果docker-compose.yml被修改,执行这条命令重新创建容器。该命令还会在前台启动容器,并在容器中打印控制台日志,方便查看是否启动成功。请记住,容器内部不存储任何状态,并且必须映射所有文件系统读写以防止丢失。之后还需要配置nginx的配置文件,从docker-compose.yml可以看出,配置文件放在./conf中。我是直接从本机安装的nginx配置文件中复制过来的。一切配置完成后,使用docker-composestart启动服务。之后,使用dockerps查看正在运行的服务。使用docker-composestop停止服务。可以看出,使用docker将nginx容器化后,不仅运行实例与整个系统隔离,而且nginx的所有相关配置都可以存放在本地目录中。甚至可以直接提交到git。在另一台机器上,不管是什么环境,只要安装了docker和docker-compose,就可以从这些配置文件中通过docker-composeup快速创建和部署nginx服务。用docker安装redis通过docker部署redis也很简??单,不用担心版本、依赖和配置。第一个是dokcer-compose.yml文件:#vim:setshiftwidth=2tabstop=2softtabstop=-1expandtab:version:'2'services:redis:image:redis:4.0.5-alpinenetwork_mode:hostvolumes:-。/data:/dataports:-"6379:6379"command:[redis-server,'--appendonly','yes']好了,docker-composeup初始化完成后,docker-composestart就可以启动了。终于有了vagrant,让我在本地有了一个完整方便的linux沙箱环境,可以用来尝试各种新事物,检验我的新想法。有了docker,我可以先在本地配置调试需要的服务。由于docker的隔离性,只要本地的docker配置和服务配置正确,这些配置就可以直接快速部署到远程服务器上。以后有空的时候,我打算把我服务在国外vps的小水管上的配置,提取成一套配置文件,以后用这一套配置文件快速部署到那个vps上。
