这段时间学习LXC,想借助一个案例——在LXC上部署tomcat服务器,一方面加深自己对部署应用到LXC容器的理解,另一方面也熟悉一下tomcat服务器的部署操作(之前在Linux上从未部署过tomcat)。。。话不多说,开始吧:
一、软件环境及平台
操作系统:Ubuntu 14.04, 64位
jdk版本:jdk-8u40-linux-x64.tar.gz
tomcat版本:apache-tomcat-8.0.21.tar.gz
二、LXC的安装和容器实例的创建
step1:通过apt-get命令自动安装LXC
<span style="font-family:FangSong_GB2312;font-size:14px;"> sudo apt-get install lxc
</span>
step2:检验LXC是否安装好
网上一些资料建议执行lxc-version命令,查看是否显示LXC的版本号。但在我的机子上提示如下图:
我不太清楚其中的原因,但实践表明这并不影响我们后续的安装。通过另外一种方式,执行“lxc-checkconfig”命令来检查。执行结果中应该都显示为“enabled”,如下图所示:
<pre name="code" class="plain">lxc-checkconfig
step3:创建容器实例lxc-test
创建名为lxc-test的实例容器,采用宿主机ubuntu14.04为模板(默认采用宿主机为模板)。执行命令如下:
<pre name="code" class="plain">sudo lxc-create -t ubuntu -n lxc-test
其中-t参数表示创建的虚拟机模板的名称,-n表示创建的虚假机的名称。更详细的参数可以查看相应的资料,这里不再说明。
截取部分执行结果如下,其中注意倒数第二行的用户名“ubuntu”和密码“ubuntu”,接下来的操作会用到:
step4:管理LXC容器
1.查看容器状态
通过“sudo lxc-ls --fancy”命令可以查看容器的列表和状态,命令如下:
<pre name="code" class="plain">sudo lxc-ls --fancy
执行结果如下图:
我们已经创建了名为lxc-test的容器实例,但此处仍未启动。
值得提醒的是,命令中一定要采用sudo,否则会出现以下错误结果,但并不会有错误信息。
2.启动容器
通过“lxc-start -n”命令可以启动容器,命令如下:
<pre name="code" class="plain">sudo lxc-start -n lxc-test -d
其中-d表示以守护进程的方式启动lxc,再次不做详细说明。执行后若无任何提示,表明启动成功,此时再查看容器状态,如下图所示:
其中state状态变为RUNNNING,并且分配了IP地址
3.访问容器控制台
“访问容器控制台”相当于进入容器系统的终端,所用命令如下:
sudo lxc-console -n lxc-test
执行结果是跳至新的界面,如下图所示:
此时需要输入帐号和密码,也即是step3中所提到的“ubuntu”(帐号)和“ubuntu”(密码),输入成功后进入以下界面:
这个界面是不是很像我们的Linux命令行。。。
小插曲:在此,我们可以使用uname -a对比容器实例和宿主机的内核参数,这一步不是必须的,只是为了加深对容器的理解。
宿主机和lxc中信息分别如下面两张图。对比之后发现,除去用户名不同,其他的内核信息是完全一样的,连内核安装的时间都相同,这充分表明二者是使用同一个内核。
退出lxc控制台为:<Ctrl+a q>组合键
4.停止和销毁容器
停止容器的命令为:
sudo lxc-stop -n lxc-test
销毁容器的命令为:
sudo lxc-destroy -n lxc-test
销毁容器后我们再查看容器状态,发现容器状态列表为空:
step5:在容器中搭建tomcat
首先需要下载jdk和tomcat,这里我们下载的版本为jdk-8u40-linux-x64.tar.gz和apache-tomcat-8.0.21.tar.gz。
1.创建java文件夹
我们选择在/var/lib/lxc/lxc-test/rootfs/usr/local目录下创建java文件夹,因为lxc有权限限制,必须采用sudo命令,如下所示:
sudo mkdir /var/lib/lxc/lxc-test/rootfs/usr/local/java
需要说明的是:其中rootfs目录相当于容器中的根目录。
想要查看java文件夹是否创建成功,不能直接采用sudo cd的命令,而必须转换为root帐号。
2.解压jdk和tomcat到java文件夹
具体的解压命令查看相应的文档,在此不细说。方便起见,我们将apache-tomcat-8.0.21重命名为tomcat,将jdk1.8.0_40重命名为jdk,得到如下文件:
3.配置环境变量
配置环境变量需要访问容器控制台(当然也可以在host下使用root用户,但目录太长),此后就可以想像为在普通的host系统中进行操作。
修改/etc/profile文件配置环境变量,在文件的最后加上jre和tomcat的路径如下:
<pre name="code" class="plain">export JAVA_HOME=/usr/local/java/jdk
export CATALINA_HOME=/usr/local/java/tomcat
export TOMCAT_HOME=/usr/local/java/tomcat
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:${CATALINA_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH:${CATALINA_HOME}/bin
保存后执行以下命令以立即生效:
source /etc/profile
打印环境变量PATH,看新加入的jdk路径是否生效:
4.启动tomcat服务器
命令如下:
sudo sh /usr/local/java/tomcat/bin/startup.sh
1)若选择的jdk版本和tomcat版本合适,或者人品比较好,此时应该显示tomcat启动成功。
2)但往往是会遇到问题的,报出错误如下所示:
错误的意思是说,没有检测到JAVA_HOME和JRE_HOME的环境变量,但单独打印这两个环境变量又都是存在的。怪怪怪。。。。。
查看一些资料,说是因为jdk和tomcat的版本不符合,具体原因感觉有些复杂,在此不深究。网上的大牛提供了一些解决方案,但貌似大多数对我来说并不可用。
经亲测,提供其中一种可用的解决方法:
修改/usr/local/java/tomcat/bin目录下的catalina.sh文件,命令如下:
sudo vim catalina.sh
在第98行左右增加环境变量,如下所示:
export JAVA_HOME=/usr/local/java/jdk
export JRE_HOME=/usr/local/java/jdk/jre
然后开启tomcat服务器,提示“success”!!!
使用netstat命令查看8080端口的开启情况如下,显示已开启:
5.补充说明
网上的一些资料说,还可以通过host的浏览器输入网址:http://localhost:8080 查看是否出现tomcat的欢迎界面。。亲测这是不可行的。
分析原理知道,LXC和host只是共用一个内核,而浏览器并不是共用的,也就不能在host中的浏览器通过localhost访问LXC。。
参考博客链接:
http://os.51cto.com/art/201312/423771.htm
http://blog.csdn.net/alle170257702/article/details/4637343
http://blog.sina.com.cn/s/blog_61c006ea0100l1u6.html
http://os.51cto.com/art/201411/457319.htm