2021-09-24---dockerfile

Dockerfile

  • Dockerfile简介
    • Docker镜像
    • dockerfile是什么
    • 官网中如何查看dockerfile
    • dockerfile格式
  • dockerfile的命令
    • 文件格式
    • FROM指令
      • FROM简介
      • FROM编辑
        • docker build 构建
    • MAINTAINER指令
      • 简介
      • 编辑
    • LABEL指令
      • 构建一个新的镜像
    • ADD命令
    • COPY
      • 案例
    • ENV
    • RUN
      • 两种格式
    • ENV扩展
    • WORKDIR指令
    • VOLUME
    • EXPOSE
    • CMD和ENTRYPOINT
      • CMD
      • ENTRYPOINT
      • 区别
      • ENTRYPOINT和CMD案例
      • docker run和CMD ENTRYPOINT指令的关系
      • 两种需要注意的细节
  • 总结

Dockerfile简介

Docker镜像

怎么来的

dockerfile是什么

dockerfile是构建镜像文件,由一系列命令和脚本参数组成,可以看成是镜像创建的源码。

官网中如何查看dockerfile

任何一个docker镜像,从官网中都能对应的原生dockerfile内容,例如nginx,centos
2021-09-24---dockerfile_第1张图片
每当dockerfile编写完毕之后,我们可以用它来构建镜像,然后使用镜像创建容器,容器初始化环境,运行命令都可以在dockerfile中指定。

dockerfile格式

在编写一个dockerfile时,我们需要使用非常多的dockerfile指令。
如mysql的dockerfile:

FROM debian:buster-slim
ENV GOSU_WERSION 1.12
RUN mkdir /docker-entrypoint-initdb.d
VOLIME /var/lib/mysql

dockerfile的命令

文件格式

  • 每个dockerfile都可以编辑器来编译
  • 每个dockerfile都包含全部或者部分指令
  • 每条指令必须使用大写编辑,指令后的参数或者命令和dockefile指令必须用空格隔开
  • 表示注释的内容,不会在dockerfile构建镜像时生效
  • 指令在dockerfile中编写结束之后,执行构建镜像时从上到下运行的
  • 每条指令后面必须跟随一个参数,具体的参数是什么,根据指令不同而不同

FROM指令

FROM简介

定义当前dockerfile基础镜像,镜像创建出来基于哪个镜像实现的,每个dockerfile编辑时,必须包含这个指令,否则无法创建镜像文件

官方dockerhub库中,发现scratch是绝大部分使用镜像的最终父镜像。

FROM编辑

FROM指令的编辑
利用文件构建一个镜像
编辑一个文件名称dockerfile-demo1

FROM centos:centos7

实际上创建出来的就是centos:centos7镜像

docker build 构建

docker build -f dockerfile-demo1 -t centos:pcy .
  • -f 表示加载dockerfile的名字。可以使用绝对路径,使用当前相对路径,如果dockerfile的名字就是dockerfile,那么-f可以省略
  • -t表示我们构建心得镜像的全貌名。镜像名:tag
  • .这个最后的,是指定构建docker镜像时,docker环境需要的参数数据文件安装包等等内容的相对路径,.表示当前目录。
    2021-09-24---dockerfile_第2张图片
    心得镜像文件完全基于centos:centos7,这里没做修改,所以他们的id相同,如果我们使用删除rmi将id删除,两个镜像都没了

MAINTAINER指令

简介

在镜像的元数据中提供一个维护人的信息,可以跟随一个字符串实现

编辑

2021-09-24---dockerfile_第3张图片
构建

 docker build -f file01 -t centos:pcy01 .

我们在构建镜像时,会有三层
2021-09-24---dockerfile_第4张图片
维护人会写入镜像的元数据中,可以在构建完镜像,提供元数据查看
元数据查看

docker inspect 镜像id

2021-09-24---dockerfile_第5张图片
当一个dockerfile中存在多个MAINTAINER指令时,后面的会把前面的覆盖掉。最终元数据只记录一个人

LABEL指令

作用:在生成镜像的时候,对镜像差生一些描述信息,比如版本,创建时间,证书,作用。比如从centos:centos7官方dockerfile中可以看到LABLE标签
2021-09-24---dockerfile_第6张图片
\表示换行下一个输入的信息,信息格式是Key-value
value一般都是一个字符串

构建一个新的镜像

2021-09-24---dockerfile_第7张图片

docker build -t centos:pcy3 .

查看元数据信息inspect
2021-09-24---dockerfile_第8张图片

ADD命令

ADD指令是将宿主机中准备的文件,比如java,tar文件,在构建镜像时添加到镜像中。宿主机的文件中所在目录就是之前调用Build命令最后的.,.表示所有构建镜像需要用到的文件,都在相对路径当前目录下,也可以替换成其它位置,如果当前位置有dockerfile名称文件,-f可以省略。

例如:
在这里插入图片描述
/h
2021-09-24---dockerfile_第9张图片
/

2021-09-24---dockerfile_第10张图片

COPY

将宿主机的文件放到镜像,但是以拷贝的方式,而且不会对压缩包进行解压。

案例

2021-09-24---dockerfile_第11张图片

ENV

设置镜像中的环境变量
比如jdk,java的环境JAVA_HOME
2021-09-24---dockerfile_第12张图片
相当于在环境中设置了一个环境变量,赋值name=wangcuihua

查看所有系统环境变量
2021-09-24---dockerfile_第13张图片

启动一个容器来测试环境变量

docker run -it --name demo03 centos:xiaolaoshi03 /bin/bash
env# 查看环境变量是否配置成功
echo $name# 查看环境变量

RUN

