您的位置:首页 > 运维架构 > Docker

用 vagrant 快速部署 docker 虚拟机集群

2016-12-29 11:26 513 查看

快速部署虚拟机集群(vagrant)

快速部署虚拟机集群是开发与测试团队面临的重要任务,常见的工具是 vagrant 与 docker machine。使用 vagrant 下载网上做好的虚拟机,速度“感人”!本文介绍 vagrant 在 VirtualBox 环境下创建 CentOS 虚拟机基础 Box 的方法,以及部署 docker 集群环境的应用。

highlights:

创建 CentOS Vagrant 基础 Box (CentOS 7 + docker engine + docker compose)

Vagrant 配置文件

Vagrant 管理虚拟机命令

创建管理 docker 虚拟机集群

环境准备

windows 10 一台

安装 Git Bash 2.11

安装 Oracle VirtualBox 5.1.X

全局配 Host Only 虚拟网卡一块 (IP addr : 192.168.56.1)

安装 vagrant 1.9.1

事先下载 CentOS-7-x86_64-Minimal-????.iso

目标:建立一个 CentOS 7 + docker engine + docker compose 虚拟机,配置成 manager1,worker1,worker2 的虚拟机集群,一键启动。

1、Vagrant 简介

Vagrant(VM a Grant Up)一键启动虚拟机。

Vagrant 的原始动机:将 VirtualBox (包括 VMWare,AWS)等建的虚拟机打一个包(box),配合Vagrantfile 配置文件,定义项目中虚拟机的 box 、主机名、网络、挂载、虚拟机启动脚本等,用一个 vagrant up 命令自动完成虚拟机软件运行环境(应用上云)。

Vagrant 原理



定义项目配置文件,Vagrantfile;

vagrant up 按配置获取 box,导入虚拟机。如果本地仓库没有,到市场下载;

设置虚拟机主机名,网络,外部文件系统挂载,执行启动脚本;

通过 vagrant 管理虚拟机的启动、挂起、ssh 进入虚拟机等。

按环境准备安装,比较简单。

2、准备创建 CentOS Vagrant Base Box

虚拟机镜像大小众人皆知阿,如果没有镜像站点,下载慢不说,你需要的系统有没有合适镜像也是问题。第一步就是自己动手,建立虚拟机的 box。好在网上也有不少资料!

原版:How to Create a CentOS Vagrant Base Box

中文整理后:Vagrant之创建一个基于CentOS的Vagrant Base Box

适应范围 CentOS,Ubuntu,这里以 CentOS7 Minimal 为例。

第一步:使用 ISO 镜像安装虚拟机

使用 CentOS-7-x86_64-Minimal-????.iso 在 VirtualBox 创建虚拟机

虚拟机名称:centos7-docker-vagrant

禁用声音与USB设备

网络:默认 NAT,设置 ssh 转发路由 guestssh,协议 tcp,端口 2222 映射到端口 22

创建 20G 左右虚拟盘

基础安装过程注意事项

开启网络

记住 root 的密码

第二步:升级 CentOS

ssh 连接虚拟机

打开 Git Bush,ssh 到虚拟机,方便 copy-paste 命令。(CentOS7 内置 ssh 并启动 sshd 了!)

$ ssh -p 2222 root@127.0.0.1


如果出现 ECDSA key fingerprint 错误,删除 ~/.ssh/known_hosts 文件中对应内容即可。

升级系统

$ yum update
$ reboot
$ yum update kernel
$ reboot


第三步:安装 virtualbox guest additions

这一步的任务是 Virtualbox 要重新构内核,以支持挂载主机的文件系统。

详细原文:CentOS 7 VirtualBox Guest Additions Installation

安装重构内核开发工具

$ yum install gcc make kernel-devel bzip2 wget


安装 VirtualBox Guest Additions

用VirtualBox 在虚拟机挂载 Guest Additions CDROM

然后执行以下命令

$ cd /mnt
$ mkdir cdrom && mount /dev/cdrom /mnt/cdrom
$ cd cdrom && ./VBoxLinuxAdditions.run


执行结果如下:

[root@localhost mnt]# mkdir cdrom && mount /dev/cdrom /mnt/cdrom
mount: /dev/sr0 写保护,将以只读方式挂载
[root@localhost mnt]# cd cdrom && ./VBoxLinuxAdditions.run
Verifying archive integrity... All good.
Uncompressing VirtualBox 5.1.12 Guest Additions for Linux...........
VirtualBox Guest Additions installer
Copying additional installer modules ...
Installing additional modules ...
vboxadd.sh: Building Guest Additions kernel modules.
vboxadd.sh: Starting the VirtualBox Guest Additions.

Could not find the X.Org or XFree86 Window System, skipping.


看到这个结果即成功拉!现在重启

$ reboot


第四步:创建 vagrant 并授权

修改主机名为:centos7-docker-vagrant

nmtui


这个文本ui还是很给力的。

添加用户组 admin 与用户 vagrant 并授权

$ useradd vagrant
$ passwd vagrant
密码每次都输入: vagrant
$ groupadd admin
$ usermod -G admin vagrant


修改 sudoers 文件,虚拟机 root 用户使用
visudo
命令

Add SSH_AUTH_SOCK to the env_keep option

Add the line %admin ALL=NOPASSWD: ALL


