Dockerfile(构建镜像的脚本文件)

  • 此篇文章记录我在Docker学习中的总结
    在这里插入图片描述

一、Dockerfile简介

Dockerfile是用于构建Docker镜像的脚本文件,由一系列指令构成。通过docker build命令构建镜像时,Dockerfile中的指令会由上到下依次执行,每条指令都将会构建出一层镜像。这就是镜像的分层。因此,指令越多,层次就越多,效率就越低。所以在定义Dockerfile时,能在一个指令完成的动作就不要分为两个。该文件的默认名称就是“Dockerfile”。

二、docker build

docker build命令用于根据给定的Dockerfile和上下文以构建Docker镜像。

docker build [OPTIONS] <PATH/URL/->
  • PATH: Dockerfile文件路径
  • URL: 网络资源路径

例一:
在当前目录下创建镜像,Dockerfile也在当前目录下,并指定镜像的镜像名:tag

docker build -t centos:7.0 .

例二:
在当前目录下创建镜像,Dockerfile也在当前目录下,但是文件名为Dockerfile2,并指定镜像的镜像名:tag

docker build -f Dockerfile2 -t centos:8.0 .

三、Dockerfile命令

3.1、FROM

  • 用于指定基础镜像,且必须是第一条指令;若省略了tag,则默认为latest
FROM image
FROM image:tag
举例:
FROM scratch
  • scratch镜像
    scratch镜像是一个空镜像,是所有镜像的Base Image,相当于面向对象编程中的Object类。scratch镜像只能在Dockerfile中被继承,不能通过pull命令拉取,不能run,也没有tag,并且它也不会生成镜像中的文件系统层。在Docker中,scratch是一个保留字,用户不能作为自己的镜像名称使用。

3.2、MAINTAINER

  • MAINTAINER指令的参数填写的一般是维护者姓名和信箱。不过,该指令官方已不建议使用,而是使用LABEL指令代替
MAINTAIBER 维护者信息
举例:
MAINTAIBER hsy
MAINTAIBER [email protected]
MAINTAIBER hsy [email protected]

3.3、LABEL

  • LABEL指令中可以以键值对的方式设置镜像的元数据信息,用于替代MAINTAINER指令,可以一次命令设置多个。通过docker inspect可查看到LABEL与MAINTAINER的内容
LABEL <key>=<value> <key>=<value>...
举例:
LABEL name="hsy" version="1.0"

3.4、ENV

  • 用于指定环境变量,这些环境变量,后续可以被RUN指令使用,容器运行起来之后,也可以在容器中获取这些环境变量
ENV <key>=<value> <key>=<value>...
举例:
ENV redis_version=7.0.5

3.5、WORKDIR

  • 容器打开后默认进入的工作目录。
WORKDIR path

就像我们从docker hub上下载的镜像生成的容器中,进入依赖centos镜像运行的容器发现工作目录是根目录 / ,进入redis容器工作目录是 /data
在这里插入图片描述
在这里插入图片描述
说明:
1.设置后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。
2.在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。

3.6、RUN

  • RUN在docker build时执行,会使用shell运行指定的command
语法一:
RUN command
举例:
RUN yum install vim
语法二:
RUN ["executable", "param1", "param2",..]
举例:
RUN ["/opt/file", "p1"]

3.7、CMD

  • 在容器启动过程中,即在执行docker run时,会使用exec运行指定的指令(就像函数调用),适用于可执行文件
语法一:
CMD ["executable","param1","param2", ...]
举例:
CMD ["/opt/hello","p1"]
说明:hello为可执行文件,p1为hello执行所需要的参数
  • 在容器启动过程中,即在执行docker run时,会使用/bin/bash运行指定的指令,针对shell文件
语法二:
CMD command param1 param2, ...
举例:
CMD echo "docker docker docker!"
CMD /bin/bash
  • 提供给ENTERYPOINT默认参数
语法三:
CMD ["param1","param2", ...]
说明:
此命令用于提供给ENTERYPOINT,如果设置了ENTERYPOINT则把参数赋给ENTERYPOINT

说明:
1.通过语法一、语法二构建出的镜像会被docker run命令中的command覆盖。
2.通过语法一、语法二构建出的镜像都不支持docker run时给定的参数。
3.CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。

小栗子:
1.创建一个输出本月日历镜像
在这里插入图片描述

2.docker run加上一个date命令,如下图发现docker run命令中的command会覆盖语法二CMD命令的(语法一CMD同样如此)
在这里插入图片描述

3.docker run加上一个-y参数,如下图发现它并未像我们预想的那样输出全年的日历,说明语法二CMD接收不到docker run时给定的参数(语法一CMD同样)
在这里插入图片描述

