如何进入正在运行中的Docker压力容器年检多久 00 久酷

一、安装SSL证书环境
1.1 SSl证书安装环境简介
Linux服务器一台;
阿里云平台(SLB/CDN/WAF);
SSL证书一张(备注:本指南使用域名OV SSL证书进行操作,通用其它版本证书);
1.2 网络环境要求
在代码进行Proguard 混淆之后,需要通过tomcat或者其他web服务进行启动,启动时报错如下:
Caused by: java.lang.VerifyError: Expecting a stackmap frame at branch target 63
Exception Details:
org/jiucool/listener/DatabaseUpdateListener.cD()V @12: ifeq
曾几何时认为世界多么的美好,可事实上虽有美好,但糟粕也是很多的,近期我们的项目,终端系统要部署到客户那里,让人没想到的是作为国内某知名专家的项目团队几乎原样将我们的宣传材料、业务流程照搬过去,着实令人汗颜,所以对项目源码的保护必须提上日程。项目为web项目。
一、选择加密工具
经过筛选,最终选择了proguard加密工具。
ProGuard是一个压缩、优化和混淆Java字节码文件的免费的工具,它可以删除无用的类、字段、方法和属性。可以删除没用的注释,最大限度地优化字节码文件。它还可以使用简短的无意义的名称来重命名已经存在的类、字段、方法和属性。
先说一下我的系统环境,系统 centos 7.2,docker版本 V1.10.2
一、Docker 存储驱动背景
Docker模型的核心部分是有效利用分层镜像机制,镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。不同 Docker 容器就可以共享一些基础的文件系统层,同时再加上自己独有的改动层,大大提高了存储的效率。
在docker0.7中引入了storage driver,更之后针对镜像存储docker采用了几种不同的存储drivers,包括:aufs,devicemapper,btrfs 和overlay。
下述过程都是在cenots 7.2上进行。
默认安装完成docker后 docker 的所有images及相关信息存储位置为:/var/lib/docker
而通常我们系统盘挂载盘一般不会很大,所以需要将其移到其他分区,我们可以采用软连接的方式来完成,示例,下面我们将其移到/home/dockerfile 目录下,具体方法如下:
首先暂停docker 服务
[root@localhost docker]# service docker stop
该tomcat的构建基于上篇文章中sun server jre 8
一、编写Dockerfile文件
FROM jiucool/java:server-jre-8u74
一、Dockerfile、Docker镜像和Docker容器的关系
在进行创建镜像之前,我们先了解一下这三者之间的关系。
Dockerfile 是软件的原材料,Docker 镜像是软件的交付品,而 Docker 容器则可以认为是软件的运行态。从应用软件的角度来看,Dockerfile、Docker 镜像与 Docker 容器分别代表软件的三个不同阶段,Dockerfile 面向开发,Docker 镜像成为交付标准,Docker 容器则涉及部署与运维,三者缺一不可,合力充当 Docker 体系的基石。
不论是开发者是运维人员,都有进入运行中的docker container 容器的需求,很多朋友采用了如下方法:
使用ssh登陆进容器。(前提是你在image里安装了sshd服务,不过明显违反了docker单一进程原则)
使用nsenter、nsinit等第三方工具进行。不觉得这种方法过于繁琐?
最规范的方法应该是用docker提供的原生命令
一、Docker是什么?
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上。容器是完全使用沙箱机制。几乎没有性能开销,最重要的是,他们不依赖于任何语言、框架包括系统。
Docker先后赢得了Google、微软、Amazon、VMware等巨头的青睐,巨头们纷纷示意将保证自己平台与Docker容器技术的兼容性,作为国内最大的云服务商阿里云于2015年正式接口docker支持。
去年下半年进入新的项目团队,涉及到现有项目的升级改造、新功能开发,期间发现不少问题,现整理一下予以记录,希望对大家有所帮助。
原有登录流程为:
存在的问题主要有:
所有报文http明文传输,包括登录以及敏感信息的发送。
登录成功后,后续所有接口访问无需任何校验,比如我要进行修改密码直接post请求,不再做校验,http://ip/modifypwd?userid=888&oldpwd=123&newpwd=999&confirmpwd=999,相当于只要知道报文格式,就可以查询、修改系统内任何用户的任何的信息。
Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,很早之前研究过一段时间,但项目中一直也无应用,目前一大型项目准备应用之,发现之前阿里巴巴官网已无法访问,特地找了下,官网隐藏的还算比较隐蔽,看也有不少人没找着官网,这里公布一下希望对大家有所帮助。
http://dubbo.io/
不过我这里访问速度着实慢。
github地址:/alibaba/dubbo
Solr 5.1 版本于2015.04 发布,进行了下体验,发现之前的4.X、3.X版本中,每次版本迭代,变化都不小,不说别的,基本的接口、参数都会发生变化,所以对于已有项目的Solr升级还是要慎重一些。
对于项目中的中文分词一直是用的IK-analyzer,而IK-analyzer最新版本为IK Analyzer 2012FF_hf1,该版本直接安装于solr 5.1是无法运行的,于是下载IK Analyzer 2012FF_hf1源码进行了部分修改重新打包。
CategoriesCategories
Select Category
Louis Han:
那年的春天:
Louis Han:
Select Month
September 2016
April 2016
March 2016
February 2016
February 2015
December 2014
November 2014
August 2013
March 2013
August 2012
April 2012
March 2012
March 2011
August 2010
December 2007
Random Posts
网站统计信息
日志总数:37&篇
评论总数:9369&条
成立时间:号
网站运行:3475&天
标签总数:1739&条
最后更新:号
正在读取数据……优雅的终止docker容器 | iTimothy
在Docker大行其道的今天,我们能够非常方便的使用容器打包我们的应用程序,并且将它在我们的服务器上部署并运行起来。但是,谈论到如何停掉运行中的docker容器并正确的终止其中的程序,这就成为一个非常值得讨论的话题了。
事实上,在我们日常的项目当中,这是我们经常需要面对和处理的问题:
场景A:假如我们打包在容器中的程序,提供HTTP方式的服务,负责处理各种HTTP requests并返回结果,我们必然希望在容器被停掉的时候,能够让程序有时间把已经在处理中的请求继续处理完毕,并返回结果给客户端。
场景B:又比如我们打包在容器中的程序,负责写入数据到某个数据文件中,我们希望程序能够在容器被停掉的时候,有时间把内存中缓存的数据持久化到存储设备中,以防数据丢失。
场景C:再比如现在流行的微服务架构中,一般会有服务发现的机制,也即每一个微服务在启动之后,都会主动把自己的地址信息注册到服务发现模块当中,让其他的服务可以知道自己的存在。而在容器被停掉的时候,微服务需要即时从服务发现模块中注销自己,以防止从API Gateway而来的请求被错误的路由到了已经被停止掉的微服务。
如上的各种场景中,都要求打包在容器中的应用程序能够被优雅的终止(也即gracefully shutdown),这种gracefully shutdown的方式,允许程序在容器被停止的时候,有一定时间做一些后续处理操作,这也是我们需要进一步探讨的话题。
docker stop 与 docker kill 的区别Docker本身提供了两种终止容器运行的方式,即docker stop与docker kill。
docker stop先来说说docker stop吧,当我们用docker stop命令来停掉容器的时候,docker默认会允许容器中的应用程序有10秒的时间用以终止运行。所以我们查看docker stop命令帮助的时候,会有如下的提示:
123456789→ docker stop --helpUsage:
docker stop [OPTIONS] CONTAINER [CONTAINER...]Stop one or more running containersOptions:
Print usage
-t, --time int
Seconds to wait for stop before killing it (default 10)
在docker stop命令执行的时候,会先向容器中PID为1的进程发送系统信号SIGTERM,然后等待容器中的应用程序终止执行,如果等待时间达到设定的超时时间,或者默认的10秒,会继续发送SIGKILL的系统信号强行kill掉进程。在容器中的应用程序,可以选择忽略和不处理SIGTERM信号,不过一旦达到超时时间,程序就会被系统强行kill掉,因为SIGKILL信号是直接发往系统内核的,应用程序没有机会去处理它。在使用docker stop命令的时候,我们唯一能控制的是超时时间,比如设置为20秒超时:
1docker stop --time=20 container_name
docker kill接着我们来看看docker kill命令,默认情况下,docker kill命令不会给容器中的应用程序有任何gracefully shutdown的机会。它会直接发出SIGKILL的系统信号,以强行终止容器中程序的运行。通过查看docker kill命令的帮助,我们可以看到,除了默认发送SIGKILL信号外,还允许我们发送一些自定义的系统信号:
123456789→ docker kill --helpUsage:
docker kill [OPTIONS] CONTAINER [CONTAINER...]Kill one or more running containersOptions:
Print usage
-s, --signal string
Signal to send to the container (default "KILL")
比如,如果我们想向docker中的程序发送SIGINT信号,我们可以这样来实现:
1docker kill --signal=SIGINT container_name
与docker stop命令不一样的地方在于,docker kill没有任何的超时时间设置,它会直接发送SIGKILL信号,以及用户通过signal参数指定的其他信号。
其实不难看出,docker stop命令,更类似于Linux系统中的kill命令,二者都是发送系统信号SIGTERM。而docker kill命令,更像是Linux系统中的kill -9或者是kill -SIGKILL命令,用来发送SIGKILL信号,强行终止进程。
在程序中接收并处理信号了解了docker stop与docker kill的区别,我们能够知道,docker kill适合用来强行终止程序并实现快速停止容器。而如果希望程序能够gracefully shutdown的话,docker stop才是不二之选。这样,我们可以让程序在接收到SIGTERM信号后,有一定的时间处理、保存程序执行现场,优雅的退出程序。
接下来我们可以写一个简单的Go程序来实现信号的接收与处理,程序在启动过后,会一直阻塞并监听系统信号,直到监测到对应的系统信号后,输出控制台并退出执行。
123456789101112131415161718192021222324package mainimport ( "fmt" "os" "os/signal" "syscall")func main() { fmt.Println("Program started...") ch := make(chan os.Signal, 1) signal.Notify(ch, syscall.SIGTERM) s := &-ch if s == syscall.SIGTERM {
fmt.Println("SIGTERM received!")
} fmt.Println("Exiting...")}
接下来使用交叉编译的方式来编译程序,让程序可以在Linux下运行:
1CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o graceful
编译好之后,我们还需要打包程序到容器中运行。于是,我们还得有个Dockerfile。在这里,我们选择使用体积小又轻盈的alpine镜像作为基础镜像,打包这个Go程序:
12345from alpine:latestMAINTAINER TimothyADD graceful /gracefulCMD ["/graceful"]
这里需要避开的一个坑,是Dockerfile中CMD命令的用法。CMD命令有两种方式:
CMD /graceful
使用 CMD command param1 param2 这种方式,其实是以shell的方式运行程序。最终程序被执行时,类似于/bin/sh -c的方式运行了我们的程序,这样会导致/bin/sh以PID为1的进程运行,而我们的程序只不过是它fork/execs出来的子进程而已。前面我们提到过docker stop的SIGTERM信号只是发送给容器中PID为1的进程,而这样,我们的程序就没法接收和处理到信号了。
CMD [“/graceful”]
使用 CMD [“executable”,”param1”,”param2”] 这种方式启动程序,才是我们想要的,这种方式执行和启动时,我们的程序会被直接启动执行,而不是以shell的方式,这样我们的程序就能以PID=1的方式开始执行了。
话题转回来,我们开始执行容器构建操作,打包程序:
1docker build -t registry.xiaozhou.net/graceful:latest .
打包过后的镜像,才6MB左右:
123λ Timothy [workspace/src/graceful] → docker imagesREPOSITORY
SIZEregistry.xiaozhou.net/graceful
20 hours ago
启动并运行容器:
1λ Timothy [workspace/src/graceful] → docker run -d --name graceful b2210a85
查看容器运行状态:
123λ Timothy [workspace/src/graceful] → docker ps -aCONTAINER ID
NAMESfd18eedafd16
"/graceful"
3 seconds ago
Up 2 seconds
查看容器输出,能看到程序已经正常启动:
12λ Timothy [workspace/src/graceful] → docker logs gracefulStarted...
接着我们要使用docker stop大法,看程序能否响应SIGTERM信号:
12λ Timothy [workspace/src/graceful] → docker stop gracefulgraceful
最后,查看容器的日志,检验输出:
1234λ Timothy [workspace/src/graceful] → docker logs gracefulStarted...SIGTERM received!Exiting...
总结用docker kill命令,可以简单粗暴的终止docker容器中运行的程序,但是想要优雅的终止掉的话,我们需要使用docker stop命令,并且在程序中多花一些功夫来处理系统信号,这样能保证程序不被粗暴的终止掉,从而实现gracefully shutdown。
支持原创技术分享,据说打赏我的人,都找到了女朋友!
支付宝打赏2116人阅读
docker(2)
一、Dockerfile、Docker镜像和Docker容器的关系
在进行创建镜像之前,我们先了解一下这三者之间的关系。
Dockerfile 是软件的原材料,Docker 镜像是软件的交付品,而 Docker 容器则可以认为是软件的运行态。从应用软件的角度来看,Dockerfile、Docker 镜像与 Docker 容器分别代表软件的三个不同阶段,Dockerfile 面向开发,Docker 镜像成为交付标准,Docker 容器则涉及部署与运维,三者缺一不可,合力充当 Docker 体系的基石。
更多介绍可以移步这里:
二、创建自定义镜像的两种方式
三、采用Dockerfile创建镜像(建立通用java环境镜像)
为了保持镜像通用与可维护 ,首先我们需要首先创建一个环境配置java镜像。具体Dockerfile编写如下:
#首先设置我们基础镜像来源
FROM centos:latest
#设置作者信息
MAINTAINER jiucool &www.jiucool.org&
#下面是设置环境变量
ENV JDK_FILE_NAME server-jre-8u74-linux-x64.tar.gz
ENV INSTALL_FOLDER /home/install
ENV JDK_HOME /usr/local/jdk
#执行相关命令
RUN mkdir ${INSTALL_FOLDER}
RUN mkdir ${JDK_HOME}
ADD ${JDK_FILE_NAME} ${JDK_HOME}
ADD jdk.sh /etc/profile.d/
RUN chmod 755 /etc/profile.d/jdk.sh
chmod +x -R /usr/local/jdk/
WORKDIR ${INSTALL_FOLDER}
#执行的默认命令
CMD [&/bin/bash&]
我们的文件目录结构如下:
然后执行编译命令
build -t jiucool/java:server-jre-8u74 .
OK,到这里已经编译成功,我们需要运行该镜像验证一下,是否配置正确。
run -it jiucool/java:server-jre-8u74
OK,经验证一切正常。
四、镜像推送到docker hub 官方仓库
首先我们需要登录账号:
docker login
Username: jiucool
Email: XXXX@jiucool.org
Login Succeeded
推送到Docker Hub上的镜像必须按照下面的格式进行:username/image_name,如果命名的镜像名字不是按照上面的规则进行的,可以使用docker tag 进行修改。
下面执行推送命令:
push jiucool/java:server-jre-8u74
稍等片刻即推送成功。
然后通过官方库进行搜索查找验证。
至此,我们已经从编写Dockerfile — 编译 — 推送,完成了整个过程。
文章首发于我的个人博客:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:8923次
排名:千里之外docker(2)
一、Docker是什么?
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上。容器是完全使用沙箱机制。几乎没有性能开销,最重要的是,他们不依赖于任何语言、框架包括系统。
Docker先后赢得了Google、微软、Amazon、VMware等巨头的青睐,巨头们纷纷示意将保证自己平台与Docker容器技术的兼容性,作为国内最大的云服务商阿里云于2015年正式接口docker支持。
在Docker&1.0正式发布之前,就已经有3家主要银行将其投入到生产应用中,截止目前最新版本为:V1.10
二、目前docker主要应用场景
面向开发人员:快速开发、交付应用程序。在容器技术出现之前,公司往往是通过为开发人员提供一台或者多台虚拟机来充当开发测试环境。开发测试环境一般负载较低,大量的系统资源都被浪费在虚拟机本身的进程上了。docker容器几科没有任何CPU和内存上的额外开销,很适合用来提供公司内部的开发测试环境。而且由于docker镜像可以很方便的在公司内部分享,这对开发环境的规范性也有极大的帮助。
面向运维人员:降低运维成本。正如通过虚拟机来整合多个应用,Docker隔离应用的能力使得Docker可以整合多个服务器以降低成本。Docker通过镜像机制,将你的代码和运行环境直接打包成镜像,扔到容器启动即可,可快速部署、扩容。
面向企业:Docker本身就发家于PaaS,在Docker面向企业,是可以提供Paas层的实现;比如,扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。
三、Docker相对于 VM 的主要优势
Docker应用容器相对于 VM 有以下几个优点:
四、快速安装
这里以阿里云提供方式安装,系统以ceontos为例。
登录系统后执行
-sSL http://acs-public-mirror.oss-cn-/docker-engine/internet | sh -
稍等片刻即可安装完成(取决于你的网络环境)。
配置Docker加速器
可以使用如下的脚本将mirror的配置添加到docker daemon的启动参数中
# 系统要求 CentOS 7 以上,Docker 1.9 以上。
sudo cp -n /lib/systemd/system/docker.service /etc/systemd/system/docker.service
sudo sed -i &s|ExecStart=/usr/bin/docker daemon|ExecStart=/usr/bin/docker daemon --registry-mirror=https://8y7pouys.|g& /etc/systemd/system/docker.service
sudo systemctl daemon-reload
sudo service docker restart
阿里目前提供镜像管理功能,推荐使用之,另外如果你不想使用阿里提供的该功能,当然也可以搭建自己的docker 私有仓库进行管理,这点跟maven管理方式有些类似。
五、应用实例(以搜索、安装、运行tomcat为例)
这里以最常用的tomcat为例,在这儿之前我们的针对不同项目,开发测试环境需要部署不同的tomcat,需要保证相互之间互不影响,通常一个tomcat只发布一个应用,一般如下做法。
下面我们来看看docker方式:
六、国内一些提供docker服务的网站
本文首发于我的个人博客:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:8925次
排名:千里之外}

我要回帖

更多关于 电容器耐久性试验 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信