4000
个步骤是 vagrant 登陆后,执行 sudo 命令不用输入密码,修改结果:

$ visudo
# 在 Defaults   env_keep += "HOME" 下添加
Defaults    env_keep += SSH_AUTH_SOCK
# 在root    ALL=(ALL)       ALL下添加
%admin  ALL=(ALL) NOPASSWD:   ALL
Defaults:vagrant !requiretty


更改完成后退出root,vagrant用户 ssh 登陆,并执行
sudo ls
,查看是否能执行

$ ssh -p 2222 vagrant@127.0.0.1
vagrant@127.0.0.1's password:
Last login: Wed Dec 28 13:15:20 2016 from 10.0.2.2
[vagrant@centos7-docker-vagrant ~]$ sudo ls
[vagrant@centos7-docker-vagrant ~]$


如上所示,则表示配置正确.

第五步:让 vagrant ssh 无密码 ssh 连接虚拟机

$ mkdir .ssh
$ wget https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub $ mv vagrant.pub  .ssh/authorized_keys
$ chmod 0700 .ssh
$ chmod 0600 .ssh/authorized_keys
$ ls .ssh -l
-rw-------. 1 vagrant vagrant 409 12月 28 13:24 authorized_keys


要点 authorized_keys 有 409 个字节。

第六步:安装虚拟机上软件,如 docker 引擎等

安装 docker 引擎

$ ssh -p 2222 vagrant@127.0.0.1
vagrant@127.0.0.1's password:
Last login: Wed Dec 28 13:16:42 2016 from 10.0.2.2


务必使用 vagrant 安装测试 docker。详细参考:CentOS 7 安装 Docker。一般不需要配阿里云加速。

安装 compose

wget https://bootstrap.pypa.io/get-pip.py[/code] 
详细参考:docker 集群(单主机)部署web 应用入门(Nginx)

第七步:收尾工作

$  yum clean all


最后,关闭虚拟机
shutdown -h now


3、vagrant 使用

3.1 创建 CentOS Vagrant Base Box 并放入本地仓库

在主机上输入:

$ mkdir vagrant_getting_started
$ cd vagrant_getting_started
$ vagrant package --output centos7-docker.box --base centos7-docker-vagrant


其中 –base 参数表示虚拟机名称, –output 表述虚拟机Box文件。

构建 box 过程输出如下:

==> centos7-docker-vagrant: Clearing any previously set forwarded ports...
==> centos7-docker-vagrant: Exporting VM...
==> centos7-docker-vagrant: Compressing package to: C:/Users/pmlpml/vagrant_getting_started/centos7-docker.box


最后,我们把 box 放进本地仓库:

$ vagrant box add centos7-docker centos7-docker.box
$ vagrant box list


3.2 配置虚拟机

centos7-docker 可以看作为虚拟机的原型,下一步就是用 Vagrantfile 定制软件环境。

创建 Vagrantfile 描述模板

$ vagrant init centos7-docker


得到虚拟机描述 Vagrantfile

Vagrant.configure("2") do |config|
#虚拟机 box
config.vm.box = "centos7-docker"
end


配置虚拟机

修改 Vagrantfile

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

$vm_name = "vm1"

Vagrant.configure("2") do |config|
# box 名称
config.vm.box = "centos7-docker"
# 虚拟机名(virtualbox 的专用配置)
config.vm.provider "virtualbox" do |v|
v.name = $vm_name
end
# 主机名
config.vm.hostname = $vm_name
# 网络
config.vm.network "private_network", ip: "192.168.50.4", auto_config: false
# 启动脚本
config.vm.provision "shell", inline: <<-SHELL
echo hello world
echo ...
SHELL
end


这个脚本非常简介,ruby 风格。先定义一些全集变量,然后建立一个 Vagrant 配置变量
|config|
,然后定义你需要的内容,其中网络是私有网络,vagrant 会为虚拟机自动配一块 host-only 网卡,配地址 “192.168.50.4/24”。具体见官方手册。

更多重要内容包括(见官方手册):

ssh 配置

虚拟机目录与主机目录同步配置

网络配置

provision 配置

3.3 管理虚拟机

在 Vagrantfile 文件所在的目录,执行以下目录:

$ vagrant up  ## 启动虚拟机
$ vagrant ssh ## 不需要带任何参数,直接进入虚拟机
$ vagrant reload  ##用新配置加载启动虚拟机
$ vagrant halt  ## 关机
$ vagrant destroy ## 清除机器


3.4 创建 docker 虚拟机集群

在项目目录下,创建三个子目录 vm1、vm2、vm3

将前面建好的 Vagrantfile 拷贝到这些目录

修改不同目录中的 Vagrantfile 的主机,ip地址配置

在各目录中执行管理命令
vagrant up


事实上,用三个配置管理三台虚拟机是不必要的。一个 Vagrantfile 也可搞定。在开发阶段,简单的配置和独立的控制是绝对有价值的。如果喜欢一条命令,写个脚本就是了。

小结

vagrant 可方便实现虚拟机部署自动化与管理。使用管理非常简单,基本配置也不难,在基础的 box 上创建新 box 也容易。建立基础 box 有一定难度,要完成大规模节点的部署(包括安全)需要更好深入 Vagrant 的配置与各种插件(plugin)和应用环境(provider)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息