Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架或包括系统。
“Docker”应该是2014年最火爆的技术之一,如果没有听说过,那么你就out了,2015年将开启新的跨越。
Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。
Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。
在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。
下面对比了Docker 和传统虚拟化(KVM、XEN等)方式的不同之处,容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件的基础上,虚拟出自己的系统,再在系统上部署相关的APP应用。
下图为传统虚拟化方案:
如下为Docker虚拟化方案:
Docker虚拟化有三个概念需要理解,分别镜像、容器、仓库。
我们这里主要讲解如何在Centos6.x系列服务器安装,默认docker只有在centos6.5以上机器才能使用yum直接安装,如果其他版本需要安装centos扩展源epel。
docker官方文档说要求Linux kernel至少3.8以上,一般为centos6.5或者Ubuntu系统,那centos6.5如何来安装呢?
在Centos6.x系列安装docker软件,首先要关闭selinux,然后需要安装相应的epel源,如下:
sed -i '/SELINUX/s/enforcing/disabled/g' /etc/selinux/config
wget http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
yum install lxc libcgroup device-mapper-event-libs
然后安装docker:
#yum install docker-io
Yum install device-mapper* -y
安装完后:
启动docker进程:/etc/init.d/docker start
查看docker进程:ps -ef |grep docker
Docker简单使用:
要使用docker虚拟化,首先我们需要去下载一个镜像,然后使用docker命令启动,为了好让大家理解,我这里直接利用docker启动一个新的centos系统哦。
去公共仓库下载centos镜像,下载的速度取决于网速哦。
http://182.92.188.163/centos6.5.tar
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
TYPE=Ethernet
BOOTPROTO=static
BRIDGE=br0
DEVICE="br0"
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=dhcp
TYPE=Bridge
Docker构建Tomcat WEB服务器
Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServer Page(JSP)的支持,Tomcat本身也是一个HTTP服务器,可以单独使用,apache是一个以C语言编写的HTTP服务器。Tomcat主要用来解析JSP语言。目前最新版本为8.0。
安装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 -version //查看java版本,显示版本为1.6.0_18,证明安装成功。
在官网下载tomcat相应版本,这里下载的版本为apache-tomcat-6.0.30.tar.gz,下载完后解压:
tar -xzf apache-tomcat-6.0.30.tar.gz ;mv apache-tomcat-6.0.30 /usr/local/tomcat
启动tomcat,命令为:/usr/local/tomcat_test/bin/startup.sh
查看ps -ef |grep tomcat 进程及端口是否存在,通过页面访问可以看到tomcat默认测试页面:
这个画面是默认网站,怎么来创建一个自己的网站页面呢,定义自己的发布目录,方法如下:在server.xml配置文件末尾加入如下行:(附截图)
在/data/webapps/www目录下,创建自己的jsp代码,重启tomcat即可访问。
线上环境使用默认tomcat配置文件,性能很一般,为了满足大量用户的访问,需要对tomcat进行参数性能优化,具体优化的地方如下:
这里着重讲解tomcat参数的优化:server.xml文件,关闭DNS查询、配置最大并发等参数。
maxThreads:tomcat起动的最大线程数,即同时处理的任务个数,默认值为200
acceptCount:当tomcat起动的线程数达到最大时,接受排队的请求个数,默认值为100
当然这些值都不是越大越好,需要根据实际情况来设定。可以基于测试的基础上来不断的调优分析。Server.xml里面优化如下:
Catalina.sh JVM参数优化,添加如下内容:
CATALINA_OPTS="$CATALINA_OPTS –Xms4000M –Xmx4000M –Xmn1000M -XX:SurvivorRatio=4 -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=82 -DLOCALE=UTF-16LE -DRAMDISK=/ -DUSE_RAM_DISK=ture -DRAM_DISK=true"
配置多个tomcat实例,方法也很简单,只需要在服务器上cp多个tomcat,然后修改三个端口和发布目录即可,然后分别启动即可。
为了提升整个网站的性能,还需要在tomcat前面架设nginx web反向代理服务器,用以提高用户高速访问。
/usr/share/cracklib/pw_dict.pwd: No such file or directory
PWOpen: No such file or directory
rpm -e cracklib-dicts --nodeps ;rpm -e pam --nodeps
yum install pam cracklib-dicts -y
[root@5255b18871ae /]# echo '123456' | passwd --stdin root
Changing password for user root.
passwd: all authentication tokens updated successfully.
我们如果现在启动sshd,sshd会报错:
Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
所以我们先生成/etc/ssh/ssh_host_rsa_key和/etc/ssh/ssh_host_ecdsa_key:
[root@5255b18871ae /]# ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''
[root@5255b18871ae /]# ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''
然后查一下容器的IP,以daemon方式启动sshd:
[root@5255b18871ae /]# /usr/sbin/sshd -D
我们看到容器IP为192.168.1.3,从外部远程ssh到这个容器:
发现容器立即关闭了连接,原因是容器的ssh使用了pam_loginuid.so模块,我们把它关掉:
[root@5255b18871ae /]# sed -i '/^session\s\+required\s\+pam_loginuid.so/s/^/#/' /etc/pam.d/sshd
上述命令的意思是:在/etc/pam.d/sshd文件里注释掉"session required pam_loginuid.so"这一行。
然后重新启动sshd:
[root@5255b18871ae /]# /usr/sbin/sshd -D
再次尝试远程ssh登入:
[root@localhost ~]# ssh [email protected]
[email protected]'s password:
Last login: Tue Dec 2 03:00:07 2014 from 192.168.1.3
[root@5255b18871ae ~]#
RUN yum install passwd openssl openssh-server -y
RUN echo '123456' | passwd --stdin root
RUN ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''
RUN ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''
RUN sed -i '/^session\s\+required\s\+pam_loginuid.so/s/^/#/' /etc/pam.d/sshd
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh
CMD ip addr ls eth0 | awk '{print $2}' | egrep -o '([0-9]+\.){3}[0-9]+';/usr/sbin/sshd -D
# 设置基本的镜像,后续命令都以这个镜像为基础
FROM centos_lamp:v1
# 作者信息
MAINTAINER JFEDU.NET
# RUN命令会在上面指定的镜像里执行任何命令
RUN yum install passwd openssl openssh-server -y
RUN echo '123456' | passwd --stdin root
RUN sed -i '/^session\s\+required\s\+pam_loginuid.so/s/^/#/' /etc/pam.d/sshd
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh
RUN mkdir /var/run/sshd
#暴露ssh端口22
EXPOSE 22
#设定运行以daemon方式启动sshd
CMD /usr/sbin/sshd -D
# 设置基本的镜像,后续命令都以这个镜像为基础
FROM centos_lamp:v1
# 作者信息
MAINTAINER JFEDU.NET
# RUN命令会在上面指定的镜像里执行任何命令
RUN yum install pcre-devel -y
RUN yum install httpd httpd-devel -y
#暴露ssh端口80
EXPOSE 80
#启动httpd
CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]
docker容器默认的空间是10G,如果想指定默认容器的大小(在启动容器的时候指定),可以在docker配置文件里通过dm.basesize参数指定,例如:
docker -d --storage-opt dm.basesize=20G
是指定默认的大小为20G,具体参数可以参考https://github.com/docker/docker/tree/master/daemon/graphdriver/devmapper
以上方法只适用于新容器生成,并且修改后需要重启docker,无法做到动态给正在运行容器指定大小。(如下图为默认容器大小)
在文件加入如下语句即可:vi /etc/sysconfig/docker-storage
然后重启docker即可;
然后重新创建即可。
第二种扩容方法:
2 查看mapper设备:
3. 查看卷信息表:
根据要扩展的大小,计算需要多少扇区:
第二个数字是设备的大小,表示有多少个512-bytes 的扇区. 这个值略高于 10GB 的大小。
我们来计算一下一个 15GB 的卷需要多少扇区,
$ echo $((15*1024*1024*1024/512)) 31457280
5 修改卷信息表--激活--并且验证(红色3个部分)
6修改文件系统大小
7 最后验证磁盘大小:
成功扩容,当然了以上步骤也可以写成脚本,然后使用脚本批量扩容分区大小。
FROM centos:v1
RUN groupadd -r mysql && useradd -r -g mysql mysql
RUN install -y gcc zlib-devel gd-devel
ENV MYSQL_MAJOR 5.6
ENV MYSQL_VERSION 5.6.20
RUN
&& curl -SL "http://dev.mysql.com/get/Downloads/MySQL-$MYSQL_MAJOR/mysql-$MYSQL_VERSION-linux-glibc2.5-x86_64.tar.gz" -o mysql.tar.gz \
&& curl -SL "http://mysql.he.net/Downloads/MySQL-$MYSQL_MAJOR/mysql-$MYSQL_VERSION-linux-glibc2.5-x86_64.tar.gz.asc" -o mysql.tar.gz.asc \
&& mkdir /usr/local/mysql \
&& tar -xzf mysql.tar.gz -C /usr/local/mysql \
&& rm mysql.tar.gz* \
ENV PATH $PATH:/usr/local/mysql/bin:/usr/local/mysql/scripts
WORKDIR /usr/local/mysql
VOLUME /var/lib/mysql
EXPOSE 3306
CMD ["mysqld", "--datadir=/var/lib/mysql", "--user=mysql"]
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优点:
首先需要安装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去访问即可。
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
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
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
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
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 &
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环境,修改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 <
phpinfo();
?>
EOF
重新启动apache服务,通过IP访问界面如下图,即代表LAMP环境搭建成功。
下载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";
点击下一步,直至安装完成,进入等待已久的论坛画面:
Docker自动化部署脚本案例