前言:

      在几个月前搭建了一个架构可以通过网页形式访问并对Docker中的容器进行操作,现将其进行整理一并发出。此篇文章我会将Docker部分的部署过程详细写出,这里对Docker的介绍就不在进行多余的讲解了有需要的朋友可以自行百度下,下面的架构图第一次用这种形式展示画的不好还请见谅。


架构分析:

1.整体拓扑图

wKiom1WqToLR6s9wAAFxVmKCgEk134.jpg

a.HaProxy

本次架构中haproxy充当负载均衡的工作,当client端访问容器时,ha会自动为客户切换后端的guacamoleserver达到负载均衡的目的。

b.GuacamoleALLINONE-01/02:

这里提供提供两台GuacamoleALLINONE服务器(包括guacamoleclient端和guacamoleserver端)

c.DockerServer:

在DockerServer中会运行着很多的container,为了从网页中更好的看到效果container中安装了vnc并将其端口进行转出。

d.Dockerhub:

这里搭建了一个私有的dockerhub用来存放使用的镜像。


2.用户访问过程:



wKioL1WqUGLTRJFhAAC1TGjUigU436.jpg

当用户点击对应的容器时,首先会经过Haproxy将为客户选择一个guacamoleserver,再有guacamoleserver访问dockerserver中对应的container,完成打开的一个流程。


注释:由于将整个架构的具体配置写在一篇中较为冗长,这里主要使用一台guacamoleALLINONE一台docker来完成最基础的架构,最后会模拟client进行访问。


环境配置:

a.操作系统:centos6.6(kernel2.6.32)

b.java-version:1.8.0_25

c.guacamole-version:0.93

d.MVN-version:3.2.3

e.docker-version:1.5.0

注释:这里只讨论下两个问题,其一centos版本的选择,之前配置时对使用内核2.6还是内核3.0做了一番思考最终还是决定使用2.6的内核(主要还是考虑到centos7操作与之前的版本有很大的不同,操作起来还是不上手),仅仅做这个测试用2.6的内核是完全没有问题的,如果用docker跑其他的服务比如zookeeper可能会出现问题其导致的原因是内核版本过低,倘若公司没有内核开发的团队使用docker跑线上的业务还是建议按照官方文档所说使用3.0内核。其二容器要不要给swap,这里用腾讯的Gaia给大家举个例子(Gaia是腾讯自己开发的万台规模Docker应用),经过测试最后是将容器的swap全部取消了,取消之后发现性能比之前更加的稳定了,这里大家懂了把。


Guacamole-Server配置过程:

1.升级yum源

rpm -ivhhttp://mirrors.aliyun.com/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm  -ivhhttp://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm


2.安装依赖包

yum install freerdp-devel pango-devel libssh2-devel libtelnet-devel libvncserver-devel  libpng-devel cairo-devel uuid-devel gcc tomcat fontforge  -y


3.上传所需包到服务器

jdk-8u25-linux-x64.rpm

apache-maven-3.2.3-bin.tar

guacamole-client-0.9.3.tar.gz  

        guacamole-server-0.9.3.tar.gz

注释:这里由于我本地已经下载完成了,jdk的包建议去oracle官网下载对应版本,guacamole的相关包可以去guacamole官网下载,如果不需要密码访问还需要上传一个名为guacamole-auth-noauth-0.9.3.tar.gz的包。


4.安装上传的java包

#rpm -ivh jdk-8u25-linux-x64.rpm

修改/etc/profile文件,在profile文件下面追加写入下面信息:

exportJAVA_HOME=/usr/java/jdk1.8.0_25
export   CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

保存退出,执行:source /etc/profile

#source /etc/profile

完成后查看java是否安装成功:

# java -version
   javaversion "1.8.0_25"
   Java(TM) SERuntime Environment (build 1.8.0_25-b17)
   JavaHotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)


5.安装MVN

将apache-maven-3.2.3-bin.tar.gz 解压至当前目录:

#tar -zxvfapache-maven-3.2.3-bin.tar.gz

重命名文件夹:

#mv apache-maven-3.2.3 apache-maven

执行 vi /etc/profile 文件,插入如下内容:

export M2_HOME=/xxx(解压位置)/apache-maven
PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin

保存退出,执行以下命令:

#source /etc/profile

完成后查看MVN是否安装成功:

#mvn -v
Apache Maven 3.2.3 (33f8c3e1027c3ddde99d3cdebad2656a31e8fdf4; 2014-08-12T04:58:10+08:00)
Maven home: /root/apache-maven
Java version: 1.8.0_25, vendor: Oracle Corporation
Java home: /usr/java/jdk1.8.0_25/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "2.6.32-504.el6.x86_64", arch: "amd64", family: "unix"


