之前已经了解了docker的基本使用方式,简单的上手,也能让大部分人了解到这个技术的使用方法,今天继续说明docker如何构建自己所需要的镜像,开发人员掌握使用基础即可,有兴趣的可以自行深入研究
前言
docker的相关操作命令不是本文的重点部分,自行查找资料或去官网学习,另外,docker也有其api接口(类似restful api),需要使用时需要进行设置开启api端口,具体参照官网
本文主要说明创建自己所需要的镜像,由于经常需要根据开发人员或运维人员的需求内置一些组件,而公共的docker镜像不能满足其需要,就需要自行根据需求创建镜像,本文主要说明创建镜像的相关操作,不会过于深入,毕竟笔者也不属于系统运维人员,只进行基础的镜像创建说明
需求说明
由于系统运维人员需要Tomcat开启其JMX功能来监控服务的各个属性,而目前官方镜像上也没有这种定制的镜像,故我们需要自行构建
JMX简介
JMX(Java Management Extensions):
JMX是用于管理和监控JAVA应用的接口规范,同时具有以下特点:
- 通过JMX的”MBeans“来读取数据
- 可以读取和写入MBean的属性
- 可以执行MBean的方法
我们都熟悉JAVA中的反射,而JMX的整体实现和作用,和反射有很大的相似性。只是JMX允许执行远程主机上的目标方法。通过JMX,可以轻松获取JVM的各项数据值,例如GC执行次数,当前JVM使用的GC类型,内存占用,GC暂停的时间等。在此之上,Tomcat对外暴露了许多有用的数据,可以通过JMX获取具体通道的连接数据,请求数,响应数,失败的请求有多少,线程池的数据,JNDI的数据等等。
JMX功能开启
一定要先去看官网的开启配置!一定要先去看官网的开启配置!一定要先去看官网的开启配置! 重要的事情说3遍!!!
作者本人第一次搞的时候直接找了一篇文章按操作来搞,发现不管用,搞了半天,发现配置的东西不对,也是无语,也不知道发帖的同学有没有自己搞过,反正我没成功,最后还是去官网看了配置才搞好的 = =
官网配置说明:tomcat8(其他版本自行查找):
这个网址也要看下:
镜像创建过程
以centos7环境下为例
下载tomcat8
mkdir tomcat8cd tomcat8wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.45/bin/apache-tomcat-8.5.45.tar.gztar -xzvf apache-tomcat-8.5.45.tar.gz
JMX属性配置说明
根据说明更新catalina.sh,这里我插入到Execute The Requested Command
注释下面 位置不要乱放
参数名 | 含义 |
---|---|
Dcom.sun.management.jmxremote | 开启JMX |
Djava.rmi.server.hostname | 主机ip或DNS |
Dcom.sun.management.jmxremote.port | 启用JMX连接的端口号,必须要设置 |
Dcom.sun.management.jmxremote.rmi.port | 启用RMI连接的端口号 |
Dcom.sun.management.jmxremote.ssl | 启用远程监视和管理时,默认启用SSL,这里关闭 |
Dcom.sun.management.jmxremote.authenticate | 密码验证 这里关闭 |
例如:
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=172.0.0.1-Dcom.sun.management.jmxremote.port=12345-Dcom.sun.management.jmxremote.rmi.port=12345-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
如果需要鉴权请自行根据官网说明配置
修改配置文件
在catalina.sh中添加如下部分
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=172.0.0.1-Dcom.sun.management.jmxremote.port=12345-Dcom.sun.management.jmxremote.rmi.port=12345-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
修改server.xml中的端口号port,动态改变变量
创建dockerfile
touch Dockerfile
以jdk8为基础镜像进行创建
FROM ascdc/jdk8ADD apache-tomcat-8.5.45 /usr/local/apache-tomcat-8.5.45RUN chmod 777 /usr/local/apache-tomcat-8.5.45/bin/*ENV PORT 8080ENV JMXPORT 12345ENV JMXIP 127.0.0.1ENV CATALINA_OPTS ""COPY docker-entrypoint.sh /usr/local/bin/RUN chmod 777 /usr/local/bin/docker-entrypoint.shENTRYPOINT /usr/local/bin/docker-entrypoint.sh
创建docker-entrypoint.sh
docker-entrypoint.sh文件可以帮助我们将启动容器传入的参数进行容器的初始化操作,可以理解为web项目的spring初始化操作,在系统正式服务前先进行需要的操作,我们这里就是将IP,端口等将文件中对应的地方替换
touch docker-entrypoint.sh
JMX需要指定ip和port所以前边才会添加env参数否则jmx开启不会成功,另一方面也是为了不被其他传过来的CATALINA_OPTS值覆盖掉,故需要特别处理
#!/bin/bash#port=$1dir=/usr/local/apache-tomcat-8.5.45# 获取传入的参数替换$TOMCAT_PORTif [ -z "$PORT" ]then sed -i "s/\$TOMCAT_PORT/8080/g" $dir/conf/server.xmlelse sed -i "s/\$TOMCAT_PORT/$PORT/g" $dir/conf/server.xmlfi# modify jmx catalina.shsed -i "s/\$CATALINA_OPTS_INIT/$CATALINA_OPTS/g" $dir/bin/catalina.shsed -i "s/\$JMXIP/$JMXIP/g" $dir/bin/catalina.shsed -i "s/\$JMXPORT/$JMXPORT/g" $dir/bin/catalina.shsh $dir/bin/startup.sh#run customer commandfile=/usr/local/bin/custom/customer.shif [ -f "$file" ]; then sh $file fitail -f /usr/local/apache-tomcat-8.5.45/logs/catalina.out
创建镜像所需文件如下:
drwxr-xr-x 9 root root 4.0K Aug 31 10:46 apache-tomcat-8.5.45-rw-r--r-- 1 root root 604 Aug 31 12:34 docker-entrypoint.sh-rw-r--r-- 1 root root 339 Aug 31 12:26 Dockerfile
镜像创建
docker build -t tomcat8-jmx .
使用docker images 查看到创建的镜像如下:
tomcat8-jmx latest 5e5cbbded58d 4 seconds ago 658 MB
至此镜像算创建成功,我们可以启动来验证
启动容器
docker run -i -t \--name tomcat8 \-p 8091:8080 \-p 12345:12345 \-m 512m \--cpu-period=100000 \--cpu-quota=100000 \-e CATALINA_OPTS="-Djava.rmi.server.hostname=127.0.0.1 \-Dcom.sun.management.jmxremote \-Dcom.sun.management.jmxremote.port=12345 \-Dcom.sun.management.jmxremote.ssl=false \-Dcom.sun.management.jmxremote.authenticate=false \-Dcom.sun.management.jmxremote.rmi.port=12345" \-d tomcat8-jmx
验证
wget https://cucc.file.qiansw.com:1443/2017/06/cmdline-jmxclient-0.10.3.jarjava -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:12345 java.lang:type=Memory NonHeapMemoryUsage
得到如下结果说明正确
08/31/2019 13:32:28 +0800 org.archive.jmx.Client NonHeapMemoryUsage: committed: 25952256init: 2555904max: -1used: 24987192
总结
当我们需要自行创建所需要的镜像时,按照上边的步骤操作即可,主要的两个文件Dockerfile和docker-entrypoint.sh
Dockerfile文件中每个命令说明自行查找资料,不是很复杂,与我们在centos系统上安装软件类似,所以很好掌握,同时最后会将docker-entrypoint.sh文件放入,这个文件即容器的初始化操作文件,在容器正式提供服务前,在这个文件里做一些初始化操作
从上边我们也可以看出来,镜像的创建与我们安装软件没太大的区别,非常简单,最最重要的是我们下次用的时候直接拉去这个镜像即可,很强的优势,分分钟搞定所需的环境
以上内容如有问题欢迎指出,笔者验证后将及时修正,谢谢