本报告以技术栈 JAVA 为例,列举并解释了一些面向 Docker 进行应用程序开发和系统搭建中所需要注意的问题和技巧,以及 Caicloud 平台在 Docker 管理和帮助企业应用向 Docker 转化中的作用。由于应用程序千差万别,应用场景层出不穷,本文仅起到抛砖引玉的作用。
Java 栈
War 包在 Tomcat 或 Jetty 下的加载方式。
JAVA 应用的经典交付形态是 WAR 包,在 Docker 下使用 Tomcat 或 Jetty 来进行 WAR 包的部署可以有两种方式:
1.将 WAR 包放到 Docker 镜像中:这种好处是产生的 Docker 镜像自包含,发布时不需要再发布独立的 WAR 包。Dockerfile 例子如下:
这种方法的缺点是每次更新 WAR 包需要重新构建 Docker 镜像。
1.将 WAR 包作为外部数据卷挂载:不将 WAR 包放在镜像里,这种方法的好处是每次 WAR 包更新,Docker 镜像不需要更新。但是需要额外的 WAR 包发布机制。考虑到目前应该有 WAR 包发布机制,此方案可能更为灵活和熟悉。但这种方案的缺点就是 Docker 的可移植性受到损害,因为每个环境下必须要在宿主机的指定路径下有 WAR 包,使得 Docker 可以对其进行挂载。
JAVA 发布的 Sidecar 模式
Caicloud 的容器组的概念保证容器组中的容器可以做到:
1.任何时候都运行在同一个宿主机上
2.共享同样的外部挂载数据卷
这两个特性使得我们可以实现如下的 sidecar 模式:
这样取得了一箭双雕的好处:
(图片来源于网络)
另一方面,通过使用 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 平台进行统一的管理。
本文转载自才云 Caicloud 公众号。
原文链接:https://mp.weixin.qq.com/s/t5liJm9JBlLCuqUk6lV_DA
评论