之前已经了解了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文件放入,这个文件即容器的初始化操作文件,在容器正式提供服务前,在这个文件里做一些初始化操作

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

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

Docker那些事儿之镜像创建的更多相关文章

  1. docker学习之二镜像创建

    继上一篇docker入门之后写一点使用的经验. 通过命令:docker run -it REPOSITORY或IMAGE ID   注:-it后面跟的字段可以通过下面指令获得 创建运行的容器,会进入一 ...

  2. Docker 基于已有镜像的容器创建镜像

    Docker 基于已有镜像的容器创建镜像: docker:/root# docker run -it januswel/centos /bin/bash docker exec -it januswe ...

  3. docker学习笔记4:利用docker hub上的mysql镜像创建mysql容器

    docker hub上有官方的mysql镜像,我们可以利用它来创建mysql容器,作为一个服务容器使用. 1.下载mysql镜像 docker pull mysql 2.创建镜像 docker run ...

  4. Docker学习笔记--2 镜像的创建

    如果我们需要在Docker环境下部署tomcat.redis.mysql.nginx.php等应用服务环境,有下面三种方法: 1,根据系统镜像创建Docker容器,这时容器就相当于是一个虚拟机,进入容 ...

  5. docker镜像创建

    1. 首选要创建一个Dockerfile文件,内容如下: FROM alpine:latest MAINTAINER  lobin <lobin.hotmail.com> RUN apk ...

  6. docker常用命令、镜像命令、容器命令、数据卷,使用dockerFile创建镜像,dockefile的语法规则。

    一.docker常用命令? 1. 常用帮助命令 1.1 docker的信息以及版本号 /* docker info 查看docker的信息 images2 docker本身就是一个镜像. docker ...

  7. 【转】深入 Docker:容器和镜像

    在本专栏往期的 Flux7 系列教程 里,我们已经简单地探讨了 Docker 的基本操作.而在那篇教程中,我们一直是简单地将容器当成是"正在运行的镜像",并没有深入地区分镜像和容器 ...

  8. Docker入门之二镜像

    Docker大部分的操作都是围绕三大核心概念:镜像.容器.仓库.学Docker首先得了解这几个词.这几个词可能平时也会有涉及,但Docker中可能不是同样得概念. 一.三大核心概念 镜像:可能在安装软 ...

  9. Docker安装入门 -- 应用镜像

    Docker安装入门 -- 应用镜像 WordPress  1.docker build -t csphere/wordpress:4.2 .  2.docker run -d -p 80:80 -- ...

随机推荐

  1. Linux下安装redis以及常用命令

    https://blog.csdn.net/zgf19930504/article/details/51850594 安装: 1.获取redis资源 wget http://download.redi ...

  2. 上传大文件到腾讯云cos遇到的一些问题

    讲一个开发遇到的问题. 开发中遇到一个需求,需要在后台表单页面支持上传视频.因为项目中一直用的是腾讯云的COS做第三方存储平台,所以视频也要上传到cos中保存.首先想到的是使用腾讯提供的php的SDK ...

  3. PHP提高in_array查找元素的方法

    PHP提高in_array查找元素的方法<pre><?php$arr = array(); // 创建10万个元素的数组for($i=0; $i<100000; $i++){ ...

  4. QT 头文件之间相互包含会报错:类名不存在

    "希望是一个美好的东西! 希望, 这能自己给自己,否则只有无尽的痛苦和迷茫!"---Frank 假设你写了两个类A和B,如果在A.h中有 #include<B.h>;  ...

  5. Linux基础-12-yum管理软件包

    1. yum的功能 yum是Yellow dog Updater, Modified的缩写,目的就是为了解决RPM的依赖关系的问题,方便使用者进行软件的安装.升级等等工作. 2. 光盘挂载和镜像挂载 ...

  6. oracle-3-Linux-11g安装-静默安装

    oracle下载地址:https://www.oracle.com/database/technologies/112010-linx8664soft.html 系统是最小化安装的Centos7.2 ...

  7. 2019杭电多校三 C. Yukikaze and Demons (点分治)

    大意: 给定树, 每个点有一个十进制数位, 求有多少条路径组成的十进制数被$k$整除. 点分治, 可以参考CF715C, 转化为求$10^a x+b\equiv 0(mod\space k)$的$x$ ...

  8. webpack 3.1 升级webpack 4.0

    webpack 3.1 升级webpack 4.0 为了提升打包速度以及跟上主流技术步伐,前段时间把项目的webpack 升级到4.0版本以上 webpack 官网:https://webpack.j ...

  9. Web Scraper 翻页——控制链接批量抓取数据(Web Scraper 高级用法)| 简易数据分析 05

    这是简易数据分析系列的第 5 篇文章. 上篇文章我们爬取了豆瓣电影 TOP250 前 25 个电影的数据,今天我们就要在原来的 Web Scraper 配置上做一些小改动,让爬虫把 250 条电影数据 ...

  10. 【转载】Intellij IDEA神器居然还有这些小技巧

    概述Intellij IDEA真是越用越觉得它强大,它总是在我们写代码的时候,不时给我们来个小惊喜.出于对Intellij IDEA的喜爱,我决定写一个与其相关的专栏或者系列,把一些好用的Intell ...