第21章 Docker虚拟化实战

1.1 虚拟化技术概述及简介

IT行业发展到今天,已经从传统技术、传统运维发展到当下的主流技术、自动化运维,未来掌握核心技术是赶上时代变化,拉开跟别人差距的最关键因素。当下主流的IT三大技术:虚拟化、云计算、大数据之一的虚拟化技术。虚拟化技术也越来越广泛的应用在企业中,例如百度、阿里巴巴、腾讯、京东、Google等。

通俗的说,虚拟化就是把物理资源转变为逻辑上可以管理的资源,以打破物理结构间的壁垒,计算元件运行在虚拟的基础上而不是真实的基础上,可以扩大硬件的容量,简化软件的重新配置过程。

虚拟化技术允许一个平台同时运行多个操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率,是一个为了简化管理,优化资源的解决方案。

虚拟化解决方案的底部是要进行虚拟化的物理机器,这台机器可能直接支持虚拟化,也可能不会直接支持虚拟化,那么就需要系统管理程序层的支持。虚拟机管理程序(Virtual machine monitor),或称为 VMM,可以看作是平台硬件和操作系统的抽象化,VMM本质是我们常说的虚拟化技术软件。

1.2 互联网虚拟化技术种类

  • KVM
  • ESXI
  • XEN
  • Docker
  • Hyper-V
  • Open-vz

1.3 KVM虚拟化概念

KVM虚拟化全称为kernel-based Virtual Machine,是一个开源的系统虚拟化模块,基于内核的虚拟机 (KVM) 是针对包含虚拟化扩展(Intel VT 或 AMD-V)的 x86 硬件上的 Linux 的完全原生的虚拟化解决方案。

KVM是目前早期互联网广泛使用的虚拟化软件之一,最早由以色列的公司开发,现在已经被RedHat公司斥资1.07亿美元收购了KVM虚拟化管理程序厂商Qumranet,KVM虚拟化技术严格来讲,不是一个软件,而是Linux 内核里面的一种加速虚拟机的功能扩展。

自Linux 2.6.20之后集成在Linux的各个主要发行版本中。KVM的虚拟化需要硬件支持(如Intel VT技术或者AMD V技术)属于完全虚拟化。了解KVM之前,我们就需要了解KVM和QEMU、Libvirt有什么关系呢?

KVM是一款支持虚拟机的技术,是Linux内核中的一个功能模块。它在Linux2.6.20之后的任何Linux分支中都被支持。它还有一个条件,对硬件要求的条件,必须达到一定标准的硬件架构。

Qemu是什么呢。其实它也是一款虚拟化技术,就算不使用kvm,单纯的qemu也可以完全实现一个虚拟机。

那为何还会有Qemu-kvm这个名词呢?虽然kvm的技术已经相当成熟而且可以对很多东西进行隔离,但是在某些方面还是无法虚拟出真实的机器。比如对网卡的虚拟,这个时候就需要另外的技术来做补充,而qemu-kvm则是这样一种技术。它补充了kvm技术的不足,而且在性能上对kvm进行了优化。

Libvirt又是什么呢。它是一系列提供出来的库函数,用以其他技术调用,来管理机器上的虚拟机。包括各种虚拟机技术,kvm、xen与lxc等,不同虚拟机技术就可以使用不同驱动,都可以调用libvirt提供的api对虚拟机进行管理。我们创建的各种虚拟机都是基于libvirt库及相关命令去管理的。
IMG_257

1.4 ESXI虚拟化技术概念

Vmware 服务器虚拟化第一个产品命名为:ESX,后来Vmware在第4版本的时候推出了ESXI,ESXI和ESX的版本最大的技术区别是内核的变化。

从第4版本开始VMware把ESX及ESXi产品统称为vSphere,但是VMware从5版本开始以后取消了原来的ESX版本,所以现在VMware虚拟化产品vSphere其实本质是ESXI,只是两种叫法而已。官方称为vSphere虚拟化技术,个人也可以称为ESXI虚拟化技术。

VMware vSphere 是业界领先且最可靠的虚拟化平台。vSphere将应用程序和操作系统从底层硬件分离出来,从而简化了 IT操作。您现有的应用程序可以看到专有资源,而您的服务器则可以作为资源池进行管理。因此,您的业务将在简化但恢复能力极强的 IT 环境中运行。

VMware、vSphere、Essentials 和 Essentials Plus 套件专为工作负载不足 20 台服务器的 IT 环境而设计,只需极少的投资即可通过经济高效的服务器整合和业务连续性为小型企业提供企业级 IT 管理。结合使用 vSphere Essentials Plus 与 vSphere Storage Appliance软件,无需共享存储硬件即可实现业务连续性。

VMware ESXI虚拟化特点如下:

  • 确保业务连续性和始终可用的 IT;
  • 降低 IT 硬件和运营成本;
  • 提高应用程序质量;
  • 增强安全性和数据保护能力。

1.5 XEN虚拟化技术概念

XEN是一个基于X86架构、发展最快、性能最稳定、占用资源最少的开源虚拟化技术。Xen可以在一套物理硬件上安全的执行多个虚拟机,与 Linux 是一个完美的开源组合,Novell SUSE Linux Enterprise Server 最先采用了XEN虚拟技术。它特别适用于服务器应用整合,可有效节省运营成本,提高设备利用率,最大化利用数据中心的IT基础架构。

实际上XEN出现的时间要早于KVM虚拟化,它是由剑桥大学开发的,严格来讲,XEN是一个开源的虚拟机监视器,属于半虚拟化技术,其架构决定了它注定不是真正的虚拟机,只是自己运行了一个内核的例子。

XEN虚拟化,同时区分Xen+pv+和Xen+hvm,其中pv只支持Linux,而hvm则支持Windows系统。除此之外,XEN还拥有更好的可用资源、平台支持、可管理性、实施、支持动态迁移和性能基准等优势。

1.6 Docker虚拟化技术概念

Docker是一款轻量级、高性能的虚拟化技术,是目前互联网使用最多的虚拟化技术,Docker虚拟化技术的本质类似集装箱机制,最早集装箱没有出现的时候,码头上有许多搬运的工人在搬运货物,集装箱出现以后,码头上看到更多的不是工人,而且集装箱的搬运模式更加单一,更加高效,还有其他的好处。

将货物多打包在集装箱里面,可以防止货物之间相互影响。并且到了另外一个码头需要转运的话,有了在集装箱以后,直接把它运送到另一个码头即可,完全可以保证里面的货物是整体的搬迁,并且不会损坏货物本身。

Docker技术机制跟集装箱类似,Docker虚拟化 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。

Docker的基础是 Linux 容器(LXC)等技术。在LXC的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。

下面对比了Docker 和传统虚拟化(KVM、XEN、Hyper-V、ESXI)结构层级方式的不同之处,

图为传统虚拟化结构图:
IMG_258

图为Docker虚拟化结构图: IMG_259

Docker虚拟化跟传统VM比较具有如下优点:

  • 操作启动快:

运行时的性能可以获取极大提升,管理操作(启动,停止,开始,重启等等) 都是以秒或毫秒为单位的。

  • 轻量级虚拟化:

你会拥有足够的“操作系统”,仅需添加或减小镜像即可。在一台服务器上可以布署100~1000个Containers容器。但是传统虚拟化,你虚拟10-20个虚拟机就不错了。

  • 开源免费:

开源的,免费的,低成本的。由现代Linux内核支持并驱动。注* 轻量的Container必定可以在一个物理机上开启更多“容器”,注定比VMs要便宜。

  • 前景及云支持;

正在越来越受欢迎,包括各大主流公司都在推动docker的快速发展,性能有很大的优势。随着Go语言越来越被人熟知,Docker的使用也越来越广泛。

1.7 虚拟化技术实现方式

  • 完全拟化技术

通过软件实现对操作系统的资源再分配,比较成熟,完全虚拟化代表技术:KVM、ESXI、Hyper-V;

  • 半虚拟化技术

通过代码修改已有的系统,形成一种新的可虚拟化的系统,调用硬件资源去安装多个系统,整体速度上相对高一点,半虚拟化代表技术:Xen;

  • 轻量级虚拟化

介于完全虚拟化、半虚拟化之间,轻量级虚拟化代表技术:Docker。

1.8 CentOS6.x(6.5+)Linux Docker平台实战

掌握了Docker虚拟化概念和原理之后,最重要的就是要在生产环节中落地Docker,Docker虚拟化平台最早期只支持Linux操作系统,现在最新版Windows操作系统也慢慢支持Docker虚拟化。

本章节将选择不同的发行版本来构建Docker虚拟化平台,Linux操作系统主流发行版本包括:Red Hat Linux、CentOS、Ubuntu、SUSE Linux、Fedora Linux等,如下简要介绍即将部署Docker虚拟化平台的两个系统:CentOS和Ubuntu。

Docker官方要求Linux内核版本在3.8+以上,生产环境中尽量推荐使用3.10+的Linux内核版本,Docker从1.13版本起,采用时间线的方式作为版本号,Docker版本现在基于YY.MM,分为社区版(Community Edition)和企业版( Enterprise Edition),社区版是免费提供给个人开发者和小型团体使用的,而企业版会提供额外的收费服务。

社区版按照Stable和Edge两种方式发布,每个季度更新Stable版本,如17.06,17.09,每个月份更新Edge版本,如17.09,17.10。

虚拟化&Docker虚拟化技术本质的用途:

为了最大化的利用高配物理机的资源,提高硬件设备服务器的资源利用率,淘汰一些老、旧服务器,对老、旧服务器进行资源的重组、重用,满足企业飞快的发展。

