Dockerfile
1. 什么是Dockerfile
定义:它是一个镜像构建文件,用来帮助我们自己构建一个自定义镜像
2.为什么要存在Dockerfile
问题:在dockerhub中官方提供很多镜像已经能满足我们的所有服务了,为什么还需要自定义镜像
核心作用:日后用户可以将自己应用打包成镜像,这样就可以让我们应用进行容器运行
3.Dockerfile构建镜像原理
4.Dockerfile使用
官方说明: https://docs.docker.com/engine/reference/builder/
保留字 | 作用 |
---|---|
FROM | 当前镜像是基于哪个镜像,第一个必须是FROM |
MAINTAINER | 指定维护者信息 |
RUN | 构建镜像时需要运行的指令 |
EXPOSE | 容器暴露的端口号 |
WORKDIR | 指定在创建容器后,终端默认登录进来的工作目录,一个落脚点 |
ENV | 用来构建镜像过程中设置环境变量 |
ADD | 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar包 |
COPY | 拷贝文件和目录到镜像中将从构建上下文目录中的文件 |
VOLUME | 容器数据卷,用于数据保存和持久化工作 |
CMD | 指定启动容器时执行的命令 |
ENTRYPOINT | 配置容器启动后执行的命令 |
4.1 FROM
- 第一条指令必须为 FROM 指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个 FROM 指令(每个镜像一次)。
- 语法
# 格式为FROM<image>或FROM<image>:<tag>
FROM tomcat:8
4.2 RUN
- 每条 RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 \ 来换 行
- 语法
# 格式为 RUN <command> 或 RUN ["executable", "param1", "param2"]
RUN yum install -y vim
RUM ["yum","install","-y","vim"]
4.3 EXPOSE
- Docker服务端容器暴露的端口号,在启动容器时需要通过 -P,Docker 主机会自动 分配一个端口转发到指定的端口。
- 语法
#格式为 EXPOSE <port>
EXPOSE 8080
4.4 WORKDIR
- 指令配置工作目录,参数是相对路径
- 语法
#格式为 WORKDIR /path
WORKDIR /data
4.5 ADD
- 用来从context上下文复制新文件、目录或远程文件url,并将他们添加都位于指定路径的映像文件系统中
- 语法
ADD hom* /mydir/
ADD text.txt mdir/ #指定相对路径
ADD text.txt /absoluteDir/ #可以指定绝对路径
ADD url
4.6 COPY
- 用来将context目录中指定文件复制到镜像的指定目录中
- 语法
COPY <src> <dest>
4.7 VOLUME
- 创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据
- 语法 VOLUME ["/data"]
4.8 ENV
- 用来为构建镜像设置环境变量。这个值将出现在构建阶段中所有后续 指令的环境中, 指定一个环境变量
- 语法 ENV
4.9 ENTRYPOINT
- 配置容器启动后执行的命令,并且不可被 docker run提供的参数覆盖。每个Dockerfile中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。
- 语法:ENTRYPOINT command param1
- ENTRYPOINT [“executable”, “param1”, “param2”]
4.10 CMD
- 指定启动容器时执行的命令,每个Dockerfile只能有一条 CMD命令。如果指定了多条命令,只有最后一条 会被执行,如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD指定的命令。
- 语法
CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式;
CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数;
5.Dockerfile构建springboot应用
5.1 开发springboot应用程序
5.2 对springboot应用程序进行打包
- war ====> tomcat
- jar 前后端分离主流 ====> jdk
5.3 打包项目
5.4 在服务器中创建dockerfile上下目录context
-
mkdir demo 这个目录作为context目录
-
在demo目录中创建Dockerfile文件 touch Dockerfile
-
上传应用jar包到context目录
-
编写Dockerfile
FROM openjdk:8-jre #基于哪个镜像进行构建 WORKDIR /webapp #定义进入容器时默认位置,接下来后序操作工作 ADD demo-0.0.1-SNAPSHOT.jar demo.jar #复制到工作目录重命名app.jar EXPOSE 8089 #当前容器暴露哪个端口 ENTRYPOINT ["java","-jar"] #启动应用固定命令 CMD ["demo.jar"] #执行jar名称
[root@localhost demo]# docker build -t demo:01 .
[root@localhost demo]# docker run -d -p 8089:8089 --name demo demo:01
0921a5153b250b5bbd78ec29d231b54b5fe7945d546e31fedf33b019eeb85eda
#查看日志
[root@localhost demo]# docker logs -f 0921a5153b25