1.什么是Dockfile

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

dockerfile解析过程
图片.png

docker build

图片.png


2.Dockerfile的基本结构

Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。

3.Dockerfile的保留命令

3.1 from命令

指定基础镜像,必须为第一个命令

  1. 格式:
  2.   FROM <image>
  3.   FROM <image>:<tag>
  4.   FROM <image>@<digest>
  5. 示例:  
  6. FROM mysql:5.6
  7. 注:  
  8. tagdigest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像


3.2 maintainer命令

镜像维护者的姓名和邮箱地址

  1. 格式:
  2. MAINTAINER <name>
  3. 示例:
  4. MAINTAINER Jasper Xu
  5. MAINTAINER sorex@163.com
  6. MAINTAINER Jasper Xu <sorex@163.com>

3.3 run命令

构建镜像时执行的命令

  1. RUN用于在镜像容器中执行命令,其有以下两种命令执行方式:
  2. shell执行
  3. 格式:
  4. RUN <command>
  5. exec执行
  6. 格式:
  7. RUN ["executable", "param1", "param2"]
  8. 示例:
  9. RUN ["executable", "param1", "param2"]
  10. RUN apk update
  11. RUN ["/etc/execfile", "arg1", "arg1"]
  12. 注:
  13.   RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,
  14. 可以在构建时指定--no-cache参数,如:docker build --no-cache

图片.png
图片.png
示例:在原始的centos7上扩展vim

3.4 expose命令

指定于外界交互的端口

  1. 格式:
  2. EXPOSE <port> [<port>...]
  3. 示例:
  4. EXPOSE 80 443
  5. EXPOSE 8080 EXPOSE 11211/tcp 11211/udp
  6. 注:  
  7. EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,
  8. 或通过-P参数来发布EXPOSE导出的所有端口

3.5 workdir命令

工作目录,类似于cd命令

  1. 格式:
  2. WORKDIR /path/to/workdir
  3. 示例:
  4. WORKDIR /a (这时工作目录为/a)
  5. WORKDIR b (这时工作目录为/a/b)
  6. WORKDIR c (这时工作目录为/a/b/c)
  7. 注:  
  8. 通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUNCMDENTRYPOINTADDCOPY等命令
  9. 都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。

图片.png

3.6 env命令

设置环境变量,这个值将出现在构建阶段中所有后续指令的环境中

  1. 格式:
  2. ENV <key> <value> #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量
  3. ENV <key>=<value> ... #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,
  4. 如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行
  5. 示例:
  6. ENV myName John Doe
  7. ENV myDog Rex The Dog
  8. ENV myCat=fluffy

图片.png

3.7 add命令

将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget

  1. 格式:
  2. ADD <src>... <dest>
  3. ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
  4. 示例:
  5. ADD hom* /mydir/ # 添加所有以"hom"开头的文件
  6. ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt"
  7. ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/
  8. ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/

图片.png

3.9 copy命令

功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
图片.png

3.10 volume命令

用于指定持久化目录

  1. 格式:
  2. VOLUME ["/path/to/dir"]
  3. 示例:
  4. VOLUME ["/data"]
  5. VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"
  6. 注:
  7. 一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
  8. 1 卷可以容器间共享和重用
  9. 2 容器并不一定要和其它容器共享卷
  10. 3 修改卷后会立即生效
  11. 4 对卷的修改不会对镜像产生影响
  12. 5 卷会一直存在,直到没有任何容器在使用它

3.11 entrypoint命令

配置容器,使其可执行化。配合CMD可省去”application”,只使用参数。

  1. 格式:
  2. ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
  3. ENTRYPOINT command param1 param2 (shell内部命令)
  4. 示例:
  5. FROM ubuntu
  6. ENTRYPOINT ["top", "-b"]

图片.png

3.12 cmd命令

构建容器后调用,也就是在容器启动时才进行调用。

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

图片.png


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

  1. FROM openjdk:8-jre
  2. workdir /app
  3. add demo-0.0.1-SNAPSHOT.jar app.jar
  4. expose 8081
  5. run yum -y install mysql
  6. run yum -y install httpd-tools
  7. entrypoint ["java","-jar"]
  8. cmd ["app.jar"]

e.执行构建 docker build -t demo:01 .
f.运行容器 docker run -d -p 8081:8081 --name demo demo:01