虚拟化落地实施硬件设备选配上,尽量使用高配物理机资源,参考配置如下:

  • 服务器品牌:Dell R730、R820;
  • CPU配置:Intel 至强E5-2600系列;
  • MEM配置:ECC DDR3 256G;
  • DISK配置:SAS 12TB(最大支持24T);
  • NET配置:Intel四端口千兆网卡/双端口万兆网卡;
  1. 安装步骤和命令如下:

#安装Epel扩展源;
yum install epel-release -y
#安装Docker-io版本;
yum install docker-io lxc cgroup device-mapper* -y
#查Docker版本是否安装;
rpm -qa|grep -E “docker|lxc|device-mapper”
#启动Docker引擎服务;
service docker restart
#查看Docker服务进程;
ps -ef|grep docker

  1. 安装完成,如图所示:

I6DC]%3]3~$1%11TL@W[A9Q

  1. 查看启动进程如图所示:

$VCCY{I5D5L1YUZ96]1E7KJ

  1. 查看docker info信息,如图所示:

{42UCHGEF]I$ZMRL98NKX1H

  1. 从Docker仓库下载Nginx镜像:

B_[RWXE111NV{Z$)B@}5DQB

1.9 CentOS7.x(7.0+)Linux Docker平台实战

  1. 安装步骤和命令如下:

#安装国内阿里源;
wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装Docker-CE版本;
yum install docker-ce* -y
#查Docker版本是否安装;
rpm -qa|grep -E “docker”
#启动Docker引擎服务;
service docker restart
systemctl restart docker.service
#查看Docker服务进程;
ps -ef|grep docker

  1. 安装完成,如图所示:

EQXWUU%W4P)4I`5GAR0UDM8

  1. 查看启动进程如图所示:

K$ZI)FHJ(Z6VPEK7@XOWQGF

  1. 查看docker info信息,如图所示:

I}DG6}RP)3G~IK1HR@Y$GVG

  1. 从Docker仓库下载Nginx镜像:

}[`BX7S~EL9O[YO$80OC`BQ

1.10 Ubuntu(16.04+)Linux Docker平台实战

  1. 安装步骤和命令如下:

#更新apt源;
apt-get update

[T`A_@JHGH$P_2YUM7V)8ZA

#APT源使用 HTTPS 以确保软件下载过程中不被篡改。需要添加使用HTTPS 传输的软件包以及 CA 证书。

apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common

#默认APT访问国外源,网络非常慢,此处建议使用国内源,需要添加软件源的 GPG 密钥;

curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add –
#curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add –

#向 source.list 中添加 Docker 软件源;

add-apt-repository \
“deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable”
#官方源
#add-apt-repository “deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable”

#更新 apt 软件包缓存;
apt-get update
#基于apt-get 安装docker-ce社区版本;
apt-get install docker-ce

XUEEQ`1Q{72UV}8NUKZ5M)6

#查Docker版本是否安装;
dpkg -s docker-ce

Y}8A4`7UW2CGJSENRL{{DL2

#启动Docker引擎服务;
service docker restart
systemctl restart docker
#查看Docker服务进程;
ps -ef|grep docker

  1. 安装完成,如图所示:

YVJ5AZB}R5J$}0OVLH$K_XI

  1. 查看启动进程如图所示:

@$W@AW2E{((Y}TCW3}8DGGT

  1. 查看docker info信息,如图所示:

@5NKD%F$S}Q`4UDSD6)1Q$3

  1. 从Docker仓库下载Nginx镜像:

ZO})XTKTC(CGT6QFTR[JX`R

1.11 基于Docker构建JAVA服务器实战

Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServer Page(JSP)的支持,Tomcat本身也是一个HTTP服务器,可以单独使用,apache是一个以C语言编写的HTTP服务器。Tomcat主要用来解析JSP语言。目前最新版本为8.0。

Tomcat安装配置

安装tomcat之前需要安装jdk (Java Development Kit) 是 Java 语言的软件开发工具包(SDK)),这里选择jdk-6u18-linux-x64-rpm.bin,bin文件安装跟sh文件方法一样,sh ./jdk-6u18-linux-x64-rpm.bin,回车即可,默认安装到/usr/java/jdk1.6.0_18目录下。

配置java环境变量,vi /etc/profile 添加如下代码:

export JAVA_HOME=/usr/java/jdk1.6.0_18

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOMR/bin

使环境变量立刻生效;

source /etc/profile

查看java版本,显示版本为1.6.0_18,证明安装成功;

java -version

官网下载tomcat相应版本:apache-tomcat-6.0.30.tar.gz,执行如下命令部署Tomcat:

tar -xzf apache-tomcat-6.0.30.tar.gz

mv apache-tomcat-6.0.30 /usr/local/tomcat

/usr/local/tomcat/bin/startup.sh

