目前还有不少公司有比较独立传统应用使用了jdk1.6+tomcat(或者resin3.x.x)的部署方式。针对这种应用可以怎样快速进行Docker部署呢,我们是使用docker hub提供的jre基础镜像的基础上,添加了我们需要的web container,成为我们自己的应用部署基础镜像, 这里我们说说这个镜像怎样使用的。
我们使用了resin-3.x.x,遵循GPLv3协议的。我们的基础镜像名称为: xxgroup-jdk6-resin3.x.x,有2个细分版本,分别为:xxx/xxgroup-jdk6-resin3.1.8:v1-gbk,xxx/xxgroup-jdk6-resin3.1.8:v1-utf8。
一、版本说明
Java版本: openjdk:1.6.0_38
resin版本: resin-3.1.8
mysql驱动包版本:mysql-connector-java-5.1.35-bin
二、基本配置
镜像默认暴露端口(resin服务监听端口):80
日志默认全部到stdout, 具体日志滚动使用log4j、logback等日志插件
resin的cache默认不开启
resin默认配置说明:
# jvm默认配置: <jvm-arg>-Xms256m</jvm-arg> <jvm-arg>-Xmx256m</jvm-arg> <!-- make ms=mx to reduce GC times --> <jvm-arg>-XX:PermSize=32m</jvm-arg> <jvm-arg>-XX:MaxPermSize=64m</jvm-arg> <jvm-arg>-XX:MaxDirectMemorySize=128m</jvm-arg> <jvm-arg>-Xss256k</jvm-arg> <jvm-arg>-Djava.net.preferIPv4Stack=true</jvm-arg> <!-- disable IPv6 --> # 其他配置: <!-- Maximum number of threads. --> <thread-max>512</thread-max> <!-- Configures the socket timeout --> <socket-timeout>65s</socket-timeout> <!-- Configures the keepalive --> <keepalive-max>256</keepalive-max> <keepalive-timeout>120s</keepalive-timeout>
三、进阶配置
1、jvm 内存等调整
Dockerfile 的 ENTRYPOINT 追加 jvm参数会覆盖默认 如下:
ENTRYPOINT ["/resin-3.1.8/bin/httpd.sh", "-Xms2048m", -Xmx2048m]
注意:对应容器也要跟着适配内存大小,避免出现异常问题
如:k8s 的resource.request 和 limit 的内存限制
2、数据源配置 (涉及敏感信息,k8s维护人员操作,开发配合)
a、开发告知运维datasource名称、类型、驱动类, 连接数等, 新建数据源的ConfigMap,内容是xml,参考如下
<cluster xmlns="http://caucho.com/ns/resin" xmlns:resin="http://caucho.com/ns/resin/core"> <!-- database --> <database ping='true' ping-table='dual'> <jndi-name>jdbc/application-db-name</jndi-name> <driver> <type>com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource</type> <url>jdbc:mysql://192.168.x.x:3307/db_name?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8</url> <user>db_uesr</user> <password>db-password</password> </driver> <prepared-statement-cache-size>30</prepared-statement-cache-size> <max-connections>30</max-connections> <max-idle-time>120s</max-idle-time> </database> </cluster>
b、使用k8s的 ConfigMap 挂载配置到 /conf/database_conf.xml (镜像默认读取此文件),也可以使用k8s的secret的。
注意:数据源名称跟开发对好,保持一致
四、Dockerfile配置
- 在项目根目录下创建Dockerfile文件,内容如下:
FROM xxx/xxgroup-jdk6-resin3.1.8:v1-gbk ARG WEB_PATH ADD $WEB_PATH /data/web ENTRYPOINT ["/resin-3.1.8/bin/httpd.sh", "-Xmx512m", "-Xms512m"]
五、开发打包说明
1、项目构建必须是maven项目,maven版本3.2+以上即可
2、项目POM文件增加dockerfile插件:dockerfile-maven-plugin,样例代码可参考下面:
<plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>${dockerfile-maven-plugin.version}</version> <executions> <execution> <id>default</id> <goals> <goal>build</goal> <goal>push</goal> </goals> </execution> </executions> <configuration> <repository>${docker.host.dev}/${project.artifactId}</repository> <tag>${project.version}</tag><!-- docker默认使用pom版本 --> <!-- 使用maven setting.xml里的配置 --> <useMavenSettingsForAuth>true</useMavenSettingsForAuth> <buildArgs> <WEB_PATH>./target/${project.artifactId}</WEB_PATH> </buildArgs> </configuration> </plugin>
3、插件不支持1.6版本的,可以使用1.8版的,然后编译版本指定对应的, 如下:
<maven.compiler.source>1.6</maven.compiler.source>
<maven.compiler.target>1.6</maven.compiler.target>
4、构建镜像、推送镜像
mvn clean package dockerfile:build dockerfile:push -e
这里就描述了一种应用的k8s的部署方法,怎样建立一个属于自己的docker 镜像,同时在使用这个镜像时的过程和注意的事项,希望能给大家一些参考。