1.什么是Dockfile
定义:用来帮助我们自己构建一个自定义镜像
Dockerfile可以认为是 Docker镜像的描述文件,是由一系列命令和参数构成的脚本。
主要作用是用来构建docker镜像的构建文件
1
通过架构图可以看出通过DockerFile可以直接构建镜像
dockerfile解析过程
docker build

2.Dockerfile的基本结构
Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。
3.Dockerfile的保留命令
3.1 from命令
指定基础镜像,必须为第一个命令
格式:FROM <image>FROM <image>:<tag>FROM <image>@<digest>示例:FROM mysql:5.6注:tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
3.2 maintainer命令
镜像维护者的姓名和邮箱地址
格式:MAINTAINER <name>示例:MAINTAINER Jasper XuMAINTAINER sorex@163.comMAINTAINER Jasper Xu <sorex@163.com>
3.3 run命令
构建镜像时执行的命令
RUN用于在镜像容器中执行命令,其有以下两种命令执行方式:shell执行格式:RUN <command>exec执行格式:RUN ["executable", "param1", "param2"]示例:RUN ["executable", "param1", "param2"]RUN apk updateRUN ["/etc/execfile", "arg1", "arg1"]注:RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache


示例:在原始的centos7上扩展vim
3.4 expose命令
指定于外界交互的端口
格式:EXPOSE <port> [<port>...]示例:EXPOSE 80 443EXPOSE 8080 EXPOSE 11211/tcp 11211/udp注:EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口
3.5 workdir命令
工作目录,类似于cd命令
格式:WORKDIR /path/to/workdir示例:WORKDIR /a (这时工作目录为/a)WORKDIR b (这时工作目录为/a/b)WORKDIR c (这时工作目录为/a/b/c)注:通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
3.6 env命令
设置环境变量,这个值将出现在构建阶段中所有后续指令的环境中
格式:ENV <key> <value> #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量ENV <key>=<value> ... #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行示例:ENV myName John DoeENV myDog Rex The DogENV myCat=fluffy

3.7 add命令
将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
格式:ADD <src>... <dest>ADD ["<src>",... "<dest>"] 用于支持包含空格的路径示例:ADD hom* /mydir/ # 添加所有以"hom"开头的文件ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt"ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/

3.9 copy命令
功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
3.10 volume命令
用于指定持久化目录
格式:VOLUME ["/path/to/dir"]示例:VOLUME ["/data"]VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"注:一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:1 卷可以容器间共享和重用2 容器并不一定要和其它容器共享卷3 修改卷后会立即生效4 对卷的修改不会对镜像产生影响5 卷会一直存在,直到没有任何容器在使用它
3.11 entrypoint命令
配置容器,使其可执行化。配合CMD可省去”application”,只使用参数。
格式:ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)ENTRYPOINT command param1 param2 (shell内部命令)示例:FROM ubuntuENTRYPOINT ["top", "-b"]

3.12 cmd命令
构建容器后调用,也就是在容器启动时才进行调用。
格式:CMD ["executable","param1","param2"] (执行可执行文件,优先)CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)CMD command param1 param2 (执行shell内部命令)示例:CMD echo "This is a test." | wc -CMD ["/usr/bin/wc","--help"]注:CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。

4.Dockerfile构建springboot应用
1.开发springboot应用
2.对springboot应用程序进行打包
3.打包项目
demo-0.0.1SNAPSHOT.jar
4.在服务器中创建dockerfiles上下目录 context
a. mkdir demo 这个目录作为context目录
b. 在demo目录中创建Dockerfile文件, touch Dockerfile
c.上传应用jar包到服务器context目录
d.编写Dockerfile
FROM openjdk:8-jreworkdir /appadd demo-0.0.1-SNAPSHOT.jar app.jarexpose 8081run yum -y install mysqlrun yum -y install httpd-toolsentrypoint ["java","-jar"]cmd ["app.jar"]
e.执行构建 docker build -t demo:01 .
f.运行容器 docker run -d -p 8081:8081 --name demo demo:01