查看ps -ef |grep tomcat 进程及端口是否存在;

通过页面访问Tomcat默认测试页面如下:

如何创建自定义的网站页面呢,定义自己的发布目录,方法如下:

server.xml配置文件末尾加入代码:

<Context path=”/” docBase=”/data/webapps/www” reloadable=”true”/>

/data/webapps/www创建自己的jsp代码,重启tomcat即可访问。

1.12 基于Docker WEB管理Docker容器

通常来讲,开发人员和管理人员默认通过命令行来创建及运行Docker容器,但Docker的Remote API让他们可以通过充分利用REST(代表性状态传输协议)的API,运行相同的命令。

DockerUI也是基于API方式管理宿主机的Docker引擎。Docker UI Web前端程序让你可以处理通常通过Web浏览器的命令行来管理的许多任务。

主机上的所有容器都可以通过仅仅一条连接来处理,该项目几乎没有任何依赖关系。该软件目前仍在大力开发之中,但是它采用麻省理工学院(MIT)许可证,所以可以免费地重复使用。

Docker UI不包含任何内置的身份验证或安全机制,所以务必将任何公之于众的DockerUI连接放在用密码来保护的系统后面。

  1. 下载Docker UI镜像;

只需要在宿主机pull相关的镜像即可,指令如下:

docker pull uifd/ui-for-docker

docker images

  1. 启动docker-UI服务,并且映射9090至容器9090;

docker run -it -d –name docker-web -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock docker.io/uifd/ui-for-docker

  1. 如果启动Docker端口映射,报错信息如下:

docker0: iptables: No chain/target/match by that name.

解决方法:

如上报错信息是因为本地iptables规则策略没有匹配的链表,解决方案如下:

pkill docker

iptables -t nat -F
ifconfig docker0 down

yum install -y bridge* -y

brctl delbr docker0

service docker restart

  1. 通过docker ps 查看Docker UI状态;

  1. 通过浏览器登录WEB 9000端口访问如图所示:

  1. 选择WEB界面images镜像列表,如图所示:

  1. 基于镜像启动Docker容器虚拟机,并且实现端口映射,如图所示:

  1. 创建Docker容器之后,通过浏览器实现访问81端口,如图所示:

  1. Docker容器资源WEB监控如图所示:

1.13 Docker构建Nginx服务器实战

Nginx [engine x]是Igor Sysoev编写的一个HTTP和反向代理服务器,另外它也可以作为邮件代理服务器。 它已经在众多流量很大的俄罗斯网站上使用了很长时间,这些网站包括Yandex、Mail.Ru、VKontakte,以及Rambler。

据Netcraft统计,在2012年8月份,世界上最繁忙的网站中有11.48%使用Nginx作为其服务器或者代理服务器。目前互联网主流公司360、百度、新浪、腾讯、阿里等都在使用nginx作为自己的WEB服务器。

Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(location是Nginx配置中的一个指令,用于URL匹配),而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。

Nginx相对于Apache优点:

  • 高并发响应性能非常好,官方Nginx处理静态文件并发5w/s
  • 反向代理性能非常好。(可用于负载均衡)
  • 内存和cpu占用率低。(为Apache的1/5-1/10)
  • 功能较Apache少(常用功能均有)
  • 对php可使用cgi方式和fastcgi方式。

Nginx WEB安装

首先需要安装pcre库,然后再安装Nginx:

#安装pcre支持rewrite库,也可以安装源码,注*安装源码时,指定pcre路径为解压

源码的路径,而不是编译后的路径,否则会报错

(make[1]: *** [/usr/local/pcre/Makefile] Error 127 错误)

yum install pcre-devel pcre -y

#下载Nginx源码包

cd /usr/src ;wget -c http://nginx.org/download/nginx-1.4.2.tar.gz

#解压Nginx源码包

tar -xzf nginx-1.4.2.tar.gz

#进入解压目录,然后sed修改Nginx版本信息为WS

cd nginx-1.4.2 ; sed -i -e ‘s/1.4.2//g’ -e ‘s/nginx\//WS/g’ -e

‘s/”NGINX”/”WS”/g’ src/core/nginx.h

#预编译Nginx

useradd www ;./configure –user=www –group=www –prefix=/usr/local/nginx –with-

http_stub_status_module –with-http_ssl_module

#.configure预编译成功后,执行make命令进行编译

make

#make执行成功后,执行make install 正式安装

make install

#自此Nginx安装完毕

/usr/local/nginx/sbin/nginx -t 检查nginx配置文件是否正确,返回OK即正确。

[root@localhost ~]# /usr/local/nginx/sbin/nginx -t

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok

nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

[root@localhost ~]#

然后启动nginx,/usr/local/nginx/sbin/nginx 回车即可。查看进程是否已启动:

[root@localhost ~]# ps -ef |grep nginx

nobody 5381 30285 0 May16 ? 00:04:31 nginx: worker process

root 30285 1 0 2014 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx

root 32260 32220 0 12:34 pts/0 00:00:00 grep nginx

[root@localhost ~]#

然后我们可以通过docker 的ip去访问即可。

1.14 Docker构建LNAMP架构实战

LNAMP(Linux+Nginx+Apache+Mysql+PHP)架构受到很多IT企业的青睐,取代了原来认为很好的LNMP(Linux+Nginx+Mysql+PHP)架构,那我们说LNAMP到底有什么优点呢,还得从Nginx和apache的优缺点说起。

Nginx处理静态文件能力很强,Apache处理动态文件很强而且很稳定,把二者综合在一块,性能提升很多倍。可能很多Linux SA在从事LNMP运维中,会发现PHP(fastcgi)模式会出现一些502错误的现象,这是因为Nginx+PHP(fastcgi)组合不稳定的原因造成的。

YUM 安装LAMP方式:

yum install httpd httpd-tools mysql mysql-server mysql-devel php php-devel php-mysql -y

源码安装LNAMP之Nginx

yum install prce-devel -y ;cd /usr/src ;wget http://nginx.org/download/nginx-1.6.0.tar.gz ;cd nginx-1.6.0 ;./configure -prefix=/usr/local/nginx && make &&make install

源码安装LNAMP之Apache

yum install apr-devel apr-util-devel –y;

cd /usr/src ; wget http://mirror.bit.edu.cn/apache/httpd/httpd-2.2.27.tar.gz ;tar xzf httpd-2.2.27.tar.gz ;cd httpd-2.2.27 ;./configure –prefix=/usr/local/apache –enable-so –enable-rewrite &&make &&make install

源码安装LNAMP之MySQL

cd /usr/src ;wget http://downloads.mysql.com/archives/mysql-5.1/mysql-5.1.63.tar.gz ;tar xzf mysql-5.1.63.tar.gz ;cd mysql-5.1.63 ;./configure –prefix=/usr/local/mysql –enable-assembler &&make &&make install

配置Mysql服务为系统服务:

cp /usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf

cp /usr/local/mysql/share/mysql/mysql.server /etc/rc.d/init.d/mysqld

chkconfig –add mysqld 
chkconfig –level 345 mysqld on

cd /usr/local/mysql

useradd mysql
chown -R  mysql.mysql /usr/local/mysql 
/usr/local/mysql/bin/mysql_install_db –user=mysql  
chown -R mysql  var 
/usr/local/mysql/bin/mysqld_safe –user=mysql &

源码安装LNAMP之PHP

cd /usr/src ;wget http://mirrors.sohu.com/php/php-5.3.28.tar.bz2 ;tar jxf php-5.3.28.tar.bz2 ;cd php-5.3.28 ;./configure –prefix=/usr/local/php5 –with-config-file-path=/usr/local/php/etc –with-apxs2=/usr/local/apache/bin/apxs –with-mysql=/usr/local/mysql/

源码安装Apache+PHP整合

整合apache+php环境,修改httpd.conf配置文件,然后加入如下语句:

LoadModule     php5_module modules/libphp5.so (默认已存在)

AddType application/x-httpd-php .php

DirectoryIndex  index.php index.html (把index.php加入index.html之前)

然后在/usr/local/apache/htdocs目录下创建index.php测试页面,执行如下命令:

cat >>/usr/local/apache/htdocs/index.php <<EOF

<?php

phpinfo();

?>

EOF

重新启动apache服务,通过IP访问界面如下图,即代表LAMP环境搭建成功。

源码安装DISCUZ论坛

下载discuz源码包文件,然后解压:

cd /usr/src ;wget http://download.comsenz.com/DiscuzX/3.1/Discuz_X3.1_SC_UTF8.zip

解压discuz程序包:unzip Discuz_X3.1_SC_UTF8.zip -d /usr/local/apache/htdocs/

