Caicloud企业应用docker实操技能篇(java技术栈)

java 4 2016-02-29 13:03
女装

本报告以技术栈JAVA为例,列举并解释了一些面向Docker进行应用程序开发和系统搭建中所需要注意的问题和技巧,以及Caicloud平台在Docker管理和帮助企业应用向Docker转化中的作用。由于应用程序千差万别,应用场景层出不穷,本文仅起到抛砖引玉的作用。

Java栈

War包在Tomcat或Jetty下的加载方式。
JAVA应用的经典交付形态是WAR包,在Docker下使用Tomcat或Jetty来进行WAR包的部署可以有两种方式:
将WAR包放到Docker镜像中:这种好处是产生的Docker镜像自包含,发布时不需要再发布独立的WAR包。Dockerfile例子如下:

FROM jetty:7.0
MAINTAINER xyz
ADD sample.* /usr/local/jetty/webapps/

这种方法的缺点是每次更新WAR包需要重新构建Docker镜像。

将WAR包作为外部数据卷挂载:不将WAR包放在镜像里,这种方法的好处是每次WAR包更新,Docker镜像不需要更新。但是需要额外的WAR包发布机制。考虑到目前应该有WAR包发布机制,此方案可能更为灵活和熟悉。但这种方案的缺点就是Docker的可移植性受到损害,因为每个环境下必须要在宿主机的指定路径下有WAR包,使得Docker可以对其进行挂载。

JAVA发布的Sidecar模式

Caicloud的容器组的概念保证容器组中的容器可以做到:
任何时候都运行在同一个宿主机上
共享同样的外部挂载数据卷

这两个特性使得我们可以实现如下的sidecar模式:

由于没有将应用程序的WAR包构建到Jetty容器中,使得应用的版本管理和Jetty等中间件的版本管理可以分开独立地进行。例如,如果Jetty的版本需要升级,我们不需要重新构建N个镜像(假设有N个不同的应用或WAR包)。

另一方面,通过使用sidecar来“搬运”应用WAR包,我们又不用担心可移植性的问题:只要把app-sidecar容器和Jetty容器定义在一个容器组中,Caicloud会保证应用War会一直“跟着Jetty容器跑”。

在开发模式下使用Docker Jetty

上述使用War包的方法是将Docker作为软件发布的载体。有些时候开发者也会使用Docker作为本地开发的环境(在本地开发修改代码,同时在本地以Docker的形式运行当前代码)。此时需要注意的是,如果本地的代码文件是通过COPY或ADD加入到Docker镜像中,那么哪怕在Docker内使用mvn jetty:run, mvn也无法实时地反应本地文件、代码的变化。一个解决方法是通过挂载数据卷的方式来连接到本地的代码文件。

Docker Jetty模式下的日志

在非Docker模式下,Jetty的日志会根据Jetty的配置文件写到指定的位置,例如:/var/log/jetty。在Docker模式下,例如使用官方的Jetty镜像,这个日志文件会被完全取消,例如在Jetty 9.2.10的Dockerfile中:sed -i '/jetty-logging/d' etc/jetty.conf

这样,Jetty的日志会写到标准输出中从而被Docker或Caicloud平台进行统一的管理。

女装
文章评论