用 vagrant 快速部署 docker 虚拟机集群
时间:2017-02-18 02:19 来源:linux.it.net.cn 作者:IT
快速部署虚拟机集群是开发与测试团队面临的重要任务,常见的工具是 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
-
-
全局配 Host Only 虚拟网卡一块 (IP addr : 192.168.56.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
这个步骤是 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
详细参考: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)。
(责任编辑:IT)
快速部署虚拟机集群是开发与测试团队面临的重要任务,常见的工具是 vagrant 与 Docker machine。使用 vagrant 下载网上做好的虚拟机,速度“感人”!本文介绍 vagrant 在 VirtualBox 环境下创建 CentOS 虚拟机基础 Box 的方法,以及部署 docker 集群环境的应用。 highlights: 创建 CentOS Vagrant 基础 Box (CentOS 7 + docker engine + docker compose) Vagrant 配置文件 Vagrant 管理虚拟机命令 创建管理 docker 虚拟机集群 环境准备
目标:建立一个 CentOS 7 + docker engine + docker compose 虚拟机,配置成 manager1,worker1,worker2 的虚拟机集群,一键启动。 1、Vagrant 简介
Vagrant 的原始动机:将 VirtualBox (包括 VMWare,AWS)等建的虚拟机打一个包(box),配合Vagrantfile 配置文件,定义项目中虚拟机的 box 、主机名、网络、挂载、虚拟机启动脚本等,用一个 vagrant up 命令自动完成虚拟机软件运行环境(应用上云)。 Vagrant 原理
按环境准备安装,比较简单。 2、准备创建 CentOS Vagrant Base Box虚拟机镜像大小众人皆知阿,如果没有镜像站点,下载慢不说,你需要的系统有没有合适镜像也是问题。第一步就是自己动手,建立虚拟机的 box。好在网上也有不少资料! 原版:How to Create a CentOS Vagrant Base Box 中文整理后:Vagrant之创建一个基于CentOS的Vagrant Base Box 适应范围 CentOS,Ubuntu,这里以 CentOS7 Minimal 为例。 第一步:使用 ISO 镜像安装虚拟机
第二步:升级 CentOSssh 连接虚拟机 打开 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
$ 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 并授权
nmtui 这个文本ui还是很给力的。
$ useradd vagrant $ passwd vagrant 密码每次都输入: vagrant $ groupadd admin $ usermod -G admin vagrant
这个步骤是 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 详细参考: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”。具体见官方手册。 更多重要内容包括(见官方手册):
3.3 管理虚拟机在 Vagrantfile 文件所在的目录,执行以下目录: $ vagrant up ## 启动虚拟机 $ vagrant ssh ## 不需要带任何参数,直接进入虚拟机 $ vagrant reload ##用新配置加载启动虚拟机 $ vagrant halt ## 关机 $ vagrant destroy ## 清除机器 3.4 创建 docker 虚拟机集群
事实上,用三个配置管理三台虚拟机是不必要的。一个 Vagrantfile 也可搞定。在开发阶段,简单的配置和独立的控制是绝对有价值的。如果喜欢一条命令,写个脚本就是了。 小结vagrant 可方便实现虚拟机部署自动化与管理。使用管理非常简单,基本配置也不难,在基础的 box 上创建新 box 也容易。建立基础 box 有一定难度,要完成大规模节点的部署(包括安全)需要更好深入 Vagrant 的配置与各种插件(plugin)和应用环境(provider)。 (责任编辑:IT) |