设为首页 收藏本站
查看: 4505|回复: 0

[经验分享] 通过网页集中访问Docker容器

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-7-21 09:02:49 | 显示全部楼层 |阅读模式
前言:
      在几个月前搭建了一个架构可以通过网页形式访问并对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源
1
2
rpm -ivhhttp://mirrors.aliyun.com/epel/6 ... ease-6-8.noarch.rpm
rpm  -ivhhttp://pkgs.repoforge.org/rpmfor ... 1.el6.rf.x86_64.rpm





2.安装依赖包
1
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包
1
#rpm -ivh jdk-8u25-linux-x64.rpm




修改/etc/profile文件,在profile文件下面追加写入下面信息:
1
2
3
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
1
#source /etc/profile



完成后查看java是否安装成功:
1
2
3
4
# 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 解压至当前目录:
1
#tar -zxvfapache-maven-3.2.3-bin.tar.gz



重命名文件夹:
1
#mv apache-maven-3.2.3 apache-maven



执行 vi /etc/profile 文件,插入如下内容:
1
2
export M2_HOME=/xxx(解压位置)/apache-maven
PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin



保存退出,执行以下命令:
1
#source /etc/profile



完成后查看MVN是否安装成功:
1
2
3
4
5
6
7
#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
解压文件包
1
# tar -xzf guacamole-server-0.9.3.tar.gz



进入目录执行
1
# ./configure  --with-init-dir=/etc/init.d



全部YES为安装成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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两种。

检查通过以后进行编译安装
1
make && make install





7.安装guacamole-client

解压文件包后进入该文件夹
1
#tar -xzf guacamole-client-0.9.3.tar.gz





执行mvn package命令
1
#mvn package




看到类似一下信息表示已成功执行完成
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[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文件
1
#cp  /root/guacamole-client-0.9.3/guacamole/target/guacamole-0.9.3.war /var/lib/tomcat/webapps/guacamole.war






新建两个文件夹
1
2
#mkdir /etc/guacamole
#mkdir/usr/share/tomcat/.guacamole





将example中的配置文件复制到/etc/guacamole下
1
# cp /root/guacamole-client-0.9.3/guacamole/doc/example/guacamole.properties   /etc/guacamole/guacamole.properties





对guacamole.properties 文件做链接
1
#ln -s /etc/guacamole/guacamole.properties /usr/share/tomcat/.guacamole/





修改配置文件

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



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

新建user-mapping.xml
1
2
3
4
5
6
7
8
9
10
11
12
#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服务并让其下次开机启动
1
2
3
4
/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

1
#yum install docker-io -y



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

修改配置文件使容器间相互不进行通信
1
2
other_args="--icc=flase"
DOCKER_CERT_PATH=/etc/docker





重启docker服务并让其下次启动
1
#/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文件夹中执行以下命令
1
#docker build -t="zzjl/guacavnc" .



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

完成后执行docker images查看镜像
wKioL1WruP2DEELFAAMMtNlE-Wo458.jpg
注释:zzjl/guacavnc就是由dockerfile生产的镜像。


生成一台容器然后查看状态
1
2
3
[iyunv@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服务
1
2
/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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/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
1
sed -n 2p /tmp/dockerps.txt | awk '{print $12}'| awk -F: '{print $2}'|awk -F- '{print $1}'




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



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-88921-1-1.html 上篇帖子: docker 启动问题:could not create trust store: error unmarshalling content: unexpecte 下篇帖子: Dockerfile 中CMD 和 ENTRYPOINT指令 网页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表