什么是Dockerfile?
Dockerfile本质上其实是包含各种指令的文本文档。可以使用在命令行中调用任何命令。Docker通过读取Dockerfile中的指令自动生成镜像。docker build命令用于从Dockerfile构建映像。
Dockerfile的基本结构
Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。
Dockerfile文件说明
Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声明以#字符开头则被视为注释。可以在Docker文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。
组成部分
部分 | 命令 |
---|---|
基础镜像信息 | FROM |
维护者信息 | MAINTAINER |
镜像操作指令 | RUN、COPY、ADD、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME等 |
容器启动时执行指令 | CMD、ENTRYPOINT |
Dockerfile命令
1、FROM
FROM:基础镜像,当前新镜像是基于哪个镜像的
实例:
FROM java:8
2、MAINTAINER
MAINTAINER:镜像维护者的姓名和邮箱地址
实例:
MAINTAINER HongHuaYu 101111@qq.com
3、RUN
RUN:容器构建时需要运行的命令
实例:
RUN echo 'hello docker!' \
> /usr/local/file.txt
4、EXPOSE
EXPOSE:当前容器对外暴露的端口号
实例:
EXPOSE 8080
5、WORKDIR
WORDIR:指定在容器创建后,终端默认登录进来工作目录,一个落脚点
实例:
WORKDIR /usr/local
6、ENV
ENV
ENV:用来在构建镜像过程中设置环境变量。
举例:ENV MY_PATH /usr/mytest
ENV这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前指定了环境变量前缀一样;也可以在其他指令中直接使用这些环境变量,比如WORKDIR
$MY_PATH
7、ADD
ADD:将宿主机目录下的文件拷贝到镜像里面并且ADD命令会自动处理URL和解压tar压缩包 ADD
实例:
ADD eladmin.jar eladmin.jar
8、COPY
COPY:类似ADD,拷贝文件和目录到镜像中,但是它只是拷贝,不会自动处理URL和解压tar压缩包。COPY将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置。
它的使用方法有两种:COPY src test和COPY [“src”,“dest”]COPY
实例:
COPY application.yml /etc/springboot/hello-service/src/resources
9、VOLUME
VOLUME:容器数据卷,用于数据保存和持久化工作
实例:
VOLUME /data/db /data/configdb
10、CMD
CMD:指定一个容器启动时要运行的命令。dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker
run之后的参数替换。
CMD指令的格式和RUN类似,也是两种格式:
a) shell格式:CMD <命令>
b) exec格式:CMD [‘可执行文件’,‘参数1’,‘参数2’…]
c) 参数列表格式:CMD [‘参数1’,‘参数2’…],在指定了ENTRYPOINT指令后,用CMD指定具体的参数。
实例:
CMD ["/bin/bash"]
11、ENTRYPOINT
ENTRYPOINT:指定一个容器启动时要运行的命令。ENTRYPOIT的目的和CMD一样,都是在指定容器启动程序及参数。
区别:CMD和ENTRYPOINT都是指定一个容器启动时要运行的命令,但是 如果dockerfile中可以有多个CMD指令,只有最后一个生效 ,CMD会被docker run之后的参数替换
;而有多个ENTRYPOINT指令,每个指令都生效,这就是CMD和ENTRYPOINT的区别。
Dockerfile部署springboot项目
# 基础镜像
FROM java:8
# 作者
MAINTAINER honghuayu 111@11.com
#工作目录
WORKDIR /data/dockerfile/
# 把可执行jar包复制到基础镜像的根目录下
ADD dome1.jar dome1.jar
# 镜像要暴露的端口,如要使用端口,在执行docker run命令时使用-p生效
EXPOSE 8099 8098
# 在镜像运行为容器后执行的命令
ENTRYPOINT ["java","-jar"]
#可变的参数
CMD ["dome1.jar"]
执行Dockerfile命令
**docker build -t dome8 -f ./Dockerfile .**
执行后的效果
运行打好的包jdk8
查看web页面的结果
查看打包的镜像
运行打包的包jdk11
运行打包的包jdk17
最终这个springboot项目可以部署到不同的jdk版本上