热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Dockerfile生成镜像并实现应用自启

初学docker,磕磕绊绊经历了很多坑,终于摸着点门路,趁手热赶紧记下来,后面温习改进。本篇的主要内容是,通过dockerfile文件,生成一个新镜像,并且实现镜像在启容器时,容器中应用自启动。

初学docker,磕磕绊绊经历了很多坑,终于摸着点门路,趁手热赶紧记下来,后面温习改进。本篇的主要内容是,通过dockerfile文件,生成一个新镜像,并且实现镜像在启容器时,容器中应用自启动。
关于docker的基本操作和基础镜像这里就不再赘述了,我基于的基础镜像是centos7.0。

第1步,准备jdk1.7压缩包,并解压

# wget http://zhibo100.oss-cn-hangzhou.aliyuncs.com/software/jdk-7u79-linux-x64.tar.gz

# tar -zxvf jdk-7u79-linux-x64.tar.gz

第2步,编辑dockerfile文件(涉密部分x代替)

FROM 基础镜像:1.2
MAINTAINER xxxxxxxxxxxxxxxxxx.com

COPY jdk1.7.0_79 jdk1.7.0_79

ENV JAVA_HOME=/jdk1.7.0_79
ENV PATH=$JAVA_HOME/bin:$PATH
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

EXPOSE 20110
EXPOSE 20140
EXPOSE 20410
EXPOSE 20440

ENTRYPOINT ["java","-jar","/esb/lib/xxxxxx.jar"]

第3步,生成镜像(注意命令后面有一个 . )

# docker build -t 新镜像名 .

步骤看着很简单是吧?对于新手真是踩坑踩的不要不要的

1,如何进行容器中端口与宿主机的端口映射?
这是我在操作过程中遇到的第一个坑,先来认识两个参数:

-p 可以指定要映射的端口,并且在一个指定端口上只可以绑定一个容器
-P 它会随机映射一个端口至容器内部开放的网络端口

对于指定端口映射,可以采用如下命令去启动容器

# docker run -d -it -p 宿主机端口:容器端口 -p 8088:8080 --name 容器名 镜像名:版本号

另外一种,就是本文dockerfile采用的这一种了,dockerfile中EXPOSE命令字,EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
生成容器时使用命令

# docekr run -d -it -P --name 容器名 镜像名:版本号

2,如何实现容器在启动时,应用自启动
这里描述一个之前失败的一个思路,并且总结从中学习到的东西。
容器中放一个启动脚本文件(.sh),然后在dockerfile中用CMD命名去执行;
然后出现了一个问题:容器启动后自动退出,并且应用没启
通过查找发现,Docker 在执行shell的时候,是在后台执行的;因此,在shell执行完成以后,docker检测到没有前台任务需要执行,便退出container。在shell脚本的最后加上一个“永远完成不了”的命令:

# tail -f /dev/null

进一步来探寻这个问题
Docker 不是虚拟机,容器中的应用都应该以前台执行,而不是像虚拟机、物理机里面那样,用 upstart/systemd 去启动后台服务,容器内没有后台服务的概念。对于容器而言,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主进程退出,容器就失去了存在的意义,从而退出,其它辅助进程不是它需要关心的东西。因此主进程实际上是 sh。那么当 service nginx start 命令结束后,sh 也就结束了,sh 作为主进程退出了,自然就会令容器退出。
所以我后来采取了直接执行jar包


推荐阅读
  • 1.脚本功能1)自动替换jar包中的配置文件。2)自动备份老版本的Jar包3)自动判断是初次启动还是更新服务2.脚本准备进入ho ... [详细]
  • 本文详细介绍了在Centos7上部署安装zabbix5.0的步骤和注意事项,包括准备工作、获取所需的yum源、关闭防火墙和SELINUX等。提供了一步一步的操作指南,帮助读者顺利完成安装过程。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • Hadoop2.6.0 + 云centos +伪分布式只谈部署
    3.0.3玩不好,现将2.6.0tar.gz上传到usr,chmod-Rhadoop:hadophadoop-2.6.0,rm掉3.0.32.在etcp ... [详细]
  • 随着我司的应用都开始容器化,相应的ETL流程也需要迁移到容器中。常规的SQL和shell脚本迁移之后执行基本没有问题,主要的问题在于数据接入使用kettle的场景下,kettle启 ... [详细]
  • centos6.8 下nginx1.10 安装 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • centos安装Mysql的方法及步骤详解
    本文介绍了centos安装Mysql的两种方式:rpm方式和绿色方式安装,详细介绍了安装所需的软件包以及安装过程中的注意事项,包括检查是否安装成功的方法。通过本文,读者可以了解到在centos系统上如何正确安装Mysql。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • Question该提问来源于开源项目:react-native-device-info/react-native-device-info ... [详细]
author-avatar
love28119_529_700
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有