1.DockerFile是什么
2.DockerFile构建过程解析
3.DockerFile罕用保留字指令
4.DockerFile自定义CentOS镜像
5.DockerFile自定义微服务镜像
1.DockerFile是什么
假如咱们想自定义一个Docker镜像,基于Centos7镜像具备vim+ifconfig+jdk8,依照咱们以前的学习的步骤,咱们须要先下载镜像,而后运行容器,再以进入容器进行vim+ifconfig+jdk8的装置,再把这个容器打包成新的镜像,这样操作十分繁琐,咱们有没有更简略的形式来操作这一系列的步骤呢?此时就引出了咱们的DockerFile。
DockerFile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数形成的脚本。
应用DockerFile的3步骤:
1)编写DockerFile文件。
2)docker build命令形成镜像。
3)docker run依镜像运行容器实例
2.DockerFile构建过程解析
咱们先来看看一个简略的DockerFile文件:
#基于centosFROM centos#镜像维护者的姓名和邮箱地址MAINTAINER slf<xxx@qq.com>#设置名为MYPATH的变量ENV MYPATH /usr/local#指定在创立容器后,终端默认登陆的进来工作目录WORKDIR $MYPATH
以上案例中,基于centos镜像,对镜像进行了一系列操作,咱们能够得出Dockerfile内容基础知识为:
1)每条保留指令必须都为大写字母且前面必须要跟至多一个参数
2)指令从上到下,程序执行
3)#示意正文
4)每条指令都会创立一个新的镜像并对容器进行提交
由此能够得出,Docker执行DockerFile的大抵流程为:
1)docker从根底镜像中抉择一个当做容器
2)执行一条条指令对容器进行批改
3)执行相似docker commit的操作提交一个新的镜像层
4)docker再基于刚提交的镜像运行一个新容器
5)执行dockerfile中的下一条指令直到所有指令都执行实现
最初咱们得出如下论断:
咱们从软件的角度来看,Dockerfile、Docker镜像和Docker容器别离代表一个软件的三个不同的阶段:
- Dockerfile是软件的一系列原材料
- Docker镜像是软件的交付品
- Docker容器则是软件镜像的运行态。
Dockerfile面向开发,Docker镜像成为交付规范,Docker容器则波及部署与运维,三者缺一不可,合力充当Docker体系的基石。
最初再总结一下这三个概念:
1)Dockerfile,Dockerfile定义了应用程序所须要的所有货色,包含执行的代码,文件,环境,依赖,操作系统版本等等。
2)Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时会真正开始提供服务;
3)Docker容器,间接提供服务
3.DockerFile罕用保留字指令
FROM :根底镜像,以后新镜像是基于哪个镜像,指定那个镜像作为模板,第一条必须是FROM
MAINTAINER:镜像保护的作者
RUN:容器构建时要运行的命令 (在 docker build时运行)
它有两种格局:
shell格局:
RUN yum -y install vim
exec格局:
EXPOSE:容器往外裸露的接口
WORKDIR:用来指定创立容器后,终端默认登录进来的工作目录。
USER:指定该镜像应用什么样的用户执行,默认root
ENV:设置变量,如:
ENV MY_PATH /usr/mytest
这个环境变量能够在后续的任何RUN指令中应用,这就如同在命令后面指定了环境变量前缀一样,也能够在其它指令中间接应用这些环境变量。
比方:WORKDIR $MY_PATH
ADD:将宿主机目录下的文件拷贝到镜像外面,且会主动解决URL和解压tar压缩包。
COPY:相似ADD,拷贝文件和目录到镜像中。
将从构建上下文目录中 <源门路> 的文件/目录复制到新的一层的镜像内的 <指标门路> 地位。
COPY src dest
VOLUME :容器数据卷,用于数据保留和长久化工作。
VOLUME指令只是起到了申明了容器中的目录作为匿名卷,然而并没有将匿名卷绑定到宿主机指定目录的性能。
CMD: 指容器启动后干的事件。
Dockerfile 中能够有多个 CMD 指令,但只有最初一个失效,CMD 会被 docker run 之后的参数替换。
CMD和run的区别:
CMD是在docker run 时运行。
RUN是在 docker build时运行。
ENTRYPOINT:也是用来指定一个容器启动时要运行的命令,但有几点要留神:
这条明令相似于CMD命令,然而ENTRYPOINT不会被docker run前面的命令笼罩,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
举例:
ENTRYPOINT ["java","-jar","DockerDemo.jar"] 运行jar包。
长处:在执行docker run的时候能够指定ENTRYPOINT运行所需参数。
留神:如果Dockerfile中存在多个ENTRYPOINT指令,仅最初一个失效。
4.DockerFile自定义CentOS镜像
咱们搭建一个Centos7镜像,具备vim+ifconfig+jdk8。
咱们先去下载一个java8的Linux安装包:
https://mirrors.yangxingzhen....
复制到和Dockerfile一个目录上面:
筹备编写Dockerfile文件:
FROM centos:7MAINTAINER slf ENV MYPATH /usr/localWORKDIR $MYPATH #装置vim编辑器RUN yum -y install vim#装置ifconfig命令查看网络IPRUN yum -y install net-tools#装置java8及lib库RUN yum -y install glibc.i686RUN mkdir /usr/local/java#ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz增加到容器中,安装包必须要和Dockerfile文件在同一地位ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/#配置java环境变量ENV JAVA_HOME /usr/local/java/jdk1.8.0_171ENV JRE_HOME $JAVA_HOME/jreENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATHENV PATH $JAVA_HOME/bin:$PATH EXPOSE 80 CMD echo $MYPATHCMD echo "success--------------ok"CMD /bin/bash
执行命令:
docker build -t centosjava8:1.5 .留神 :下面TAG前面有个空格,有个点
执行命令:
进入这个容器,查看是否装置胜利:
5.DockerFile自定义微服务镜像
咱们应用idea打包一个springBoot我的项目进去,而后把这个微服务丢到Docker外面运行:
yml:
server: port: 6001
controller:
@RestControllerpublic class TestController { @Value("${server.port}") private String port; @RequestMapping("/docker") public String helloDocker() { return "hello docker"+"\t"+port+"\t"+ UUID.randomUUID().toString(); } @RequestMapping(value ="/index",method = RequestMethod.GET) public String index() { return "服务端口号: "+"\t"+port+"\t"+UUID.randomUUID().toString(); }}
打包:
拷贝到和DockerFile一个目录下:
Dockerfile:
# 根底镜像应用javaFROM williamyeh/java8# 作者MAINTAINER slf# VOLUME 指定长期文件目录为/tmp,在主机/var/lib/docker目录下创立了一个临时文件并链接到容器的/tmpVOLUME /tmp# 将jar包增加到容器中并更名为DockerDemo.jarADD DockerDemo-0.0.1-SNAPSHOT.jar DockerDemo.jar# 运行jar包RUN bash -c 'touch /DockerDemo.jar'ENTRYPOINT ["java","-jar","DockerDemo.jar"]#裸露6001端口作为微服务EXPOSE 6001
启动构建命令:
docker build -t slf_docker:1.6 .
运行镜像:
docker run -d -p 6001:6001 slf_docker:1.6
拜访测试: