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

来源:互联网 发布:linux视频服务器搭建 编辑:程序博客网 时间:2024/06/05 00:20

初学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.2MAINTAINER xxxxxxxxxxxxxxxxxx.comCOPY jdk1.7.0_79 jdk1.7.0_79ENV JAVA_HOME=/jdk1.7.0_79ENV PATH=$JAVA_HOME/bin:$PATHENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarEXPOSE 20110EXPOSE 20140EXPOSE 20410EXPOSE 20440ENTRYPOINT ["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包

原创粉丝点击