zoukankan      html  css  js  c++  java
  • Docker那些事儿之镜像创建

    之前已经了解了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(其他版本自行查找):

    http://tomcat.apache.org/tomcat-8.0-doc/monitoring.html#Enabling_JMX_Remote

    这个网址也要看下:

    https://docs.oracle.com/javase/6/docs/technotes/guides/management/agent.html

    镜像创建过程

    以centos7环境下为例

    下载tomcat8

    mkdir tomcat8
    cd tomcat8
    wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.45/bin/apache-tomcat-8.5.45.tar.gz
    tar -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,动态改变变量

         <Connector port="$TOMCAT_PORT" protocol="HTTP/1.1"
                    connectionTimeout="20000"
                    redirectPort="8443" />
    

    创建dockerfile

    touch Dockerfile
    

    以jdk8为基础镜像进行创建

    FROM ascdc/jdk8
    ADD apache-tomcat-8.5.45 /usr/local/apache-tomcat-8.5.45
    RUN chmod 777 /usr/local/apache-tomcat-8.5.45/bin/*
    ENV PORT 8080
    ENV JMXPORT 12345
    ENV JMXIP 127.0.0.1
    ENV CATALINA_OPTS ""
    COPY docker-entrypoint.sh /usr/local/bin/
    
    RUN chmod 777 /usr/local/bin/docker-entrypoint.sh
    ENTRYPOINT /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=$1
    dir=/usr/local/apache-tomcat-8.5.45
    
    # 获取传入的参数替换$TOMCAT_PORT
    if [ -z "$PORT" ]
    then 
       sed -i  "s/\$TOMCAT_PORT/8080/g" $dir/conf/server.xml
    else
       sed -i  "s/\$TOMCAT_PORT/$PORT/g" $dir/conf/server.xml
    fi
    
    # modify jmx catalina.sh
    sed -i  "s/\$CATALINA_OPTS_INIT/$CATALINA_OPTS/g" $dir/bin/catalina.sh
    sed -i  "s/\$JMXIP/$JMXIP/g" $dir/bin/catalina.sh
    sed -i  "s/\$JMXPORT/$JMXPORT/g" $dir/bin/catalina.sh
    
    sh $dir/bin/startup.sh
    
    #run customer command
    file=/usr/local/bin/custom/customer.sh
    if [ -f "$file" ]; 
    then  
        sh $file   
    fi
    
    tail -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.jar
    
    java -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: 25952256
    init: 2555904
    max: -1
    used: 24987192
    

    总结

    当我们需要自行创建所需要的镜像时,按照上边的步骤操作即可,主要的两个文件Dockerfile和docker-entrypoint.sh

    Dockerfile文件中每个命令说明自行查找资料,不是很复杂,与我们在centos系统上安装软件类似,所以很好掌握,同时最后会将docker-entrypoint.sh文件放入,这个文件即容器的初始化操作文件,在容器正式提供服务前,在这个文件里做一些初始化操作

    从上边我们也可以看出来,镜像的创建与我们安装软件没太大的区别,非常简单,最最重要的是我们下次用的时候直接拉去这个镜像即可,很强的优势,分分钟搞定所需的环境

    以上内容如有问题欢迎指出,笔者验证后将及时修正,谢谢

    作者:freeorange
    个人博客网站:https://www.gclearning.cn/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    背景透明,文字不透明
    判断数组类型
    前端工作流程自动化——Grunt/Gulp 自动化
    tools安装
    总结
    CSS Hack
    getBoundingClientRect()兼容性处理
    Math.random获得随机数
    spring RestTemplate 工程导入
    系统架构演变
  • 原文地址:https://www.cnblogs.com/freeorange/p/11438860.html
Copyright © 2011-2022 走看看