• 【Docker从入门到入土 3】Docker镜像的创建方法


    一、Docker镜像

    1.1 镜像的概念

    镜像是创建容器的基础

    镜像是一个只读的模板文件,里面包含运行容器中的应用程序所有需要的所有内容(应用程序文件、配置文件、运行库文件、依赖包等)。

    1.2 镜像结构的分层

    在这里插入图片描述

    Docker 镜像由多个只读层组成,每个层都包含了文件系统的一部分。

    这些层按照从底向上的顺序依次叠加,形成一个完整的镜像。

    镜像的最底层是一个基础镜像(Base Image),上面叠加了一系列更高层的镜像,每个层都是前一个层的增量变化。

    在容器启动时,Docker 引擎会将这些层通过联合文件系统合并成一个容器文件系统。

    在容器运行过程中,Docker 引擎将修改操作写入一个可写层(Writeable Layer),该层仅保存容器运行时的状态和数据。

    这种分层和联合文件系统的设计使得镜像的创建和传播非常高效,节省了存储空间和下载时间。

    二、Docker镜像的创建

    创建镜像有三种方法,分别为基于已有镜像创建基于本地模板创建以及基于Dockerfile创建

    2.1 基于现有镜像创建

    基于已有镜像创建主要使用 docker commit 命令。

    本质上就是把一个容器里面运行的程序和该程序的运行环境打包,生成新的镜像

    #基本格式
    docker commit [选项] 容器ID/名称 仓库名称:[标签]
    
    ##常用选项##
    -m 说明信息;
    -a 作者信息;
    -p 生成过程中停止容器的运行。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.1.1 创建思路

    1)先用现有镜像创建启动容器 ,使用 docker run命令;

    2)再进入容器进行内容更新 ,使用docker exec命令;

    3)最后提交成新的镜像 ,使用 docker commit命令。

    2.1.2 举个例子

    首先启动一个镜像,在容器里做修改

    docker create -it centos:7 /bin/bash
    
    • 1
    docker ps -a
    
    • 1

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    然后将修改后的容器提交为新的镜像,需要使用该容器的 ID 号创建新镜像

    docker commit -m "new" -a "centos" 6446831c79c7 centos:test
    
    docker image
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    2.2 基于本地模板创建

    通过导入操作系统模板文件生成镜像,模板可以从 OPENVZ 开源项目下载。

    下载地址为http://openvz.org/Download/template/precreated

    举个例子

    #下载
    wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
    
    • 1
    • 2

    在这里插入图片描述

    #导入为镜像
    cat debian-7.0-x86-minimal.tar.gz | docker import - debian:test
    
    • 1
    • 2

    在这里插入图片描述

    2.3 基于Dockerfile 创建

    除了手动生成Docker镜像之外,可以使用Dockerfile自动生成镜像。

    Dockerfile是由多条的指令组成的文件,其中每条指令对应 Linux 中的一条命令,Docker 程序将读取Dockerfile 中的指令生成指定镜像。

    Dockerfile结构大致分为四个部分:基础镜像信息维护者信息镜像操作指令容器启动时执行指令

    Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以“#“号开头的注释。

    三、Dockerfile 详解

    3.1 Dockerfile 操作指令

    3.1.1 常用的操作指令

    常用指令含义
    FROM指定基础镜像(是Dockerfile的第一行指令)
    MAINTAINER指定镜像维护人信息(可选)
    RUN指定Linux命令,如果要执行连续多条命令时建议用 ; 或 && 或 <
    EXPOSE指定容器应用的端口
    ENV设置镜像的环境变量
    ADD/COPY复制文件/目录到镜像里
    VOLUME指定容器的匿名数据卷
    USER指定容器的运行用户
    WORKDIR指定后续镜像层的工作目录
    ARG指定构建镜像时传入的参数变量,docker build --build-arg 变量=值
    CMD/ENTRYPOINT指定容器启动时执行的命令

    3.1.2 CMD和ENTRYPOINT的区别?

    共同点:都可以用来指定容器启动命令。

    区别:ENTRYPOINT指定的容器启动命令优先级更高

    如果CMD和ENTRYPOINT同时存在,那么CMD指定的内容将作为ENTRYPOINT指定的容器启动命令的选项或参数使用。

    容器启动时运行的命令优先级
    docker run --entrypoint=“命令” > 镜像里的ENTRYPOINT指定的命令 > docker run … 镜像 命令 > 镜像里的CMD指定的命令

    3.1.3 ADD和COPY的区别?

    共同点:都可以将本地的文件/目录复制到镜像里。

    区别:ADD还可以通过URL下载文件复制到镜像里,还能将本地的压缩包解压后复制到镜像里。

    URL下载和压缩包解压特性不能同时使用

    3.2 基于Dockerfile构建镜像的步骤

    在编写 Dockerfile 时,有严格的格式需要遵循

    1)第一行 用FROM指令指明所用的基础镜像;

    2)之后用MAINTAINER指令说明维护镜像的用户信息;

    3)然后用镜像操作相关指令,比如RUN EXPOSE ENV ADD COPY 等指令,编写构建镜像的过程。每运行一条指令,都会给基础镜像添加新的一层;

    4)结尾使用CMD/ENTRYPOINT指令指定容器启动时执行的命令;

    5)最后使用docker build -t 新镜像名:标签 . [-f Dockerfile文件路径]命令构建镜像。

    3.3 基于Dockerfile创建镜像应用实例

    Step1 建立工作目录

    mkdir  /opt/apache
    cd  /opt/apache
    
    • 1
    • 2

    Step2 创建并编写Dockerfile文件

    vim Dockerfile
    
    #基于的基础镜像
    FROM centos:7
    #维护镜像的用户信息
    MAINTAINER this is apache image <hmj>
    #镜像操作指令安装apache软件
    RUN yum -y update
    RUN yum -y install httpd
    #开启 80 端口
    EXPOSE 80
    #复制网站首页文件
    ADD index.html /var/www/html/index.html
    
    ##方法一
    #将执行脚本复制到镜像中
    ADD run.sh /run.sh
    RUN chmod 755 /run.sh
    CMD ["/run.sh"]
    
    ##方法二
    ENTRYPOINT [ "/usr/sbin/apachectl" ]
    CMD ["-D", "FOREGROUND"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    Step3 编写执行脚本

    vim  run.sh
    
    rm -rf /run/httpd/*							#清理httpd的缓存
    /usr/sbin/apachectl -D FOREGROUND			#指定为前台运行
    
    #因为Docker容器仅在它的1号进程(PID为1)运行时,会保持运行。如果1号进程退出了,Docker容器也就退出了。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Step4 创建测试页面

    echo "this is test web from byyb " > index.html
    ls
    
    • 1
    • 2

    在这里插入图片描述

    Step5 使用Dockerfile生成镜像

    docker build -t httpd:centos .   		
    #注意别忘了末尾有"."
    
    • 1
    • 2

    在这里插入图片描述

    Step6 使用新的镜像运行容器并测试

    1.使用新镜像运行容器

    docker run -d -p 1216:80 httpd:centos
    
    • 1

    在这里插入图片描述

    docker ps -a 
    
    • 1

    在这里插入图片描述

    2.测试

    firefox http://192.168.2.106:1216
    
    • 1

    在这里插入图片描述

    四、如何去缩小构建镜像的大小?

    1)尽可能的采用小体积的基础镜像

    2)尽可能的减少Dockerfile指令的数量

    3)在RUN指令里添加安装软件后清空yum/apt缓存、软件包的命令

    4)使用多级(多阶段)构建的方法 。

    FROM 第一阶段的基础镜像 AS 别名
    ......
    FROM 第二阶段的基础镜像
    COPY --from=别名  第一阶段构建的文件/目录  当前阶段的路径
     .....
    CMD/ENTRYPOINT 指定容器启动时执行的命令
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    软件架构师 Debugging
    [附源码]Python计算机毕业设计SSM敬老院信息管理系统(程序+LW)
    Oracle关闭回收站
    9、8锁现象彻底的理解锁(锁的只有两个东西,一个是对象,一个是Class模板(static修饰))
    【机器学习可解释性】2.特征重要性排列
    go - flag包(处理命令行参数小能手)
    全面解析‘msvcp140.dll丢失的解决方法’这个问题
    【前端实例代码】Html5+css3创建拟物风格昏昏欲睡的云朵动画网页效果~前端开发网页设计基础入门教程~适合初学者~超简单~
    基于SSM的人力资源管理系统,高质量毕业论文范例-可直接使用
    LCR 006.两数之和 II - 输入有序数组
  • 原文地址:https://blog.csdn.net/q2524607033/article/details/133978860