3.8、ENTRYPOINT

  • 在容器启动过程中,即在执行docker run时,会使用exec运行指定的指令,就像函数调用,并非在/bin/bash中执行命令,此命令构建出的镜像支持docker run时给定的参数,这是此命令和CMD命令的不同点
语法一:
ENTRYPOINT ["executable","param1","param2", ...]
  • 在容器启动过程中,即在执行docker run时,会使用shell运行指定的指令。此命令构建出的镜像不支持docker run时给定的参数,且不能使用CMD语法三中提供的参数
语法二:
ENTRYPOINT command param1 param2, ...

说明:
1.ENTRYPOINT指定的要执行的可执行文件不会被docker run命令中的command覆盖,这是和CMD命令的不同点。
2.Dockerfile中只允许有一个ENTRYPOINT命令,有多个时会只执行最后的ENTRYPOINT命令。

小栗子:
1.创建一个输出hello docker的镜像
在这里插入图片描述
在这里插入图片描述

2.docker run后输出hello docker,说明语法三CMD中的参数赋给了ENTRYPOINT
在这里插入图片描述
3.docker run加一个参数ccc,得到输出ccc,说明docker run的command覆盖了CMD的
在这里插入图片描述

3.9、EXPOSE

  • 指定容器准备对外暴露的端口号
EXPOSE port
举例:
EXPOSE 80

说明:指定容器准备对外暴露的端口号,但在这里配置并不能起作用。若要起作用,则需要在执行docker run命令时使用-p来发布此端口号。不过,如果使用-P,由Docker自动分配一个端口号与指定的容器连接,此时会优先使用这里指定的端口号。

3.10、ARG

  • 定义一个变量,该变量将会使用于镜像构建运行时。若要定义多个变量,则需要定义多个ARG指令
ARG <name>[=<default value>]
举例:
ARG name
ARG name=TOM

说明:该变量的值在执行docker build时通过-build-art覆盖。比如docker build -t 镜像名:tag name=Jerry .

3.11、ADD

  • 该命令将复制当前宿主机中的指定文件到容器中的指定目录中;
  • 宿主机中的文件路径可以是宿主机中的绝对路径,也可以是相对路径,但相对路径是相对于docker build命令所指定的路径的;
  • 宿主机中的指定文件可以是一个tar文件,tar文件复制到容器后会自动解压为目录;
  • 宿主机中的文件路径也可以是一个网络资源URL,此时的ADD指令相当于wget命令;
  • 宿主机中的文件路径最好不要是目录,其会将该目录中所有内容复制到容器的指定目录中。
  • 容器中的指定目录是一个绝对路径,其最后面的路径必须要加上斜杠,否则系统会将最后的目录名称当做是文件名的。
ADD 宿主机文件路径 容器指定目录
ADD ["宿主机文件路径","容器指定目录"]  //路径中存在空格时适用
举例:
ADD /opt/hello /                   //添加宿主机文件hello到容器根目录下
ADD ["/test/aaa.txt","/"]          //添加宿主机文件aaa到容器根目录下

3.12、COPY

  • 功能与ADD指令相同,只不过不能访问网络资源URL。若宿主机指定文件为tar文件,复制到容器后不会自动解压。

3.13、ONBUILD

  • 设置镜像触发器
ONBUILD [operate]
举例:
ONBUILD RUN yum install vim

说明:该指令只对当前镜像的子镜像进行构建时有效。例如当前镜像为centosA,在其Dockerfile中添加此命令:ONBUILD RUN yum install vim,该命令不会在A镜像构建时执行,此时若有一个镜像centosB是基于centosA镜像构建的,那么此命令会在B镜像构建的时候被执行。

3.14、VOLUME

  • 在容器创建可以挂载的数据卷
VOLUME ["dir1","dir2",..]
举例:
VOLUME ["/opt"]
VOLUME ["/var/aaa","/etc/bbb"]

说明:一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
1.卷可以在容器间共享和重用;
2.容器并不一定要和其他容器共享卷;
3.修改卷后会立即生效;
4.对卷的修改不会对镜像产生影响;
5.卷会一直存在,直到没有任何容器使用它。

四、发布springboot项目

一、准备一个简单的springboot项目并打包成jar包
在这里插入图片描述

二、在宿主机上创建一个目录,并把springboot项目的jar包传输进去
在这里插入图片描述

三、编写Dockerfile文件
run

四、docker build镜像
在这里插入图片描述

五、docker run
在这里插入图片描述

六、访问docker宿主机运行的项目
在这里插入图片描述
访问成功!

猜你喜欢

转载自blog.csdn.net/qq_53354183/article/details/127978535