zoukankan      html  css  js  c++  java
  • 【Docker学习之四】Docker自定义容器镜像

    环境
      docker-ce-19.03.1-3.el7.x86_64

      centos 7

    一、使用已有容器创建镜像-docker commit
    1、查看本地已有镜像

    [root@node105 ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    nginx               latest              5a3221f0137b        9 days ago          126MB
    hello-world         latest              fce289e99eb9        7 months ago        1.84kB
    training/webapp     latest              6fae60ef3446        4 years ago         349MB

    查看本地正在运行的容器

    [root@node105 ~]# docker container ls
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
    15ff843a3404        training/webapp     "python app.py"          21 minutes ago      Up 21 minutes       0.0.0.0:32768->5000/tcp   stoic_moore
    db8b3e2f1c64        nginx               "nginx -g 'daemon of…"   About an hour ago   Up 36 minutes       0.0.0.0:8081->80/tcp      nginx-test
    [root@node105 ~]# 

    查看所有容器运行情况

    [root@node105 ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                     NAMES
    cdb6408b8370        training/webapp     "/bin/bash"              20 minutes ago      Exited (0) 15 minutes ago                             funny_ramanujan
    15ff843a3404        training/webapp     "python app.py"          22 minutes ago      Up 22 minutes               0.0.0.0:32768->5000/tcp   stoic_moore
    db8b3e2f1c64        nginx               "nginx -g 'daemon of…"   About an hour ago   Up 37 minutes               0.0.0.0:8081->80/tcp      nginx-test
    [root@node105 ~]# 

    2、以交互方式进入容器并进行修改

    [root@node105 ~]# docker run -ti training/webapp /bin/bash
    root@cdb6408b8370:/opt/webapp# ls
    Procfile app.py requirements.txt tests.py
    root@cdb6408b8370:/opt/webapp# touch app1.py
    root@cdb6408b8370:/opt/webapp# ls
    Procfile app.py app1.py requirements.txt tests.py
    root@cdb6408b8370:/opt/webapp# exit
    exit
    [root@node105 ~]#

    3、提交修改生成新的镜像

    [root@node105 ~]# docker commit -m "Added app1.py" -a "cac2020" 15ff843a3404 training/webapp:v2
    sha256:71b135d88d62ba40637c839c2cd955c10c23e187d48e6902f8b8095cf379f251
    [root@node105 ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
    training/webapp     v2                  71b135d88d62        7 seconds ago        349MB
    nginx               latest              5a3221f0137b        9 days ago           126MB
    hello-world         latest              fce289e99eb9        7 months ago         1.84kB
    training/webapp     latest              6fae60ef3446        4 years ago          349MB

    -m 来指定提交的说明信息,跟我们使用的版本控制工具一样;-a 可以指定更新的用户信息;之后是用来创建镜像的容器的 ID;最后指定目标镜像的仓库名和 tag 信息。创建成功后会返回这个镜像的 ID 信息

    4、删除镜像-dcoker rmi

    [root@node105 ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    training/webapp     v2                  71b135d88d62        8 minutes ago       349MB
    nginx               latest              5a3221f0137b        9 days ago          126MB
    hello-world         latest              fce289e99eb9        7 months ago        1.84kB
    training/webapp     latest              6fae60ef3446        4 years ago         349MB
    [root@node105 ~]# docker rmi 71b135d88d62
    Untagged: training/webapp:v2
    Deleted: sha256:71b135d88d62ba40637c839c2cd955c10c23e187d48e6902f8b8095cf379f251
    [root@node105 ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    nginx               latest              5a3221f0137b        9 days ago          126MB
    hello-world         latest              fce289e99eb9        7 months ago        1.84kB
    training/webapp     latest              6fae60ef3446        4 years ago         349MB

    二、使用Dockerfile创建镜像-docker build

    1、Dockerfile语法:
    (1)#是注释符
    (2)FROM 指定一个依赖的镜像,一个镜像不能超过 127 层

    (3)LABEL 为镜像生成元数据标签信息
    (4)MAINTAINER 作者信息,写在FROM后
    (5)COPY 当复制一个目录时,并不会复制目录本身,而是会递归复制其下子目录 至目标目录下
    (6)ADD ADD指令类似于COPY指令,ADD支持使用TAR文件和URL路径
    (7)WORKDIR 用于为Dockerfile中所有RUN、CMD、ENTRYPOINT、COPY和ADD指令设定工作目录
    (8)RUN 接受命令作为参数并用于创建镜像,在之前的commit层上形成新的层。
    (9)CMD 类似于RUN指令,CMD指令也可用于运行任何命令或应用程序,不过,二者的运行时间点不同
    RUN 指令运行于映像文件构建过程中,而CMD指令运行于基于Dockerfile构建出的新镜像文件启动一个容器时。
    CMD指令的首要目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器也将终止;不过,CMD指定的命令其可以被docker run的命令行选项所覆盖
    在Dockerfile中可以存在多个CMD指令,但仅最后一个生效;
    CMD会在启动容器的时候执行,build时不执行,而RUN只是在构建镜像的时候执行,后续镜像构建完成之后,启动容器就与RUN无关了。这个命令就相当于在/etc/rc.d/rc.local中写命令
    (10)ENTRYPOINT 类似CMD指令的功能,用于为容器指定默认运行程序,从而使得容器像是一具单独的可执行程序
    (11)EXPOSE 用来指定端口,使容器内的应用可以通过端口和外界交互。
    (12)ENV ENV指令可以用于docker容器设置环境变量
    (13)USER 用于指定运行image时的或运行Dockerfile中任何RUN、CMD或ENTRYPOINT指令指定的程序时的用户名或UID
    默认情况下,container的运行身份为root用户
    (14)ONBUILD 用于在Dockerfile中定义一个触发器
    Dockerfile用于build映像文件,此映像文件亦可作为base image被另一个Dockerfile用作FROM指令的参数,并以之构建新的映像文件
    在后的这个Dockerfile中的FROM指令在build过程中被执行时,将会“触发”创建其base image的Dockerfile文件中的ONBUILD指令定义的触发器
    (15)HEALTHCHECK Docker 1.12版本后引入的判断容器状态是否正常

    2、docker build 语法

    docker build [OPTIONS] PATH | URL | -

     build执行过程:它要做的第一件事情就是上传这个 Dockerfile 内容,因为所有的操作都要依据 Dockerfile 来进行。然后,Dockfile 中的指令被一条一条的执行。每一步都创建了一个新的容器,在容器中执行指令并提交修改(就跟之前介绍过的 docker commit 一样)。当所有的指令都执行完毕之后,返回了最终的镜像 id。所有的中间步骤所产生的容器都被删除和清理了。

    三、本地文件系统导入构建镜像-docker import
    要从本地文件系统导入一个镜像,可以使用 openvz(容器虚拟化的先锋技术)的模板来创建:openvz 的模板下载地址为templates 。
    1、先下载了一个 ubuntu-14.04 的镜像,之后使用以下命令导入:
    sudo cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:14.04

    2、然后查看新导入的镜像
    docker images
    REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
    ubuntu 14.04 05ac7c0b9383 17 seconds ago 215.5 MB

    四、上传镜像-docker push
    把创建的镜像上传到仓库中来共享。Docker Hubhuo或者自己搭建的仓库。

    docker push 镜像名

    五、存储和载入镜像

    1、保存镜像为文件
    docker save -o 要保存的文件名 要保存的镜像
    eg:
    docker save -o java8.tar lwieske/java-8

    2、从文件载入镜像
    docker load --input 文件
    或者
    docker load < 文件名
    eg:
    docker load < java8.tar

    参考:

    Dockerfile语法简介

    docker build 命令

    创建docker镜像的两种方式
    Docker 创建镜像、修改、上传镜像

  • 相关阅读:
    火车票起售时间
    java基础知识
    java运行
    123
    1233
    那些不能错过的XCode插件
    那些不能错过的XCode插件
    如何正确的在Android中存储特定应用文件
    如何正确的在Android中存储特定应用文件
    问题解决:listview多次调用addHeaderView和addFooterView
  • 原文地址:https://www.cnblogs.com/cac2020/p/11407329.html
Copyright © 2011-2022 走看看