我们想要构建自己功能的镜像,RUN比较重要。
RUN主要作用是在构建镜像的时候build,执行我们定义的命令。RUN指令在当前镜像的顶层上新建层执行命令,同时commit提交执行结果(相当于我们启动一个容器执行命令)。
2021-09-24---dockerfile_第14张图片
RUN指令会打印三个环境变量
tomcat官方镜像中可以看到ENV使用

2021-09-24---dockerfile_第15张图片

两种格式

2021-09-24---dockerfile_第16张图片

shell和exec区别

底层机制有所区分
shellRUN命令,会默认调用/bin/bash -c来解析命令
RUN ls /实际上执行相当于/bin/bash -c “ls /”
exec 格式,则不是使用/bin/bash -c来解析直接调用。当前的镜像内部有什么默认解析进程,就用什么解析进程。
如果命令中使用环境变量就不会解析
2021-09-24---dockerfile_第17张图片
2021-09-24---dockerfile_第18张图片
如果想要解析,修改dockerfile
2021-09-24---dockerfile_第19张图片
注:
shell命令必须具备解析环境,并不是所有的解析都具备解析环境。
exec可以根据镜像的环境选择不同的形式运行命令,而且这种格式能够在有些条件下避免命令的混淆

在这里插入图片描述

ENV扩展

我们在dockerfile中定义镜像创建环境变量,使用指令ENV,容器启动时,我们可以用run命令的-e选项来设置相关的内容

docker run -it -e "name=liuxiaolan" centos:pcy8 /bin/bash
# -e可以配置环境变量

启动的容器以及把容器中的环境给替换了,但是-e选项不会把dockerfile里面的内容给替换,也就是当前容器的环境变量变化,但是里面的镜像不变

2021-09-24---dockerfile_第20张图片
环境变量使用流程图
先得构建一个镜像,然后再利用这个镜像创建容器
2021-09-24---dockerfile_第21张图片

WORKDIR指令

WORKDIR表示当前工作目录,如果不指定,默认工作目录时/。在镜像中指定了WORKDIR,我们使用镜像创建容器,进入容器的默认路径也是这个工作目录。
例如tomcat最终的启动容器要运行命令是catalina.sh start,但是这个目录所在目录时tomcat/bin所以镜像会设置WORKDIR在当前这个bin文件夹下,启动catalina.sh start运行。
在这里插入图片描述
案例:
2021-09-24---dockerfile_第22张图片

VOLUME

数据卷的意思,用来创建镜像的同时,创建挂载点,这样使用这个镜像启动的容器会有匿名挂载的数据卷。

创建默认挂载点
2021-09-24---dockerfile_第23张图片
运行构建的dockerfile之后,创建镜像,查看匿名数据卷
2021-09-24---dockerfile_第24张图片
查看元数据

docker inspect bdaddd07789e

EXPOSE

当我们在运行这个容器的时候,容器在运行某个服务的时候,比如tomcat,nginx这种http服务,需要外界访问这个服务,那么要让容器暴露端口出来,否则无法北宿主机的端口绑定。

2021-09-24---dockerfile_第25张图片
容器和宿主机端口的关系

  • 如果宿主机没有暴露端口81,那么宿主机无法使用宿主机的端口绑定映射到这个容器的81,外界也-就无法访问到容器中运行正在81端口任何进程。
  • 如果容器暴露了端口80,通过映射关系,绑定到宿主机的8090,外界可以通过宿主机的8090访问到容器内部圆形在80的进程。可以查看tomcat,nginx这种镜像的dockerfile,必定镜像中暴露了端口
    2021-09-24---dockerfile_第26张图片
    2021-09-24---dockerfile_第27张图片
    通过镜像可以通过run -p绑定宿主机和容器端口之间关系

CMD和ENTRYPOINT

都是在镜像运行容器时,执行的命令,格式分为shell和exec的形式

CMD

实现一个容器启动时,运行ls命令
2021-09-24---dockerfile_第28张图片
2021-09-24---dockerfile_第29张图片
2021-09-24---dockerfile_第30张图片
和RUN指令格式类似,2021-09-24---dockerfile_第31张图片
2021-09-24---dockerfile_第32张图片
CMD细节
最多只在dockerfile编写一次,如果编写多次,后面的把前面的覆盖,只运行最后一个CMD

ENTRYPOINT

这个指令和CMD类似

2021-09-24---dockerfile_第33张图片
会在容器运行时,执行ls -l命令构建镜像,运行容器

2021-09-24---dockerfile_第34张图片
同样也支持exec形式
2021-09-24---dockerfile_第35张图片
如果定义多个ENTRYPOINT也和CMD相同,会被覆盖掉
2021-09-24---dockerfile_第36张图片

区别

  • 都是在运行容器启动,但是在使用EXEC形式的时候,把命令存储在一个列表中
    在这里插入图片描述
    如果后面跟了一个相同的ENTRPOINT命令,他们公用一个列表,会被替换掉,但是要是跟随的是CMD的exec形式,会被追加到这个列表。

2021-09-24---dockerfile_第37张图片
2021-09-24---dockerfile_第38张图片

ENTRYPOINT和CMD案例

准备一个配置文件Dockerfile

2021-09-24---dockerfile_第39张图片
最终运行结果

2021-09-24---dockerfile_第40张图片

docker run和CMD ENTRYPOINT指令的关系

2021-09-24---dockerfile_第41张图片

两种需要注意的细节

多种情况:
https://docs.docker.com/engine/reference/builder/#understand-how-cmd-and-entrypoint-interact

2021-09-24---dockerfile_第42张图片

总结

2021-09-24---dockerfile_第43张图片

你可能感兴趣的:(docker,docker,运维,centos)