6.安装guacamole-server

解压文件包 

# tar -xzf guacamole-server-0.9.3.tar.gz

进入目录执行

# ./configure  --with-init-dir=/etc/init.d

全部YES为安装成功

 Librarystatus:
     freerdp............. yes
     pango............... yes
     libssh2............. yes
     libssl.............. yes
     libtelnet........... yes
    libVNCServer ........ yes
     libvorbis........... yes
     libpulse............ no
 
   Protocolsupport:
 
      RDP....... yes
      SSH....... yes
      Telnet ....yes
      VNC....... yes

注释:libpulse是音频相关的库没有不会影响后续的操作,如果显示库为no说明安装环境时少装了包,这里都至需要安装devel的相关开发包,下面的为支持的协议用的较多的是ssh和vnc两种。


检查通过以后进行编译安装

make && make install



7.安装guacamole-client

解压文件包后进入该文件夹

#tar -xzf guacamole-client-0.9.3.tar.gz


执行mvn package命令

#mvn package


看到类似一下信息表示已成功执行完成

[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] guacamole-common ................................... SUCCESS [04:16 min]
[INFO] guacamole-common-js ................................ SUCCESS [19:21 min]
[INFO] guacamole .......................................... SUCCESS [03:02 min]
[INFO] guacamole-ext ...................................... SUCCESS [  7.094 s]
[INFO] guacamole-client ................................... SUCCESS [  0.566 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 26:48 min
[INFO] Finished at: 2015-07-19T01:01:22+08:00
[INFO] Final Memory: 36M/87M
[INFO] ------------------------------------------------------------------------

复制war文件

#cp  /root/guacamole-client-0.9.3/guacamole/target/guacamole-0.9.3.war /var/lib/tomcat/webapps/guacamole.war


新建两个文件夹 

#mkdir /etc/guacamole
#mkdir/usr/share/tomcat/.guacamole


将example中的配置文件复制到/etc/guacamole下

# cp /root/guacamole-client-0.9.3/guacamole/doc/example/guacamole.properties   /etc/guacamole/guacamole.properties


对guacamole.properties 文件做链接

#ln -s /etc/guacamole/guacamole.properties /usr/share/tomcat/.guacamole/


修改配置文件

#vi /etc/guacamole/guacamole.properties
basic-user-mapping:/etc/guacamole/user-mapping.xml

注释:只需要修改这一行,修改path指定到/etc/guacamole下。


新建user-mapping.xml

#vi /etc/guacamole/user-mapping.xml
<user-mapping>
        <authorize username="admin" password="admin">(这里的用户名和密码为网页登录时的所需的用户和密码)
                <connectionname="vnc"> (显示的名称)
                <protocol>ssh</protocol>(链接的方式)
                <paramname="hostname">localhost</param>
                <paramname="port">22</param>(端口号)
                <paramname="password">xxxxx</param>(连接机器密码)
                </connection> 
                
        </authorize>
</user-mapping>

注释:guacamole配置文件比较坑的一点就是只要打错固定格式的一个字符登录时候失败。


重启guacd和tomcat服务并让其下次开机启动

/etc/init.d/guacd start
/etc/init.d/tomcat start
chkconfig guacd on
chkconfig tomcat on


打开浏览器访问进行测试,访问地址为xxx.xxx.xxx.xxx:8080/guacamole

在填写设置用户名和密码(user-mapping.xml中authorize定义)后进入界面

wKiom1WrrX-CGad1AAHehFQDVUo770.jpg

wKioL1Wrr2DDAMKQAADcG5O8xTU224.jpg

注释:图1中点击“Wechat:atiger77”后会要求输入Login姓名,在输入root后自动进入系统,这里的设置都在user-mapping.xml配置文件中。


DockerServer:

安装docker

#yum install docker-io -y

注释:如果使用centos7安装docker执行"yum install docker -y"即可。


修改配置文件使容器间相互不进行通信

other_args="--icc=flase"
DOCKER_CERT_PATH=/etc/docker


重启docker服务并让其下次启动

#/etc/init.d/docker restart && chkconfig docker on


制作docker镜像

我将写的Dockerfile与大家分享

wKioL1WrsZyBTWFPAAaBykhYLtw306.jpg

wKiom1Wrr77xXcr7AAUmVGj_se4862.jpg


注释:Dockerfile的RUN次数越多,生成的Image文件就会越大,这是因为docker镜像是一层叠一层的每一个step都是一层镜像,它的好处是当下一个镜像步骤和已有镜像相同时不会去重新执行而是直接调用省去了很多时间。这里在dockerfile中安装了一个xfce轻量级的图形化桌面,在做测试时对GNOME,KDE,XFCE都进行了性能比较,最后还是XFCE所占用资源更小。dockerfile只提供给大家一种思路,根据自己的需求对其进行添加服务~


在dockerfile文件夹中执行以下命令

#docker build -t="zzjl/guacavnc" .

注释:我给的标签是zzjl/guacavnc,这里给大家一个小贴士在写标签的时候注意需要多于4个字母,标签取的要有规律方便管理。docker会根据dockerfile中所写的内容逐行读取,这里可以泡一杯咖啡当中过程不需要人工干预,只需静静的看下如果网络出现不稳定的情况会yum会提示超时导致很多包不会安装直接跳过导致最后无法连接到容器。


完成后执行docker p_w_picpaths查看镜像

wKioL1WruP2DEELFAAMMtNlE-Wo458.jpg

注释:zzjl/guacavnc就是由dockerfile生产的镜像。



生成一台容器然后查看状态

[root@Docker dockervnc]# docker ps
CONTAINER ID        IMAGE                  COMMAND             CREATED              STATUS              PORTS                      NAMES
9a1daeb1ff35        zzjl/guacavnc:latest   "/run.sh"           About a minute ago   Up About a minute   0.0.0.0:49157->15900/tcp   angry_hodgkin

注释:这里我生成的时候限定了容器的最大使用内存和cpu上限,使用ps参数可以查看到该容器的情况,这里可以看到容器的端口情况,我们记录端口号添加到guacamoleserver服务器的user-mapping.xml配置文件中。


修改guacamoleServer的user-mapping.xml配置文件

wKiom1WsTvbSNQnLAASGfzUmyaU988.jpg


重启guacamoleserver上的tomcat和guacd服务

/etc/init.d/guacd restart
/etc/init.d/tomcat restart


再次访问http://xxx.xxx.xxx.xxx:8080/guacamole,点击docker01

wKioL1WsUcPTMTvjAAHxit1SCZY373.jpg注释:点击后就能成功连接到xfce的桌面了。


7.批量测试

当初搭建完成后写了测试脚本,在guacamoleserver上安装salt-master,dockerserver上安装salt-minion,通过在guacamoleserver上远程执行命令,让dockerserver自动生产指定容器随后将docker ps中的信息抓取放入配置文件,最后重启guacd和tomcat的过程,实现自动化的一个操作,这里将代码献上:

atiger77.sh

#!/bin/bash
#######################
#Author:zhujialin
#Date:2015/1/7
#Version:V1.0
#Wechat:atiger77
#######################

USERUID=$(echo $UID)
if [ $USERUID != 0 ];then        
	echo "Please use root run this script!"      
	exit 1
else      
	echo "" 
fi

read -p "Please input a Number for simulation environment: " a
for i in `seq $a`
do 
   salt -E '.*' cmd.run 'docker run -d -p 15900 build/vnc'  >> /dev/null
   salt -E '.*' cmd.run "docker ps >> /tmp/dockerps.txt" >> /dev/null
   sed  -i 's/<\/configs>//' /etc/guacamole/noauth-config.xml
   echo '   <config name="Demon1111" protocol="vnc">'  >> /etc/guacamole/noauth-config.xml
   sed -i 's/Demon1111/zjl'"$i"'/' /etc/guacamole/noauth-config.xml
   echo '      <param name="hostname" value="192.168.35.164"/>'  >> /etc/guacamole/noauth-config.xml
   echo '      <param name="port" value="1100"/>' >> /etc/guacamole/noauth-config.xml
   salt -E '.*' cmd.run 'sh /root/zjl.sh ' > /root/port.txt
   c=`sed -n 2p /root/port.txt | sed 's/^[ \t]*//g'`
   sed -i 's/1100/'"$c"'/' /etc/guacamole/noauth-config.xml
   echo '   </config>'  >> /etc/guacamole/noauth-config.xml
   echo '</configs>'  >> /etc/guacamole/noauth-config.xml
   salt -E '.*' cmd.run 'rm -rf /tmp/dockerps.txt' >> /dev/null
   rm -rf /root/port.txt
done
service tomcat restart >> /dev/null
sleep 1
echo "Completed! Shell will exit in 3S."
sleep 3
exit 0

cat zjl.sh

sed -n 2p /tmp/dockerps.txt | awk '{print $12}'| awk -F: '{print $2}'|awk -F- '{print $1}'


8.拓展说明

    我们想的远一点这个架构可以进行二次开发,变成一个私有云形式根据用户的需求安装不同的组件打包成镜像分发给用户,用户只要一个浏览器就可以开始玩了。本来就想简单介绍下,一些发现写了很多,测试中有问题请与我联系~