1.什么是Dockerfile

1.1 Dockerfile

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

制作镜像的Dockerfile文件所在的目录为dockerfile的上下文环境。

1.2 docker build命令


docker build的使用

docker build -t [imagename:tag] [filepath]
docker build:构建镜像,-t 指定image的name和版本,指定构建镜像的Dockerfile文件。

如果当前上下文内的Dockerfile文件名就是Dockerfile,在构建镜像的时候,命令如下
dcoker build -t mycentos:01 . 
-t mycentos:表示构建的image名字为mycentos,并且指定版本为01
【 . 】 :最后的一个 点 表示指定当前上下文中的文件名为Dockerfile文件【如果是其他文件,指定文件名】

1.3 Dockerfile相关指令描述

保留字作用
FROM当前镜像是基于哪个镜像[第一个指定必须是FROM]
MANITAINER维护者的姓名和邮箱地址[废弃,意义不大]
RUN构建镜像是需要运行的指令
EXPOSE当前容器对外 暴露的端口号
WORKDIR指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
ENV用来在构建镜像的过程中设置环境变量
ADD将宿主机目录下的文件拷贝进容器且ADD命令会自动处理URL和解压tar包
COPY类似于ADD,拷贝文件和目录到镜像中 将从构建上下文目录中<原路径>的文件/目录复制到新的一层镜像内的<目标路径>位置
VALUME容器数据卷,用户数据保存和持久化工作
CMD指定一个容器启动时要运行的命令,Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
ENTRYPOINT指定一个容器启动时要运行的命令,ENTRYPOINT的目的和CMD一样,都是在指定容器启动过程及其参数

2.Dockerfile命令详情

2.1 FROM命令

  • 基于哪个基础镜像进行构建新的镜像,在构件时会自动从docker hub拉取base进行,必须作为Dockerfile的第一个指令出现
  • 语法
FROM <image>
FROM <image>[:tag]       使用最新版本不写为latest 
FROM <image>[@<digest>]  使用摘要

注意:

构建的docker镜像,如果没有服务,在运行为容器之后,会立刻结束进程。
如果有服务在镜像运行为容器之后一直运行[阻塞系统进程],则容器不会在启动后结束进程。
在image没有服务的情况下,启动为容器,会在容器启动后结束进程。
如果想进入容器,只能在启动容器的时候加上[-it],会在容器运行之后,直接进入容器内部。
其他情况同样适用,只要是在image启动为容器后直接进入容器内部,都可以使用该方法。

2.2 RUN命令

  • RUN指令将在当前镜像智商的新层中自行任何命令并提交结果,生成的提交镜像将用于Dokcerfile中的下一步
  • 简单来说,就是构建镜像时执行的命令,或者shell脚本
  • 语法
# 语法一,在RUN 后面直接写shell脚本
RUN <command> 
#例句
RUN echo hello

#语法二,使用json格式[更像是string数组,将一条命令拆分为一个string数组]
RUN ["executable","param1","param2"]
#例句
RUN ["/bin/bash","-c","echo hello"]

2.3 EXPOSE命令

  • 用来指定构建的镜像运行为容器时对外暴露的端口
  • 语法
EXPOSE 80/tcp       如果没有显示指定则默认暴露都是TCP
EXPOSE 80/udp

2.4 CMD命令

  • 用来为启动的容器指定执行的命令,在Dockerfile中只能有一条CMD指令,如果列出多个命令,则只有最后一个命令才会生效。
  • 注意:Dockerfile中只能有一条CMD指令。如果列出多个指令,则只有最后一个命令才会生效
  • 容器启动的时候,也就是在docker run命令的最后,如果输入一条指令,将会覆盖Dockerfile中的CMD命令
  • 如果Dockerfile中没有CMD指令,那么在Docker run的时候,最后加入一条指令,可能会报错【不确定】
  • 语法:
CMD ["executable","param1","param2"]  (exec from,this is the preferred form)
CMD ["param1","param2"]               (as default parameters to ENTRYPOINT)
CMD command param1 param 2            (shel from)

2.5 WORKDIR命令

  • 用来为Dockerfile中的任何RUN,CMD,ENTRYPOINT,COPY和ADD指令设置工作目录,如果WORKDIR不存在,即使他没有在任何后续Dokcerfile指令中使用,它也将被创建
  • 语法
WORKDIR /path/to/workdir

#例句
WORKDIR /a
WORKDIR b
WORKDIR /root/home/opt

注意:WORKDIR指令可以在Dockerfile中多次使用。如果提供了相对路径,则该路径将与先前的WORKDIR路径相对

2.6 ENV命令

  • 用来为构建镜像设置环境变量。这个值将出现在构建阶段中所有后续指令的环境中。
  • 语法
ENV <key> <value>
ENV <key>=<value> ... 


注意:在dockerfile中其他地方引用ENV定义的环境变量,可以使用$key来使用
例如:定义一个路径,在WORKDIR命令中引用
ENV BASE_DIR=/data/opt
WORKDIR $BASE_DIR

2.7 ADD命令

  • 用来从context上下文复制新文件、目录或者远程文件URL,并将它们添加到位于指定路径的镜像文件中
  • ADD命令如果是从宿主机上复制压缩文件到镜像,会自动解压缩
  • ADD命令可以自动下载URL远程文件,但是下载的文件不能自动解压缩
  • 语法:
ADD hom* /mydir                     通配符添加多个文件
ADD hom?.txt /mydir                 通配符添加[?站位一个字符]
ADD test.txt  /relativeDir/         可以指定相对路径
ADD test.txt /absoluteDir/          可以指定绝对路径
ADD url

2.8 COPY命令

  • 用来将context目录中指定文件复制到警醒的指定目录中
  • 语法:
COPY src dest
COPY ["<src>",...,"<dest>"]

2.9 VALUME命令

  • 用来定义容器运行时可以挂载到宿主机的目录
  • 语法
VALUME ["/data"]

3 Dockerfile打包SpringBoot项目

3.1 创建一个简单的SpringBoot项目

省略创建SpringBoot应用

3.2 将SpringBoot应用通过maven打包成jar包
3.3 将jar包上传到Dockerfile所在的上下文目录
3.4 编写Dockerfile文件

# 基于jre8镜像
FROM openjdk:8-jre 

#工作目录,在这里定义工作目录,下面所有的操作都是基于当前目录[目录不存在时,Dockerfile会地总创建]
WORKDIR /app  

#将Dockerfile上下文目录中的SpringBoot应用jar包拷贝到镜像的工作目录
ADD docker-demo-0.0.1-SNAPSHOT.jar app.jar 

#容器可以向外暴露的端口
EXPOSE 8080

#镜像启动为容器时需要执行的命令,ENTRYPOINT 为必须要执行的命令
ENTRYPOINT ["java","-jar"]

#CMD的参数可以在镜像运行的时候被替换掉,并且成为ENTRYPOINT命令的参数
CMD ["app.jar"]
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