Docker 镜像及制作

简介:镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件;docker官方和个人发布的镜像由于版本等各种原因,漏洞较多,加上网络原因下载镜像较慢,基于这种情况,可以手动定制docker镜像。当运行容器时,如果使用的镜像在本地不存在,docker就会从镜像仓库中下载。

1. Docker镜像

  A. 联合文件系统:联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来层层叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。一次同时加载多个文件系统,

  B. 镜像加载原理:docker的镜像实际上由一层一层的文件系统组成,包含BootFS和RootFS,其中BootFS主要包含bootloader和kernel,rootfs在bootfs之上,包含linux中/dev,/bin,/etc等标准的目录和文件,就是各种不同的操作系统发行版,内存中只加载一份相同的基础镜像;

  C. 写时复制管理容器层:docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层被称为容器层,容器层之下都是镜像层。

 

 

3、构建镜像的方式

  A. docker commit命令

  B. docker build和Dockerfile文件

    openjdk:8-jre-alpine的镜像没有Font字体库,若代码用到会报空指针异常,需制作带FontConfigFile组件的镜像;

    使用当前目录的Dockerfile编译名为openjdk:8-jre-alpine-fonts的镜像:docker build -f /data/Dockerfile -t openjdk:8-jre-alpine-fonts .;

    查看指定镜像的创建历史:docker history openjdk:8-jre-alpine-fonts;

 

 

4. Dockerfile命令

  A. FROM:指定基础镜像,在文件中可以多次出现,并且可以与ARG参数交互,格式:FROM [--platform=<platform>] <image>[:<tag>] [AS <name>];

  B. RUN:在镜像构建时执行命令,形成新层,比如安装相关软件,格式如下两种:

    RUN command:命令在shell中执行,默认为/bin/sh -c,多个以“\”换行;

    RUN ["exec", param1, param2]:另exec形式可以不用shell,EXEC形式被解析为一个JSON系列,但必须使用双引号;

  C. LABEL:用于添加镜像的元数据,添加多个属性,最好使用\隔开,而非每次LABEL,格式:LABEL <key>=<value>,如指定镜像作者信息LABEL maintainer=rhxy;

  D. WORKDIR:指定指令集所在的工作目录,目录不存在会自动创建,格式:WORKDIR /path/to/workdir;

  E. ADD/COPY:添加文件到镜像中,当识别到tar等压缩包时,COPY命令还会进行自动解压操作,格式:ADD/COPY [--chown=<user>:<group>] ["<src>",... "<dest>"],其中<dest>若是目录需要以斜杠结尾,否则视为常规文件;

  F. EXPOSE:指明该镜像需要暴露哪些端口,只是一个信息展示,若真要暴露端口还是得通过-p选项生效,格式:EXPOSE port/udp;

  G. ENV:指定环境变量,作用于容器环境中的指令,格式:ENV <key>=<value> ...;

  H:CMD:用于指定镜像的启动命令,不同于RUN命令,一个Dockerfile文件中,只能写一次CMD,否则只有最后一个命令生效,格式如下三种;

    CMD ["executable","param1","param2"](exec形式,这是首选形式)

    CMD ["param1","param2"](作为ENTRYPOINT 的默认参数)

    CMD command param1 param2(shell形式)

  I. ENTRYPOINT:和CMD命令类似,指定镜像启动命令,不同点在于他指定的命令无法被docker run参数取代,格式如下两种:

    ENTRYPOINT ["executable", "param1", "param2"]

    ENTRYPOINT command param1 param2。

   J:ARG:指定一个变量,作用于构建阶段,与ENV有区别,格式:ARG <name>[=<default value>]。

 

5. Docker镜像

  A. Docker容器里的文件,其实在宿主机上磁盘上都存在,所以就算docker没有启动,修改文件依然可以在外层进行,比如解决jar包冲突和定位代码为何不是最新的问题;

  B. Docker中GraphDriver主要用于管理和维护镜像,包括把镜像从仓库下载和运行时把镜像挂载起来可以被容器访问等,它包含MergeDir、UpperDir、WorkDir;

    MergeDir:所有镜像层合并后的文件,即进入容器看到的目录文件;

    UpperDir:用户挂载的upper层目录,只读层;

    WorkDir:文件系统的工作基础目录。

 

6、使用jib打包镜像

  A. libs对应/app/libs、resources对应/app/resources、classes对应/app/classes目录;

  B. JIB使用小结

 

 7. Docker镜像工具dive

 

 8. 自定义文件Dockerfile打镜像

  A. xxl-job-admin组件,也是参照Github上Dockerfile文件

FROM openjdk:8-jre-alpine-fonts
  
ENV PARAMS=""
ENV TZ=PRC
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

ADD app.jar /app.jar
ENTRYPOINT ["sh","-c","java -jar $JAVA_OPTS /app.jar $PARAMS"]

  B. spring-boot微服务

FROM openjdk:8-jre-alpine-fonts

LABEL maintainer=rhxy

WORKDIR /app
COPY spring-boot/libs libs/
COPY spring-boot/resources resources/
COPY spring-boot/classes classes/
ENTRYPOINT ["java", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=3002", "-cp", "/app/resources:/app/classes:/app/libs/*", "com.rhxy.Application"]

EXPOSE 8081 3002

 

可参考:Docker镜像加载原理

 

posted @ 2020-06-06 10:04  如幻行云  阅读(183)  评论(0编辑  收藏  举报