• Docker三大核心概念之镜像


    1.1 获取镜像

    使用docker pull命令,从Docker Hub镜像源来下载镜像,该命令的格式为:docker pull NAME[:TAG],其中NAME是仓库的名称,TGA是镜像的版本标签(往往是用来表示版本信息)通常情况下描述一个镜像需要包括“名称+标签”信息。

    以下的命令用来获取一个Ubuntu 14.04的系统的基础镜像

    # docker pull  ubuntu:14.04
    Trying to pull repository docker.io/library/ubuntu ... 
    14.04: Pulling from docker.io/library/ubuntu
    8284e13a281d: Pull complete 
    26e1916a9297: Pull complete 
    4102fc66d4ab: Pull complete 
    1cf2b01777b2: Pull complete 
    7f7a2d5e04ed: Pull complete 
    Digest: sha256:4851d1986c90c60f3b19009824c417c4a0426e9cf38ecfeb28598457cefe3f56
    Status: Downloaded newer image for docker.io/ubuntu:14.04

    如果不指定标签,则默认会选择下载仓库中最新版本的镜像

    # docker pull  ubuntu
    Using default tag: latest
    Trying to pull repository docker.io/library/ubuntu ... 
    latest: Pulling from docker.io/library/ubuntu
    c64513b74145: Pull complete 
    01b8b12bad90: Pull complete 
    c5d85cf7a05f: Pull complete 
    b6b268720157: Pull complete 
    e12192999ff1: Pull complete 
    Digest: sha256:8c3cced1211d1a566088c0af049cc8cd6f33f5b275e62e6285ca6a13e66a98f0
    Status: Downloaded newer image for docker.io/ubuntu:latest

    如果从非官方的仓库下载,则需要在仓库名称前指定完整的仓库地址,列如从网易蜂巢的镜像源来下载Ubuntu:14.04镜像,可以如下命令,此时下载的镜像名称为hub.c.163.com/public/ubuntu:14.04

    # docker pull hub.c.163.com/public/ubuntu:14.04

    下载镜像到本地后,即可随时使用该镜像了,例如利用该镜像创建一个容器,在其中运行bash应用,执行ping localhost命令:

    # docker run -it ubuntu:14.04 bash
    root@04fc49acd640:/# ping localhost
    PING localhost (127.0.0.1) 56(84) bytes of data.
    64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.040 ms
    64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.033 ms
    64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.035 ms
    ^C
    --- localhost ping statistics ---
    6 packets transmitted, 3 received, 0% packet loss, time 4999ms
    rtt min/avg/max/mdev = 0.033/0.036/0.045/0.008 ms
    root@04fc49acd640:/# exit
    exit

      

    1.2查看镜像信息

    1. 使用images命令列出镜像

    使用 docker images命令可以列出本地上已有镜像的基本信息。
    列如下面的命令列出了上一小节下载的镜像信息:

    # docker images 
    REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
    docker.io/ubuntu              latest              735f80812f90        2 weeks ago         83.5 MB
    docker.io/ubuntu              14.04               971bb384a50a        3 weeks ago         188 MB
    docker.io/centos              latest              49f7960eb7e4        2 months ago        200 MB
    docker.io/ubuntu              15.10               9b9cb95443b5        2 years ago         137 MB
    hub.c.163.com/public/ubuntu   14.04               2fe5c4bba1f9        2 years ago         237 MB

    以上列出的信息中可以看到以下几个字段信息。
    REPOSITORY:来自于那个仓库,Ubuntu仓库用来保存Ubuntu系列的基础镜像;
    TAG:镜像的标签信息,比如14.04、latest用来标注不同的版本信息。
    IMAGE ID:镜像的ID(作为镜像的唯一标识),如果两个镜像的D都是一样的,说明他们目前实际指向同一个镜像;
    CREATED:创建时间,说明镜像最后的更新时间;
    SIZE:镜像大小,优秀的镜像往往体积都较小;

    其中镜像ID信息十分重要,它唯一标识了进行,在使用镜像ID的时候,一般可以使用该ID的前若干个字符组成可区分串来代替完整的ID。

    2. 使用tag命令添加镜像标签

    为了方便后续的工作中使用特定镜像,还可以使用docker tag 命令来为本地镜像任意添加新的标签。列如添加一个新的myUbuntu:latest镜像的标签:

    # docker tag ubuntu:latest myubuntu:latest

    再次使用docker images列出本地主机上镜像信息,可以看到多了一个拥有myubuntu:latest标签的镜像

    之后就可以使用myubuntu:latest来表示这个镜像了。
    上面的的ubuntu:latest和myubuntu:latest的ID是完全一样的,他们实际指向的是同一个镜像文件,只是别名不同。docker tag 命令类似于连接的作用。

    3. 使用inspect命令来查看详细信息

    使用docker inspect 命令可以获取该镜像的详细信息,包括制作者、适应架构、各层的数字摘要等;

    # docker inspect ubuntu:14.04
    [
        {
            "Id": "sha256:971bb384a50ae93856362f9c40ea471e66a97cfd4023b9cc9b8e4196e99da2c7",
            "RepoTags": [
                "docker.io/ubuntu:14.04"
            ],
            "RepoDigests": [
                "docker.io/ubuntu@sha256:4851d1986c90c60f3b19009824c417c4a0426e9cf38ecfeb28598457cefe3f56"
            ],
            "Parent": "",
            "Comment": "",
            "Created": "2018-07-17T00:53:26.788109792Z",
            "Container": "aebe58aa560b9a5a7d4a554bdb712f3ac111d5b68d454d1da4bde0ae09834d02",
            "ContainerConfig": {
                "Hostname": "aebe58aa560b",
                "Domainname": "",
                "User": "",
                "AttachStdin": false,
                "AttachStdout": false,
                "AttachStderr": false,
                "Tty": false,
                "OpenStdin": false,
                "StdinOnce": false,
                "Env": [
                    "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                ],
                "Cmd": [
                    "/bin/sh",
                    "-c",
                    "#(nop) ",
                    "CMD ["/bin/bash"]"
                ],
                "ArgsEscaped": true,
                "Image": "sha256:c348331b2dd4c932a36ded8dc5f875383636a1fcf353cb269e6ddb6c5d23b168",
                "Volumes": null,
                "WorkingDir": "",
                "Entrypoint": null,
                "OnBuild": null,
                "Labels": {}
            },
            "DockerVersion": "17.06.2-ce",
            "Author": "",
            "Config": {
                "Hostname": "",
                "Domainname": "",
                "User": "",
                "AttachStdin": false,
                "AttachStdout": false,
                "AttachStderr": false,
                "Tty": false,
                "OpenStdin": false,
                "StdinOnce": false,
                "Env": [
                    "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                ],
                "Cmd": [
                    "/bin/bash"
                ],
                "ArgsEscaped": true,
                "Image": "sha256:c348331b2dd4c932a36ded8dc5f875383636a1fcf353cb269e6ddb6c5d23b168",
                "Volumes": null,
                "WorkingDir": "",
                "Entrypoint": null,
                "OnBuild": null,
                "Labels": null
            },
            "Architecture": "amd64",
            "Os": "linux",
            "Size": 188037110,
            "VirtualSize": 188037110,
            "GraphDriver": {
                "Name": "overlay2",
                "Data": {
                    "LowerDir": "/var/lib/docker/overlay2/8402944d42a0d25ddcb20430343c704f069b9f95c9cc4de6a09a8b6114f4d779/diff:/var/lib/docker/overlay2/94834dfd10ec14801444e62db9315c9aa24ea1ac25763b10901fa148243a9407/diff:/var/lib/docker/overlay2/1c021d59d5b8e52d717d704c5a71e6c2dbc429eb5c46d13f1eb77920053f5103/diff:/var/lib/docker/overlay2/808d07e509c40c2b15912963f315c6be4b88fc3aeea0d1068ca54b3f123336cc/diff",
                    "MergedDir": "/var/lib/docker/overlay2/318bf2d512346121a2728e24d509e1a95e2209bffcda2a64cd18de61c9ec750b/merged",
                    "UpperDir": "/var/lib/docker/overlay2/318bf2d512346121a2728e24d509e1a95e2209bffcda2a64cd18de61c9ec750b/diff",
                    "WorkDir": "/var/lib/docker/overlay2/318bf2d512346121a2728e24d509e1a95e2209bffcda2a64cd18de61c9ec750b/work"
                }
            },
            "RootFS": {
                "Type": "layers",
                "Layers": [
                    "sha256:93da31b6a5499e9b86dcd8ea0cf6b5d0fa9ed5b9beaedceee5b58218b494e80e",
                    "sha256:d196bfd70d49b469a01bd45e6070b70ea9116783112da44f61d10958dbc7de10",
                    "sha256:2f19e981cedab782dc2ab39a6e8e9782ff714bef28c043efbdc34f2afcd057c5",
                    "sha256:8f6a7ca929441c126e8faf4b0891d6b95876be80a7f8bec993e3bc56160e71ee",
                    "sha256:73dd5183c549685de3be83f6628895d36c6244cfc21f21aad10765c9b528a90b"
                ]
            }
        }
    ]
    # docker inspect ubuntu:14.04 

    返回的是一共JSON格式的消息,如果我们只要其中一项内容时,可以使用参数-f来指定,例如,获取镜像的Architecture: 

    # docker inspect ubuntu:14.04 -f {{".Architecture"}}
    amd64

    4. 使用history命令来查看镜像历史

    使用 docker history 子命令,来查看各层的具体内容,该命令将列出各层的创建信息。
    例如,查看Ubuntu:14.04镜像的创建过程,可以使用如下命令:

    # docker history ubuntu:14.04
    IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
    971bb384a50a        3 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0 B                 
    <missing>           3 weeks ago         /bin/sh -c mkdir -p /run/systemd && echo '...   7 B                 
    <missing>           3 weeks ago         /bin/sh -c sed -i 's/^#s*(deb.*universe...   2.76 kB             
    <missing>           3 weeks ago         /bin/sh -c rm -rf /var/lib/apt/lists/*          0 B                 
    <missing>           3 weeks ago         /bin/sh -c set -xe   && echo '#!/bin/sh' >...   195 kB              
    <missing>           3 weeks ago         /bin/sh -c #(nop) ADD file:2b307231ea58541...   188 MB 

    过长的命令被自动截断了,可以使用 --no-trunc选择来输出完整的命令

    1.3 搜寻镜像

    使用docker search命令可以搜索远端仓库中共享的镜像,默认是搜索官网的镜像,用法为docker search TERM,支持的参数主要包括:

    • --automated=true|false:仅显示自动创建的镜像,默认为否;
    • --no-trunc=true|false:输出信息不截断显示,默认为口;
    • -s,--stars=X:指定仅显示评价为指定星级以上的镜像,默认为0,即输出所有镜像。

    例如,搜索所有自动创建的评价为1+的带 nginx 关键字的镜像,如下所示:

    3.4删除镜像

    1. 使用标签删除镜像

    使用docker rmi 命令可以删除镜像,命令格式为docker rmi IMAGE [IMAGE…],其中IMAGE可以为标签或ID。
    列如要删除掉myubuntu:latest镜像,可以使用如下命令:

    # docker rmi myubuntu
    Untagged: myubuntu:latest
    Untagged: docker.io/ubuntu@sha256:8c3cced1211d1a566088c0af049cc8cd6f33f5b275e62e6285ca6a13e66a98f0

    docker rmi 命令只是删除该镜像多个标签中的指定标签,并不会影响镜像文件;
    但是如果镜像只剩下一个标签的时候,此时再使用docker rmi命令会彻底删除镜像

    2.使用镜像ID删除镜像

    当使用docker rmi命令,并且后面跟上镜像的ID,(也可以是区分部分ID串前缀)时,会先尝试指向该镜像的标签,然后删除该镜像文件本身。
    注意,当有该镜像创建的容器存在时,镜像文件默认是无法被删除的,列如,先利用Ubuntu:14.04镜像创建的易购简单的容器来输出一段话:

    # docker run  ubuntu:14.04 echo 'hello! I am here'
    hello! I am here

    使用docker ps -a命令可以查看本机上存在的所有容器:

    可以看到后台存在一个退出状态的容器,是刚基于ubuntu:14.04镜像创建的。
    试图删除该镜像,Docker 会提示有容器正在运行,无法删除:

    # docker rmi  ubuntu:14.04
    Error response from daemon: conflict: unable to remove repository reference "ubuntu:14.04" (must force) - container 202be0fbfcbc is using its referenced image 971bb384a50a

    如果要强行删除镜像,可以使用-f参数。

    # docker rmi  -f ubuntu:14.04
    Untagged: myubuntu:latest

    注意,通常不推存使用 -f 参数来强制删除一个存在的容器依赖的镜像。正确的做法是,先删除依赖该镜像的所有容器,再来删除镜像。

    1.5创建镜像

    创建镜像的方法主要有三种:基于已有的容器创建、基于本地模板导入、基于Dockerfile创建。
    本节将重点介绍前两种方法,最后一张基于Dockerfile创建的方法将在这里专门予以详细介绍。

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

    该方法主要是使用docker commit命令。命令格式为docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]],主要选项包括:

    • -a,--author="":作者信息;
    • -c,--change=[]:提交的时候执行Dockerfile指令,包括CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR|等;
    • -m, --message="":提交信息;
    • -p,--pause=ture:提交时暂停容器运行

    下面演示如果使用该命令创建一个新镜像。首先,启动一个镜像,并在其中进行修改操作,列如创建一个test文件,之后退出;

    # docker run -it ubuntu:14.04 bash 
    root@3abd0530a8cb:/# touch test
    root@3abd0530a8cb:/# exit
    exit

    该容器的ID为52dd9d97009f
    注意:该ID为docker ps -a 的进程ID 不是镜像ID
    此时该容器跟原ubuntu:14.04镜像相比,已经发生了改变,可以使用docker commit命令来提交一个新的镜像。提交时可以使用ID或名称来指定容器:

    # docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                      PORTS               NAMES
    52dd9d97009f        ubuntu:15.10        "/bin/bash"         About a minute ago   Exited (0) 15 seconds ago                       youthful_cori
    # docker commit -m "added a new file" -a "docker Newbee" 52dd9d97009f mytest
    sha256:9190ff25dd017a3fe60da811b43b3af8e29f51707a2768560d16e9652259ac91

    此时再查看本地镜像列表,会发现新创建的镜像已经再存了;

    # docker images mytest
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    mytest              latest              9190ff25dd01        5 minutes ago       137 MB

    2. 基于本地模板导入

    也可以直接从一个操作系统模板文件导入一个镜像,主要使用docker import命令,命令格式为docker import [OPTIONS] file|URL| - [REPOSITORY[:TAG]]。
    要直接导入一个镜像,可以使用OpenVZ提供的模板来创建,或者用其他已导出的镜像模板来创建,OPENVZ模板的下载地址为https://download.openvz.org/template/precreated/.
    列如,下载了centos-6-x86的模板压缩包,之后使用以下命令导入:

    # cat centos-6-x86-minimal.tar.gz |docker import - centos:6

    然后查看新导入的镜像,会发现它已经在本地存在了:

    docker images centos
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    centos              6                   29866567a6dd        2 minutes ago       512 MB

    1.6存出和载入镜像

    可以使用docker save 和 docker load 命令来存出和载入镜像。

    1. 存出镜像

    如果要导出镜像到本地文件,可以使用docker save命令。列如,导出本地的ubuntu:14.04镜像为文件ubuntu:14.04.tar,如下所示

    # docker images ubuntu:14.04
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    docker.io/ubuntu    14.04               971bb384a50a        3 weeks ago         188 MB
    ...
    # docker save -o ubuntu_14.04.tar ubuntu:14.04

    之后用户就可以通过复制ubuntu_14.04.tar文件将该镜像分享给他人。

    2. 载入镜像

    可以使用docker load将导出的tar文件到导入到本地镜像库,例如从文件ubuntu_14.04.tar导入镜像到本地列表如下所示:

    # docker load --input ubuntu_14.04.tar 
    或:
    # docker load <  ubuntu_14.04.tar

    这将导入镜像及其相关的原数据信息(包括标签等)。导入成功后可以使用docker images命令进行查看。

  • 相关阅读:
    项目在入口加一个简单的密码验证
    关于APICloud使用心得(原创)
    vue、React Nactive的区别(转载)
    js的Element.scrollIntoView的学习
    立个flag---每天一篇博客
    ACID理解
    CAP原理与最终一致性 强一致性 弱一致性
    事物隔离级别
    分布式事务
    MySQL日志
  • 原文地址:https://www.cnblogs.com/Gnnnny/p/9473673.html
Copyright © 2020-2023  润新知