作者:Carrie
出处:https://home.cnblogs.com/u/hanjiali
版权:本文版权归作者和博客园共有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任

镜像的构建方式有三种

  1.基于已有的容器创建镜像

  2.基于本地模板创建镜像

  3.基于Dockerfile创建镜像(最常用的方式)

 镜像构建案例

  1.基于已有的容器创建镜像

     基于现在的镜像创建主要使用的docker commit 命令。即把一个容器里面运行的程序以及该程序的运行环境打包起来生成一个新的镜像。

  适用的场景:容器中有 相应的环境,想要镜像中的环境,将其打包进行环境的迁移。

  • docker commit [选项] 容器ID/名称 仓库的名称:[标签] 
  • 常用选项
  • -m 说明信息;
  • -a 作者信息
  • -p 生成过程中停止容器的运行

  实例:将centos7的容器中创建一个文件,将文件用docker commit命令打包成一个镜像

  • [root@localhost ~]# docker exec -it d6871d9 /bin/bash
    [root@d6871d9f7c54 /]# touch Carrie.txt
    [root@d6871d9f7c54 /]# read escape sequence
    [root@localhost ~]# docker commit -m "Carrie test images" -a "Carrie" d6871d9f7c54 centos7:new
    sha256:da3b71bf48830956e05ad1b8bf7cdf1a2c888dbbe421875b4b90e931b2f57879
    [root@localhost ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    centos7             new                 da3b71bf4883        20 seconds ago      204MB
    centos              7                   8652b9f0cb4c        3 weeks ago  

    进入容器,可以看到部署好的环境

    [root@localhost ~]# docker run -it centos7:new /bin/bash
    [root@73ce7c94527d /]# ls
    Carrie.txt anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
    [root@73ce7c94527d /]#

  2.基于本地模板创建镜像

   通过导入操作系统模板文件。可以从OPENVZ来源项目下载地址为:            https://download.openvz.org/template/precreated/

  实例:通过docker导入命令下载的centos模板压缩包导入为本地镜像

  •  
    [root@localhost ~]# wget https://download.openvz.org/template/precreated/centos-7-x86_64.tar.gz
    [root@localhost ~]# cat centos-7-x86_64.tar.gz |docker import - centos:test

      

  3.基于Dockerfile创建镜像(最常用的方式)

    3.1docker镜像的结构

  镜像并不是一个单一的文件,而是由多个层堆叠构成的,可以通过docker history命令查看镜像中各层的内容和大小,每层都是应对着Dockerfile的一条指令,Docker镜像默认存放在/var/lib/docker/<storage-driver>目录中,容器其实是在最上面加一层可写层,修改的数据都是在可写层中进行,但是容器一旦删除,容器中的数据也会丢失。

     3.2Dockerfile介绍

  Dockerfile是一种可以被Docker程序解释的脚本,Dockerfile是由多条指令堆积而成,,每个指令都对应着linux的一条命令,docker将dockerfile中的指令翻译成真正的linux命令。

  Dockerfile 结构大致分为四种:基础镜像信息,维护者(作者)信息,镜像操作指令和容器,启动执行的命令。Dockerfile每行支持一条指令,每条指令可以带多个参数,支持使用#开头的注释。

    3.3Dockerfile详解

    Dockerfile的指令分为两种:一种为构建指令。另一种为设置指令

    构建指令:用于构建镜像,其指令不会在运行的image容器上执行

    设置指令:用于设置image的属性,其指定的操作将在运行image的容器中执行。

    

    1.FROM 镜像:tag

  构建指令,必须指定所需要的基础镜像,后续指令都会依赖该指令创建,FROM 指定的基础镜像可以是官方远程仓库,也可是本地仓库。


    2.MAINTAINER 作者信息

  构建指令,指定作者的信息,当我们构建镜像时,会有指定的字段记录该信息。

 

      3.RUN 命令

  构建指令,RUN可以运行在任何被基础奖项支持的命令并提交新的镜像中,如果基础镜像为centos,那么RUN命令只能使用centos的指令。

 

    4.CMD[“要运行的程序”,“参数1”,“参数2”] 

  设置指令,用于容器启动时指定的操作,该操作可以时执行的自定义脚本,也可以时执行的系统命令,该指令只能在文件中最后一行,如果有多个CMD命令。则只执行最后一条。

   5.ENTRYPOINT(设置容器启动时的操作)

  设置命令,设置容器启动时执行的命令,可以多次设置,但是最后一条生效。

   6.USER 用户名/ID

  设置命令,设置启动容器的用户,默认为root.

   7.EXPOSE 端口

  设置指令,该指令会将容器中的端口映射成宿主机器中的某个端口。当你需要访问容器的时候,可以不使用容器的IP地址而是使用宿主机器的IP地址和映射后的端口。要完成整个操作需要两个步骤,首先在Dockerfile使用EXPOSE设置需要映射的容器端口,然后在运行容器的时候指定-p选项加上EXPOSE设置的端口,这样EXPOSE设置的端口号会被随机映射成宿主机器中的一个端口号。也可以指定需要映射到宿主机器的那个端口,这时要确保宿主机器上的端口号没有被使用。EXPOSE指令可以一次设置多个端口号,相应的运行容器的时候,可以配套的多次使用-p选项。

   8、ENV环境变量变量值

  构建指令,在image中设置一个环境变量。设置了后,后续的RUN命令都可以使用,container启动后,可以通过docker inspect查看这个环境变量,也可以通过在docker run --env key=value时设置或修改环境变量。假如你安装了JAVA程序,需要设置JAVA_HOME,那么可以在Dockerfile中这样写:ENV JAVA_HOME/usr/local/java

  9、ADD源文件目标文件

  构建指令,ADD命令相对于COPY命令,可以解压缩文件并把它们添加到镜像中的功能,如果我们有一个压缩文件包,并且需要把这个压缩包中的文件添加到镜像中。需不需要先解开压缩包然后执行COPY 命令呢?当然不需要!我们可以通过ADD 命令一次搞定。同时ADD还可以从url 拷贝文件到镜像中,但官方不推荐这样使用,官方建议我们当需要从远程复制文件时,最好使用curl 或wget 命令来代替ADD 命令。原因是,当使用ADD 命令时,会创建更多的镜像层,当然镜像的size 也会更大,所以ADD命令官方推荐只有在解压缩文件并把它们添加到镜像中时才需要。

  10、COPY源文件目标文件

  COPY命令用于将于Dockerfile所在目录中的文件在镜像构建阶段从宿主机拷贝到镜像中,对于文件而言可以直接将文件复制到镜像中,对于目录而言,该命令只复制目录中的内容而不包含目录自身

  11、VOLUME[“目录”]

  设置指令,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用。我们知道容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令。

  12、WORKDIR目录

  设置指令相当于cd命令,为后续RUN,CMD,ENTRYPOINT指定工作目录。

  13、ONBUILD命令

  指定所生产的镜像作为一个基础镜像时所要运行的命令

  14、HEALTHCHECK健康检查

   在编写Dockerfile 时,有严格的格式需要遵循:第一行必须使用FROM 指令指明所基于的镜像名称;之后使用MAINTAINER 指令说明维护该镜像的用户信息;然后是镜像操作相关指令,如RUN 指令。每运行一条指令,都会给基础镜像添加新的一层。最后使用CMD 指令指定启动容器时要运行的命令操作。

 

posted on 2020-12-07 19:52  不吃葡萄楞吐皮  阅读(109)  评论(0编辑  收藏  举报