zoukankan      html  css  js  c++  java
  • docker入门教程(四)构建镜像

     

    一:构建镜像

      对于Docker用户来说,最好的情况是不需要自己创建镜像。几乎所有常用的中间件,应用软件,数据库都有现成的Docker官方镜像或其他人和组织创建的镜像,我们只需稍作配置就可以直接使用。

      当然,某些情况下我们也不得不自己构建镜像,例如:

    (1)找不到现成的镜像,比如自己开发的应用程序

    (2)需要在镜像中加入特定的功能,比如官方镜像几乎都不提供ssh

    Docker提供了两种构建镜像的方法:docker commit 命令与Dockerfile构建文件

    1.docker commit

    docker commit命令是创建新镜像最直观的方法,其过程包含三个步骤:

    ● 运行容器。

    ● 修改容器。

    ● 将容器保存为新的镜像。

    语法
    docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
    OPTIONS说明:
    
    -a :提交的镜像作者;
    
    -c :使用Dockerfile指令来创建镜像;
    
    -m :提交时的说明文字;
    
    -p :在commit时,将容器暂停。

    ps

    将容器qwer1234 保存为新的镜像,并添加提交人信息和说明信息。
    docker commit -a "machao" -m "machao images" qwer1234 nginx:v1.12

    然而,Docker并不建议用户通过这种方式构建镜像。原因如下:
    (1).这是一种手工创建镜像的方式,容易出错,效率低且可重复性弱。比如要在centos镜像中也加入vim,
    还得重复前面的所有步骤。
    (2).更重要的:使用者并不知道镜像是如何创建出来的,里面是否有恶意程序。也就是说无法对镜像进行审计,
    存在安全隐患。

    二.Dockerfile

    用通俗一点的话来讲:dockerfile就是根据自己的需要自定义一个镜像,就像你写shell脚本一样,把一连串的过程或步骤全部写进dockerfile文件中,一步一步的执行dockerfile文件中你写的内容。

    Dockerfile是一个文本文件,记录了镜像构建的所有步骤

    ps:Dockerfile指令

     

    2.1.Build命令
    
    用法   :       构建    选项          
    
    Usage:docker build [OPTIONS] PATH | URL | -
    OPTIONS:
    -t ,--tag list  #构建后的镜像名称 把新镜像命名为
    -f, --file string #指定Dockerfiile文件位置
    
    示例:
    1,docker build . 
    2,docker build -t nginx:v10 .
    3,docker build -t nginx:v10 -f /path/Dockerfile /path
    
    一般常用第2种方式构建,我们在构建时都会切换到Dockerfile文件的目录下进行构建,所以不需要指定-f参数。

    ps.第一个Dockerfile

    [root@ubuntu ~]# cat Dockerfile
    FROM ubuntu
    RUN yum install vim -y

    [root@ubuntu ~]# pwd

    /root

    [root@ubuntu~]# docker build -t ubuntu-vim-dockerfile .

    [root@qwer1234 ~]# pwd    ①
    /root
    [root@qwer1234 ~]# ls ②
    Dockerfile [root@qwer123456
    ~]# docker build -t ubuntu-dockerfile . ③ Sending build context to Docker daemon 2.048 kB ④ Step 1/2 : FROM ubuntu ⑤ ---> 113a43faa138 Step 2/2 : RUN apt-get update && apt-get install -y vim ⑥ ---> Running in 6b519717e62d ⑦ ………… Setting up vim (2:8.0.1453-1ubuntu1) ... ---> ff7bda2385c1 ⑧ Removing intermediate container 6b519717e62d ⑨ Successfully built ff7bda2385c1 ⑩

    ①.当前目录为/root

    ②.Dockerfile准备就绪

    ③.运行docker build 命令,-t 将新镜像命名为 ubuntu-vim-dockerfile,命令末尾的  . 指明build context(构建环境)为当前目录。Docker默认会从build context中查找Dockerfile文件,我们也可以通过 -f 参数指定Dokerfile文件位置

    ④.从这步开始就是镜像真正的构建过程。首先Docker将build context中所有文件发送给Docker daemon。build context为镜像构建提供所需要的文件或目录。

        Dockerfile 中的ADD,COPY等命令可以将build context中的文件添加到镜像。此例中,build context 为当前目录/root,该目录下的所有文件和子目录都会被发送给Docker daemon。

    所以,使用 build context 就得小心了,不要将多余文件放到 build context,特别不要把/ ,/usr作为build context,否则构建过程会相当缓慢甚至失败。

    ⑤.step 1:执行FROM,将ubuntu 作为base镜像。

    ubuntu镜像ID为113a43faa138

    ⑥.step 2:执行 RUN,安装vim,具体步骤为 ⑦ ⑧ ⑨。

    ⑦.启动ID为6b519717e62d的临时容器,在容器中通过apt-get 安装vim。

    ⑧.安装成功后,将容器保存为镜像,其 ID 为 ff7bda2385c1。

    这一步底层使用的是类似docker commit 的命令

    ⑨.删除临时容器 6b519717e62d。

    ⑩.构建镜像成功 

     docker history 'image name'  ##docker history 会显示镜像的构建历史,也就是 Dockerfile 的执行过程

    3.镜像的缓存特性

    Docker 会缓存已有镜像的镜像层,构建新镜像时,如果某镜像层已经存在,就直接使用,无需重新创建

    4. 调试 Dockerfile

    Dockerfile 构建镜像过程:

    (1.) 从 base 镜像运行一个容器。

    (2.) 执行一条指令,对容器做修改。

    (3.) 执行类似 docker commit 的操作,生成一个新的镜像层。

    (4.) Docker 再基于刚刚提交的镜像运行一个新容器。

    (5.) 重复 2~4 步,直到 Dockerfile 中所有指令执行完毕。

  • 相关阅读:
    Chat Application using Web services in C#(转载)
    Asynchronous Method Invocation(转载)
    Passing Data between Windows Forms(转载)
    Fill in PDF Form Fields using the Open Source iTextSharp Dynamic Link Library(转载)
    The ShutDown Alarm(转载)
    使用blowery.Web.HttpCompress.dll对aspx压缩
    C# Voice and Tone Alert Generator(转载)
    Compress Folders with C# and the SharpZipLib(转载)
    Ubuntu 12.10 修改窗口按键布局(buttom_layout)到右边
    同步CM9源代码
  • 原文地址:https://www.cnblogs.com/mclzy/p/9210493.html
Copyright © 2011-2022 走看看