• Docker学习笔记(2)-docker镜像操作


    本节将会涉及Docker的镜像操作。

    1. 获取镜像

    如何获取Docker Hub上的镜像?可通过docker pull命令获取,其格式为: docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签],具体可通过docker pull --help命令查看。

    Docker镜像仓库地址的格式一般为<域名/IP>[:端口号]仓库名一般为两段式名称,即<用户名>/<软件名>,对于Docker Hub,默认的用户名为library

    例:获取ubuntu:16.04镜像,其中可看到默认用户library,16.04位镜像标签。

    $ docker pull ubuntu:16.04
    16.04: Pulling from library/ubuntu
    8f7c85c2269a: Pull complete 
    9e72e494a6dd: Pull complete 
    3009ec50c887: Pull complete 
    9d5ffccbec91: Pull complete 
    e872a2642ce1: Pull complete 
    Digest: sha256:d3fdf5b1f8e8a155c17d5786280af1f5a04c10e95145a515279cf17abdf0191f
    Status: Downloaded newer image for ubuntu:16.04
    View Code 

    从下载过程中可看到docker的分层存储概念下载会进行分层下载,下载过程中给出每一层ID的前12位,下载结束后,给出完整的sha256摘要,确保下载一致性。

    2. 运行镜像

    基于镜像,可以启动并运行一个容器。格式为:docker run [选项] 镜像名 [CMD]

    例:运行ubuntu:16.04 镜像。

    $ docker run -it --rm ubuntu:16.04 bash
    root@b5744a2879f8:/#
    View Code 

    运行后,可以看到已进入到容器内部,且以root用户进入。

    查看容器中的系统信息:

    root@e59690e24ff2:/# cat /etc/os-release 
    NAME="Ubuntu"
    VERSION="16.04.3 LTS (Xenial Xerus)"
    ID=ubuntu
    ID_LIKE=debian
    PRETTY_NAME="Ubuntu 16.04.3 LTS"
    VERSION_ID="16.04"
    HOME_URL="http://www.ubuntu.com/"
    SUPPORT_URL="http://help.ubuntu.com/"
    BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
    VERSION_CODENAME=xenial
    UBUNTU_CODENAME=xenial
    View Code 

    命令中的-it选项:-i表示交互式操作,-t表示终端,因为打算进入bash执行一些命令,并查看返回结果,因此需要交互式终端;

    --rm选项:该选项表示容器退出后随之将容器删除。默认情况下,退出容器不会立即删除,需要手工docker rm。这里只是演示执行命令,不需要排障和保留结果,因此使用该参数,避免空间浪费。

    bash命令:放在镜像名(ubuntu: 16.04)后面的是命令,bash命令可以提供交互式shell。

    进入容器后,该容器即为ubuntu系统,可以执行ubuntu相关的任何命令。

    退出容器,使用exit命令即可。

    3. 列出镜像

    想要列出已存在的镜像,可使用docker image ls命令。列表会提供仓库名、标签、镜像ID、创建时间、占用空间

    $ docker image ls | grep -v 192.168 | grep -v gcr | grep -v none | grep -v content | grep -v down | grep -v media | grep -v wal
    REPOSITORY                                                 TAG                 IMAGE ID            CREATED             SIZE
    ubuntu                                                     16.04               2a4cca5ac898        5 days ago          111MB
    jupyterhub/jupyterhub                                      latest              c5dc992337c7        7 days ago          670MB
    nginx                                                      v3                  fbe2b1559cb0        9 days ago          108MB
    nginx                                                      v2                  3e652016d731        9 days ago          108MB
    nging                                                      v2                  3d79377a847b        9 days ago          108MB
    quay.io/coreos/etcd                                        latest              94bc3af972c9        9 days ago          37.2MB
    busybox                                                    latest              807fd4df40d1        12 days ago         1.14MB
    apollo-configservice                                       latest              277dd2dccb3c        12 days ago         191MB
    apollo-adminservice                                        latest              84a3ec4dfcb5        12 days ago         185MB
    apollo-portal                                              latest              40cfb14be3f0        13 days ago         164MB
    jupyter/minimal-notebook                                   latest              3130da5c9146        2 weeks ago         2.73GB
    docker-start-web                                           latest              b92c92688046        2 weeks ago         113MB
    test                                                       latest              b92c92688046        2 weeks ago         113MB
    friendlyhello                                              latest              bf1ed1612b69        2 weeks ago         148MB
    nginx                                                      latest              3f8a4339aadd        3 weeks ago         108MB
    ifrs                                                       latest              01c81b407ffb        4 weeks ago         476MB
    cloudnativelabs/kube-router                                latest              79413998ed60        4 weeks ago         88.4MB
    ubuntu                                                     14.04               67759a80360c        5 weeks ago         221MB
    jenkins                                                    latest              5fc84ab0b7ad        5 weeks ago         809MB
    jetty                                                      latest              2938aa22262c        5 weeks ago         547MB
    python                                                     2.7-slim            4fd30fc83117        5 weeks ago         138MB
    rethinkdb                                                  latest              98ac1e7f55fd        5 weeks ago         182MB
    mysql                                                      5.7                 7d83a47ab2d2        5 weeks ago         408MB
    mysql                                                      latest              7d83a47ab2d2        5 weeks ago         408MB
    portainer/portainer                                        latest              f71b185552bf        5 weeks ago         33.2MB
    openjdk                                                    8-jre-alpine        a7441b26c41b        6 weeks ago         81.9MB
    registry                                                   2                   177391bcf802        7 weeks ago         33.3MB
    registry                                                   latest              177391bcf802        7 weeks ago         33.3MB
    alpine                                                     latest              e21c333399e0        7 weeks ago         4.14MB
    hello-world                                                latest              f2a91732366c        2 months ago        1.85kB
    quay.io/coreos/flannel                                     v0.9.1-amd64        2b736d06ca4c        2 months ago        51.3MB
    swarm                                                      latest              59c0df55980b        2 months ago        15.8MB
    busybox                                                    latest              6ad733544a63        2 months ago        1.13MB
    centos                                                     centos7.4.1708      3afd47092a0e        2 months ago        197MB
    nobodyiam/apollo-quick-start                               latest              6b3290a6a9cc        3 months ago        144MB
    dockersamples/visualizer                                   stable              8dbf7c60cf88        5 months ago        148MB
    shipyard/shipyard                                          latest              36fb3dc0907d        15 months ago       58.8MB
    shipyard/docker-proxy                                      latest              cfee14e5d6f2        2 years ago         9.46MB
    microbox/etcd                                              latest              6aef84b9ec5a        2 years ago         17.9MB
    View Code 

    注意:一个镜像可以对应多个标签,因此可以看到mysql的镜像ID为7d83a47ab2d2,而对应两个标签,分别为latest和5.7。

    4. 镜像体积

    Docker Hub中的镜像与下载下来的镜像大小可能不同,因为Docker Hub上显示的是压缩后的大小,而下载过程中会进行解压,因此下载后的镜像尺寸更大一些。

    docker image ls中列出的镜像体积总和并非是所有镜像实际硬盘消耗,由于分层存储结构,不同镜像可能会使用相同基础镜像,因此实际占用磁盘大小比列表显示总和要小很多。

    可以通过docker system df 查看镜像、容器、数据卷所占用空间

    $ docker system df
    TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
    Images              115                 24                  13.92GB             9.966GB (71%)
    Containers          32                  27                  116.7MB             0B (0%)
    Local Volumes       14                  6                   10.19GB             436.7MB (4%)
    Build Cache
    View Code 

    5. 虚悬镜像

    有一种特殊镜像,仓库名与标签均为<none>。该镜像原本是存在镜像名和标签,随着发布新版本后,该镜像名被转移到新下载的镜像上,就镜像上的镜像名及标签则被取消,从而成为了<none>。

    镜像拉取命令docker pull与镜像构建命令docker build均可能导致这种现象。这种镜像也被成为虚悬镜像(dangling image)。

    可以使用docker image ls -f dangling=true专门显示虚悬镜像

    $ docker image ls -f dangling=true
    REPOSITORY                                               TAG                 IMAGE ID            CREATED             SIZE
    <none>                                                   <none>              b12c7031cf96        3 days ago          177MB
    <none>                                                   <none>              b170d97325c2        3 days ago          686MB
    <none>                                                   <none>              4fec837318a2        3 days ago          231MB
    <none>                                                   <none>              a4b3b3e053aa        10 days ago         177MB
    <none>                                                   <none>              7e1c59663166        2 weeks ago         191MB
    View Code 

    6. 中间层镜像

    为了加速镜像构建,重复利用资源,docker会利用中间层镜像。默认docker image ls列表只会显示顶层镜像,增加 -a 参数即可显示包括中间层镜像在内的所有镜像

    $ docker image ls -a
    REPOSITORY                                                 TAG                 IMAGE ID            CREATED             SIZE
    allinone-service                                           latest              e9a3879ed76f        3 hours ago         177MB
    <none>                                                     <none>              ba0c65b39c64        3 hours ago         177MB
    <none>                                                     <none>              423675da3624        3 hours ago         177MB
    <none>                                                     <none>              935dd95fcf8c        3 hours ago         132MB
    View Code 

    7. 列出部分镜像

    (1) 根据仓库名列出镜像:docker image ls image_name

    $ docker image ls ubuntu
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    ubuntu              16.04               2a4cca5ac898        5 days ago          111MB
    ubuntu              14.04               67759a80360c        5 weeks ago         221MB
    View Code 

    (2) 基于仓库名+标签列出镜像: docker image ls image_name:tag

    $ docker image ls ubuntu:16.04
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    ubuntu              16.04               2a4cca5ac898        5 days ago          111MB
    View Code 

    (3) docker image ls 之前 --filter过滤器参数

    如:列出mysql:latest之前(before)/后(since)构建的镜像。

    $ docker image ls -f since=mysql:latest
    REPOSITORY                                               TAG                 IMAGE ID            CREATED             SIZE
    allinone-service                                         latest              e9a3879ed76f        3 hours ago         177MB
    download_worker_test                                     latest              b5a2e88c7a66        46 hours ago        855MB
    View Code 

    (4) 如果构建镜像时,定义了LABEL,也可以通过LABEL进行过滤,如: docker image ls -f label=con.example.version=0.1

    (5) 以特定格式显示

    例:

    以镜像id进行显示:docker image ls -q ,--filter与-q结合产生指定范围的ID列表,然后作为参数传入另一个docker命令进而可以成批进行某种操作,这种做法在Dockjer中十分常见。

    (6) 有时对表格的结构不满意,希望自己组织列,可以使用Go的模板语法。

    例:

    a. 列出只包含镜像ID和仓库名:docker image ls --format "{{.ID}}: {{.Repository}}"

    b. 以表格等距显示,并且有标题行,自己定义显示列:docker image ls --format "table {{.ID}} {{.Repository}} {{.Tag}}"

    8. 使用commit理解镜像构建

    注意:不要使用commit定制镜像,定制镜像应该使用Dockerfile完成,Dockerfile会在下一节详解。

    和镜像一样,容器也是多层存储。容器以镜像为基础层,在其上加一层作为容器运行的存储层

    例:

    定制一个Web服务器,理解镜像如何构建:

    (1) 使用nginx镜像启动容器,命名为webserver,并映射80端口。命令为:docker run --name webserver -d -p 80:80 nginx。使用浏览器,输入: localhost,即可出现nginx显示界面。如下图所示:

    (2) 我们希望将该页面信息改为Docker文字,可以使用docker exec命令进入容器,修改器内容。如下命令所示:

    $ docker exec -it webserver bash
    root@9b59f2338c3a:/# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
    root@9b59f2338c3a:/# exit
    exit
    View Code

    显示信息如下:

    (3) 修改了容器的文件,可以通过docker diff命令查看具体改动。

    $ docker diff webserver
    C /var
    C /var/cache
    C /var/cache/nginx
    A /var/cache/nginx/fastcgi_temp
    A /var/cache/nginx/proxy_temp
    A /var/cache/nginx/scgi_temp
    A /var/cache/nginx/uwsgi_temp
    A /var/cache/nginx/client_temp
    C /root
    A /root/.bash_history
    C /run
    A /run/nginx.pid
    C /usr
    C /usr/share
    C /usr/share/nginx
    C /usr/share/nginx/html
    C /usr/share/nginx/html/index.html
    View Code 

    (4) 现在定制好了,希望能将其保存下来形成镜像。

    当运行容器时,且不使用卷时,任何文件修改都会被记录于容器存储层。可以使用docker commit命令将容器的存储层保存下来形成镜像。即在原有镜像基础上,再叠加容器的存储层,并构成新的镜像,以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。

    docker commit的格式为:docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]

    可以使用命令将容器保存为镜像:docker commit --author "ws<ws@qq.com>" --message "修改默认网页" webserver nginx:v2

    其中: author指定修改作者,--message记录本次修改内容。可以使用docker image ls显示新的定制镜像,使用docker history具体查看镜像内的历史记录,如:docker history nginx:v2

    (5) 镜像定制好后,可以重新运行该镜像:docker run --name web2 -d -p 81:80 nginx:v2

    注意:慎用docker commit

    因为docker commit会将大量无关的修改内容、构建内容添加进来,如果不小心清理,将会导致镜像极为臃肿,其次docker commit意味着所有对镜像的操作都是黑箱操作,生成的镜像也称为黑箱镜像,随着时间的延长,会无法清楚地记得所修改操作,即使docker diff也只会提供少许。

     

  • 相关阅读:
    collection系列用法-defaultdict()
    collection系列用法-namedtuple()
    collection系列用法-deque双向队列
    Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
    python 【第四篇】:面向对象(一)
    python之lambda表达式
    python 【第三篇】:函数及参数
    LeetCode 648. Replace Words (单词替换)
    LeetCode 953. Verifying an Alien Dictionary (验证外星语词典)
    LeetCode 970. Powerful Integers (强整数)
  • 原文地址:https://www.cnblogs.com/mengrennwpu/p/8324875.html
Copyright © 2020-2023  润新知