• docker镜像构建


    Docker镜像原理

    Linux系统组成

    要了解Docker镜像原理,需要先了解linux操作系统。
    操作系统的组成部分分为:进程调度子系统、进程通信子系统、内存管理子系统、设备管理子系统、文件管理子系统、网络通信子系统、作业控制子系统等。从整体层面来说,linux系统都是由不同的文件构成并运行的。
    Docker镜像的本质是一个分层文件系统。而linux文件系统由bootfs和rootfs两部分组成(fs:file system的缩写):

    • bootfs:包含bootloader(引导加载程序)和kernel(内核)。bootloader主要是引导加载kernel
    • rootfs:root文件系统,包含的就是Linux系统中的/dev、/proc、/bin、/etc等标准目录和文件

    我们经常接触到的linux系统如ubuntu、RedHat、centos等系统,bootfs基本一样,rootfs不同。
    在这里插入图片描述

    Docker镜像原理

    • Docker镜像是由特殊的文件系统叠加而成的,其最低端使用了主机(宿主机)的bootfs,其他应用是在其基础上一层层往上叠加,提供给用户的就是最顶层文件提供的对接接口。
      以下以tomcat应用进行讲解:
      我们想要运行tomcat服务,需要java可运行的环境(即jdk),jdk和tomcat又需要在linux系统上运行,所以镜像如下图:
      在这里插入图片描述

    底层使用宿主机的bootfs,第二层是rootfs(root文件系统,被称base image,即基础镜像),由于tomcat服务是基于jdk开发的,所以需要在实际的tomcat服务之前,叠加jdk镜像,jdk镜像之后,再叠加真正要使用的tomcat镜像(用户使用tomcat提供的服务),所以如果我们本地安装tomcat服务时,下载的安装包只有几十MB,但是tomcat镜像却有400多MB,就是因为实际的tomcat镜像包含了其他镜像,只是对使用者来说,需要的是最顶层的tomcat服务而已,tomcat官网的安装包安装前需要我们自己去安装jdk等内容,而docker镜像是一步到位。
    我们在拉取tomcat镜像时,可以看到有多个Pull,就是因为要下载多个镜像(但给用户看到的是最顶层的tomcat镜像)
    在这里插入图片描述
    我们在tomcat镜像生成的容器中,查看jdk版本和linux版本,是可以查到对应的信息的
    在这里插入图片描述
    我们也可以通过docker inspect tomcat:latest命令查看该镜像的具体分层信息:
    在这里插入图片描述

    总结

    • Docker镜像时由特殊的文件系统分层叠加而成
    • Docker容器是基于宿主机的bootfs运行,第2层是rootfs(基础镜像),然后根据需求往上叠加其他镜像文件。
    • Docker镜像使用了联合文件系统(Union File System)技术,该技术能够基于基础镜像,将镜像通过分层并继承的方式制作成一个完整的、统一的镜像,即一次同时加载多个文件系统,但使用者只能看到一个文件系统(可以理解为:对使用者隐藏了顶层以下的镜像文件)。

    镜像制作

    官方提供的镜像有时候不能满足日常使用,这个时候就需要制作符合自己个性化的镜像,镜像制作有2种方式:

    • 容器转为镜像:拉取镜像,根据镜像生成了docker容器,然后在容器的基础上进行修改,修改完成后,将容器转成镜像,然后分享给其他人。
    • dockerfile构建:在构建文件里指定构建镜像所需的指令和说明,然后通过docker bulid命令生成新的镜像。

    容器转为镜像

    对于使用者来说,是没有权限去修改镜像文件的(只有只读权限),但是我们可以操作容器啊,镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器。
    在这里插入图片描述
    我们可以在容器内操作,然后根据容器生成镜像:
    docker commit 容器id或容器名称 镜像名称:版本号
    如果想要分享给其他人,可以将镜像压缩保存(docker save)保存到本地,然后将压缩包分享给他人,他人可以通过装载(docker load)压缩包的方式安装镜像。
    镜像压缩到本地:docker save 镜像名称:版本号>路径/xxx.tar
    压缩包安装镜像:docker load<路径/xxx.tar

    以下以tomcat镜像为例,想要修改tomcat默认打开的页面:

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    Dockerfile构建镜像

    Dockerfile是一个文本文件,包含了一条条的指令,在基于指定的镜像上,一条指令构建一层,最终构建出一个新的镜像。Dockerfile的关键字说明如下:

    关键字作用备注格式
    FROM指定父镜像指定基于哪个image开始构建FROM FROM :
    MAINTAINER作者或维护者信息标明这个dockerfile是谁写的或维护的MAINTAINER xxx xxx
    LABEL标签给镜像添加元数据,以键值对的形式,可以理解类似注释LABEL = = =
    RUN制作镜像时执行的命令构建镜像时运行的指令,默认是/bin/shRUN <命令行命令>
    RUN ["可执行文件", "参数1", "参数2"...,"参数n"](相当于:RUN 可执行文件 参数1 参数2 … 参数n)
    CMD容器启动时执行的命令运行容器时执行的shell环境。每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。有3种格式:
    1.exec执行:CMD ["executable","param1","param2"]
    2./bin/sh中执行:CMD command param1 param2
    3.提供给 ENTRYPOINT 的默认参数:CMD ["param1","param2"]
    ENTRYPOINT入口一般在制作一些执行就关闭的容器中会使用ENTRYPOINT ["executable", "param1", "param2"]
    COPY复制文件到镜像中构建的时候复制文件到镜像中COPY 源路径 目标路径(源路径是宿主机的路径,目标路径是容器的路径)
    ADD添加文件构建时添加文件到镜像中(即将宿主机的文件添加到容器内),与COPY的区别是ADD会自动解压ADD 源路径 目标路径(源路径是宿主机的路径,目标路径是容器的路径)
    ENV环境变量在构建镜像时,设置环境变量,可以在启动容器的时候,通过-e覆盖(即容器内也可以使用)ENV
    ARG构建参数用于指定传递给构建运行时的变量(给dockerfile传参),相当于构建镜像时可以在外部为里面传参ARG [=]
    VOLUME定义外部可以挂载的匿名数据卷在启动容器时若忘记挂载数据卷,会自动挂载到匿名卷VOLUME ["/xxx/xx/xxxx", "xxx", ..., "xxx"]
    EXPOSE声明容器的服务端口仅仅声明容器的服务端口(及提供服务的端口),帮助使用里理解并使用该端口EXPOSE 端口号
    WORKDIR工作目录指定容器的开始工作目录(若没有时会自动创建)。设置之后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行WORKDIR 最好是绝对路径
    USER指定容器执行用户指定运行容器时的用户名或ID执行用户USER user

    dockerfile的注释符号是#
    通过dockerfile构建镜像命令格式为:docker build -f dockerfile文件路径 -t 镜像名称:版本

    示例1

    以tomcat镜像为例,想要修改tomcat默认打开的页面:
    步骤1:编辑dockerfile文件(如tomcat_dockerfile文件):
    在这里插入图片描述

    父镜像tomcat:jre17-temurin的信息我们可以在docker hub官网
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    选择某个版本,点击之后,跳转到的页面会展示类似dockerfile文件内容的信息,我们可以看到,tomcat设置的工作目录WORKDIR是/usr/local/tomcat,申明的服务端口是8080
    在这里插入图片描述

    步骤2:生成镜像(docker build)
    在这里插入图片描述
    注:关于docker build命令末尾的.,本人还是没搞懂,可以参考其他大神的文章:Docker学习:Docker核心命令 | 常用命令 | Docker build . 点的含义 | docker build和docker commit关系 | docker rm 与sleep用法

    步骤3:验证镜像
    在这里插入图片描述
    访问服务器的8080端口,显示了自己编辑的内容
    在这里插入图片描述

    如果其他人也想使用该tomcat,你可以将镜像打包(docker save)或直接将dockerfile文件发送过去,dockerfile文件构建镜像的时候,还有一个方便的地方就是docker build的dockerfile可以是互联网可访问的文件,可以及时更新,方便访问。
    使用互联网url的dockerfile构建镜像的命令是:
    docker build url

    注意:url不需要定位到具体的文件,要定位到文件所在路径,然后该路径下需要有文件名称是Dockerfile的文件。

    示例:
    docker build github.com/creack/docker-firefox
    在这里插入图片描述
    在这里插入图片描述

    示例2

    题目:自定义centos:7镜像,要求:默认登录路径为/usr;可以使用vim

    官网提供的centos:7默认登录路径是根目录,无法使用vim
    在这里插入图片描述
    默认登录路径可以根据WORKDIR来设置,vim无法使用,是因为没有安装该应用(默认安装了vi),如果需要使用,我们就需要安装vim,所以dockerfile的RUN需要做2件事情:设置WORKDIR、安装vim,dockerfile文件内容如下:

    # 基于centos:7的镜像
    FROM centos:7
    # 维护者信息
    MAINTAINER wenxiaoba wenxiaoba@163.com
    # 设置初始工作目录
    WORKDIR /usr
    # 执行centos安装vim命令
    RUN yum -y install vim
    # 定义容器启动执行的命令
    CMD /bin/bash
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    通过docker build生成镜像
    在这里插入图片描述
    在这里插入图片描述
    我们根据生成的镜像vim_centos:7v去创建并启动容器,验证是否符合预期
    在这里插入图片描述

  • 相关阅读:
    【机器学习笔记】【数据预处理】
    Java基础:Java程序设计环境
    linux make和makefile
    day1- day6
    《Unix 网络编程》13:守护进程和 inetd 超级服务器
    【Leetcode】1554. Strings Differ by One Character
    Postman 最被低估的功能,90%的人不知道!
    paddle Conv2D参数,在手撕数字识别案例中调参数;卷积神经网络的卷积核大小、个数,卷积层数如何确定呢?
    学生HTML个人网页作业作品下载 动漫主题网页设计制作 大学生个人网站作业模板 dreamweaver简单个人网页制作
    【从零开始学习深度学习】7.自己动手实现softmax回归的训练与预测
  • 原文地址:https://blog.csdn.net/wenxiaoba/article/details/127553330