重命名程序文件:cd /usr/local/apache/htdocs/ ;mv upload/* .

赋予discuz目录完全访问权限:cd /usr/local/apache/htdocs/ ;chmod 777 -R data/ uc_server/ config/ uc_client/

然后访问IP安装discuz论坛,如下图,选择“我同意”

进入如下界面,数据库安装,如果不存在则需要新建数据库并授权。

数据库创建及授权命令如下:

create database discuz charset=utf8;

grant all on discuz.* to root@’localhost’ identified by “123456”;

点击下一步,直至安装完成,进入等待已久的论坛画面:

自此LAMP环境整合并搭建成功,那如何使用Nginx来整合LAMP呢?

1.15 Docker自动化部署一

生产环境中,由于Docker指令过多,操作比较繁琐,可以编写SHELL自动安装并配置Docker虚拟化及桥接网络,同时使用pipework脚本来配置容器IP,能够实现容器的批量管理,此脚本适用于CentOS6.x系统;

CentOS6.x系列Docker批量管理脚本代码如下:

#!/bin/bash

#auto install docker and Create VM

#by wugk 

#Define PATH Varablies

IPADDR=`ifconfig |grep “Bcast”|awk ‘{print $2}’|cut -d: -f2|grep “192.168”|head -1`

GATEWAY=`route -n|grep “UG”|awk ‘{print $2}’|grep “192.168”|head -1`

DOCKER_IPADDR=$1

IPADDR_NET=`ifconfig |grep “Bcast”|awk ‘{print $2}’|cut -d: -f2|grep “192.168”|head -1|awk -F. ‘{print $1″.”$2″.”$3″.””xxx”}’`

NETWORK=(

HWADDR=`ifconfig eth0 |egrep “HWaddr|Bcast” |tr “\n” ” “|awk ‘{print $5,$7,$NF}’|sed -e ‘s/addr://g’ -e ‘s/Mask://g’|awk ‘{print $1}’`

IPADDR=`ifconfig eth0 |egrep “HWaddr|Bcast” |tr “\n” ” “|awk ‘{print $5,$7,$NF}’|sed -e ‘s/addr://g’ -e ‘s/Mask://g’|awk ‘{print $2}’`

NETMASK=`ifconfig eth0 |egrep “HWaddr|Bcast” |tr “\n” ” “|awk ‘{print $5,$7,$NF}’|sed -e ‘s/addr://g’ -e ‘s/Mask://g’|awk ‘{print $3}’`

GATEWAY=`route -n|grep “UG”|awk ‘{print $2}’`

)

if [ -z “$1” -o -z “$2” -o -z “$3” -o -z “$4” ];then

echo -e “\033[32m———————————\033[0m”

echo -e “\033[32mPlease exec $0 IPADDR CPU(C) MEM(G) DISK(G),example $0 $IPADDR_NET 16 32 50\033[0m”

exit 0

fi

CPU=`expr $2 – 1`

if [ ! -e /usr/bin/bc ];then

yum install bc -y >>/dev/null 2>&1

fi

MEM_F=`echo $3 \* 1024|bc`

MEM=`printf “%.0f\n” $MEM_F`

DISK=$4

USER=$5

REMARK=$6

ping $DOCKER_IPADDR -c 1 >>/dev/null 2>&1

if [ $? -eq 0 ];then

echo -e “\033[32m———————————\033[0m”

echo -e “\033[32mThe IP address to be used,Please change other IP,exit.\033[0m”

exit 0

fi

if [ ! -e /etc/init.d/docker ];then

rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

yum install docker-io -y

yum install device-mapper* -y

/etc/init.d/docker start

if [ $? -ne 0 ];then

echo “Docker install error ,please check.”

exit

fi

fi

cd /etc/sysconfig/network-scripts/

mkdir -p /data/backup/`date +%Y%m%d-%H%M`

yes|cp ifcfg-eth* /data/backup/`date +%Y%m%d-%H%M`/

if

[ -e /etc/sysconfig/network-scripts/ifcfg-br0 ];then

echo

else

cat >ifcfg-eth0 <<EOF

DEVICE=eth0

BOOTPROTO=none

${NETWORK[0]}

NM_CONTROLLED=no

ONBOOT=yes

TYPE=Ethernet

BRIDGE=”br0″

${NETWORK[1]}

${NETWORK[2]}

${NETWORK[3]}

USERCTL=no

EOF

cat >ifcfg-br0 <<EOF

DEVICE=”br0″

BOOTPROTO=none

${NETWORK[0]}

IPV6INIT=no

NM_CONTROLLED=no

ONBOOT=yes

TYPE=”Bridge”

${NETWORK[1]}

${NETWORK[2]}

${NETWORK[3]}

USERCTL=no

EOF

/etc/init.d/network restart

fi

echo ‘Your can restart Ethernet Service: /etc/init.d/network restart !’

echo ‘———————————————————‘

cd –

#######create docker container

service docker status >>/dev/null

if [ $? -ne 0 ];then

/etc/init.d/docker restart

fi

NAME=”Docker$$_`echo $DOCKER_IPADDR|awk -F”.” ‘{print $(NF-1)”_”$NF}’`”

IMAGES=`docker images|grep -v “REPOSITORY”|grep -v “none”|head -1|awk ‘{print $1}’`

CID=$(docker run -itd –cpuset-cpus=0-$CPU -m ${MEM}m –net=none –name=$NAME $IMAGES /bin/bash)

if [ -z $IMAGES ];then

echo “Plesae Download Docker Centos Images,you can to be use docker search centos,and docker pull centos6.5-ssh,exit 0”

exit 0

fi

if [ ! -f /usr/local/bin/pipework ];then

yum install wget unzip zip -y

wget https://github.com/jpetazzo/pipework/archive/master.zip

unzip master

cp pipework-master/pipework /usr/local/bin/

chmod +x /usr/local/bin/pipework

rm -rf master

fi

ip netns >>/dev/null

if [ $? -ne 0 ];then

rpm -e iproute –nodeps

rpm -ivh https://repos.fedorapeople.org/openstack/EOL/openstack-grizzly/epel-6/iproute-2.6.32-130.el6ost.netns.2.x86_64.rpm

fi

pipework br0 $NAME $DOCKER_IPADDR/24@$IPADDR

docker ps -a |grep “$NAME”

DEV=$(basename $(echo /dev/mapper/docker-*-$CID))

dmsetup table $DEV | sed “s/0 [0-9]* thin/0 $((${DISK}*1024*1024*1024/512)) thin/” | dmsetup load $DEV

dmsetup resume $DEV

resize2fs /dev/mapper/$DEV

docker start $CID

docker logs $CID

LIST=”docker_vmlist.csv”

if [ ! -e $LIST ];then

echo “编号,容器ID,容器名称,CPU,内存,硬盘,容器IP,宿主机IP,使用人,备注” >$LIST

fi

###################

NUM=`cat docker_vmlist.csv |grep -v CPU|tail -1|awk -F, ‘{print $1}’`

if [[ $NUM -eq “” ]];then

NUM=”1″

else

NUM=`expr $NUM + 1`

fi

##################

echo -e “\033[32mCreate virtual client Successfully.\n$NUM `echo $CID|cut -b 1-12` $NAME $2C ${MEM}M ${DISK}G $DOCKER_IPADDR $IPADDR $USER $REMARK\033[0m”

if [ -z $USER ];then

USER=”NULL”

REMARK=”NULL”

fi

echo $NUM,`echo $CID|cut -b 1-12`,$NAME,${2}C,${MEM}M,${DISK}G,$DOCKER_IPADDR,$IPADDR,$USER,$REMARK >>$LIST

rm -rf docker_vmlist_*

iconv -c -f utf-8 -t gb2312 docker_vmlist.csv -o docker_vmlist_`date +%H%M`.csv

1.16 Docker自动化部署二

生产环境中,由于Docker指令过多,操作比较繁琐,可以编写SHELL自动安装并配置Docker虚拟化及桥接网络,同时使用pipework脚本来配置容器IP,能够实现容器的批量管理,此脚本适用于CentOS7.x系统;

CentOS7.x系列Docker批量管理脚本代码如下:

#!/bin/bash

#auto install docker and Create VM

#by jfedu.net 

#Define PATH Varablies

IPADDR=`ifconfig|grep -E “\<inet\>”|awk ‘{print $2}’|grep “192.168”|head -1`

GATEWAY=`route -n|grep “UG”|awk ‘{print $2}’|grep “192.168”|head -1`

IPADDR_NET=`ifconfig|grep -E “\<inet\>”|awk ‘{print $2}’|grep “192.168”|head -1|awk -F. ‘{print $1″.”$2″.”$3″.”}’`

LIST=”/root/docker_vmlist.csv”

if [ ! -f /usr/sbin/ifconfig ];then

yum install net-tools* -y

fi

for i in `seq 1 253`;do ping -c 1 ${IPADDR_NET}${i} ;[ $? -ne 0 ]&& DOCKER_IPADDR=”${IPADDR_NET}${i}” &&break;done >>/dev/null 2>&1

echo “##################”

echo -e “Dynamic get docker IP,The Docker IP address\n\n$DOCKER_IPADDR”

NETWORK=(

HWADDR=`ifconfig eth0|grep ether|awk ‘{print $2}’`

IPADDR=`ifconfig eth0|grep -E “\<inet\>”|awk ‘{print $2}’`

NETMASK=`ifconfig eth0|grep -E “\<inet\>”|awk ‘{print $4}’`

GATEWAY=`route -n|grep “UG”|awk ‘{print $2}’`

)

if [ -z “$1” -o -z “$2” ];then

echo -e “\033[32m———————————\033[0m”

echo -e “\033[32mPlease exec $0 CPU(C) MEM(G),example $0 4 8\033[0m”

exit 0

fi

#CPU=`expr $2 – 1`

if [ ! -e /usr/bin/bc ];then

yum install bc -y >>/dev/null 2>&1

fi

CPU_ALL=`cat /proc/cpuinfo |grep processor|wc -l`

if [ ! -f $LIST ];then

CPU_COUNT=$1

CPU_1=”0″

CPU1=`expr $CPU_1 + 0`

CPU2=`expr $CPU1 + $CPU_COUNT – 1`

if [ $CPU2 -gt $CPU_ALL ];then

echo -e “\033[32mThe System CPU count is $CPU_ALL,not more than it.\033[0m”

exit

fi

else

CPU_COUNT=$1

CPU_1=`cat $LIST|tail -1|awk -F”,” ‘{print $4}’|awk -F”-” ‘{print $2}’`

CPU1=`expr $CPU_1 + 1`

CPU2=`expr $CPU1 + $CPU_COUNT – 1`

if [ $CPU2 -gt $CPU_ALL ];then

echo -e “\033[32mThe System CPU count is $CPU_ALL,not more than it.\033[0m”

exit

fi

fi

MEM_F=`echo $2 \* 1024|bc`

MEM=`printf “%.0f\n” $MEM_F`

DISK=20

USER=$3

REMARK=$4

ping $DOCKER_IPADDR -c 1 >>/dev/null 2>&1

if [ $? -eq 0 ];then

echo -e “\033[32m———————————\033[0m”

echo -e “\033[32mThe IP address to be used,Please change other IP,exit.\033[0m”

exit 0

fi

if [ ! -e /usr/bin/docker ];then

yum install docker* device-mapper* lxc -y

mkdir -p /export/docker/

cd /var/lib/ ;rm -rf docker ;ln -s /export/docker/ .

mkdir -p /var/lib/docker/devicemapper/devicemapper

dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1G count=0 seek=2000

service docker start

if [ $? -ne 0 ];then

echo “Docker install error ,please check.”

exit

fi

fi

cd /etc/sysconfig/network-scripts/

mkdir -p /data/backup/`date +%Y%m%d-%H%M`

yes|cp ifcfg-eth* /data/backup/`date +%Y%m%d-%H%M`/

if

[ -e /etc/sysconfig/network-scripts/ifcfg-br0 ];then

echo

else

cat >ifcfg-eth0<<EOF

DEVICE=eth0

BOOTPROTO=none

${NETWORK[0]}

NM_CONTROLLED=no

ONBOOT=yes

TYPE=Ethernet

BRIDGE=”br0″

${NETWORK[1]}

${NETWORK[2]}

${NETWORK[3]}

USERCTL=no

EOF

cat >ifcfg-br0 <<EOF

DEVICE=”br0″

BOOTPROTO=none

${NETWORK[0]}

IPV6INIT=no

NM_CONTROLLED=no

ONBOOT=yes

TYPE=”Bridge”

${NETWORK[1]}

${NETWORK[2]}

${NETWORK[3]}

USERCTL=no

EOF

/etc/init.d/network restart

fi

echo ‘Your can restart Ethernet Service: /etc/init.d/network restart !’

echo ‘———————————————————‘

cd –

#######create docker container

service docker status >>/dev/null

if [ $? -ne 0 ];then

service docker restart

fi

NAME=”Docker_`echo $DOCKER_IPADDR|awk -F”.” ‘{print $(NF-1)”_”$NF}’`”

IMAGES=`docker images|grep -v “REPOSITORY”|grep -v “none”|grep “centos”|head -1|awk ‘{print $1}’`

if [ -z $IMAGES ];then

echo “Plesae Download Docker Centos Images,you can to be use docker search centos,and docker pull centos6.5-ssh,exit 0”

if [ ! -f jfedu_centos68.tar ];then

echo “Please upload jfedu_centos68.tar for docker server.”

exit

fi

cat jfedu_centos68.tar|docker import – jfedu_centos6.8

fi

IMAGES=`docker images|grep -v “REPOSITORY”|grep -v “none”|grep “centos”|head -1|awk ‘{print $1}’`

CID=$(docker run -itd –privileged –cpuset-cpus=${CPU1}-${CPU2} -m ${MEM}m –net=none –name=$NAME $IMAGES /bin/bash)

echo $CID

docker ps -a |grep “$NAME”

pipework br0 $NAME $DOCKER_IPADDR/24@$IPADDR

docker exec $NAME /etc/init.d/sshd start

if [ ! -e $LIST ];then

echo “编号,容器ID,容器名称,CPU,内存,硬盘,容器IP,宿主机IP,使用人,备注” >$LIST

fi

###################

NUM=`cat $LIST |grep -v CPU|tail -1|awk -F, ‘{print $1}’`

if [[ $NUM -eq “” ]];then

NUM=”1″

else

NUM=`expr $NUM + 1`

fi

##################

echo -e “\033[32mCreate virtual client Successfully.\n$NUM `echo $CID|cut -b 1-12`,$NAME,$CPU1-$CPU2,${MEM}M,${DISK}G,$DOCKER_IPADDR,$IPADDR,$USER,$REMARK\033[0m”

if [ -z $USER ];then

USER=”NULL”

REMARK=”NULL”

fi

echo $NUM,`echo $CID|cut -b 1-12`,$NAME,$CPU1-$CPU2,${MEM}M,${DISK}G,$DOCKER_IPADDR,$IPADDR,$USER,$REMARK >>$LIST

rm -rf /root/docker_vmlist_*

iconv -c -f utf-8 -t gb2312 $LIST -o /root/docker_vmlist_`date +%H%M`.csv