zoukankan      html  css  js  c++  java
  • Docker-镜像

    镜像是Docker三大核心概念中最为重要的
    Docker运行容器前需要本地存在对应的镜像,如果镜像没保存在本地,Docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也可以通过配置,使用自定义的镜像仓库

    获取镜像

    镜像是运行容器的前提,官方的Docker Hub网站已经提供了数十万个镜像供大家开放下载。
    可以使用docker pull命令直接从Docker Hub镜像源来下载镜像。该命令的格式为docker pull NAME[:TAG],其中NAME是镜像仓库的名称(用来区分镜像),TAG是镜像的标签(往往用来表示版本信息)。通常情况下,描述一个镜像需要包括“名称+标签”信息
    例如,获取一个Ubuntu 14.04系统的基础镜像可以使用如下命令

    FengZhendeMacBook-Pro:java FengZhen$ docker pull ubuntu:14.04
    14.04: Pulling from library/ubuntu
    28bfaceaff9b: Pull complete 
    ac540055f2f8: Pull complete 
    2965585ef8b8: Pull complete 
    2416bb9f3ad2: Pull complete 
    93b55a6a6807: Pull complete 
    Digest: sha256:885bb6705b01d99544ddb98cbe4e4555d1efe1d052cef90832e72a0688ac6b37
    Status: Downloaded newer image for ubuntu:14.04

    对于Docker镜像来说,如果不显式指定TAG,则默认会选择latest标签,这会下载仓库中最新版本的镜像

    注意:一般来说,镜像的latest标签意味着该镜像的内容会跟踪最新的非稳定版本而发布,内容是不稳定的,从稳定性上考虑,不要再生产环境中忽略镜像的标签信息或使用默认的latest标记的镜像。

    下载过程中可以看出,镜像文件一般由若干层(layer)组成,28bfaceaff9b这样的串是层的唯一ID,使用docker pull命令下载时会获取并输出镜像的各层信息。当不同的镜像包括相同的层时,本地仅存储一份内容,减小了需要的存储空间
    在使用不同的镜像仓库服务器的情况下,可能会出现镜像重名的情况。
    严格地讲,镜像的仓库名称中还应该添加仓库地址(即registry,注册服务器)作为前缀,我们默认使用的时Docker Hub服务,该前缀可以省略
    例如 docker pull Ubuntu:14.04相当于docker pull registry.hub.docker.com/Ubuntu:14.04
    如果从非官方仓库下载,则需要在仓库名称前指定完整的仓库地址。例如从网易蜂巢的镜像源来下载ubuntu:14.04镜像,可以使用如下命令
    docker pull hub.c.163.com/public/Ubuntu:14.04

    pull子命令支持的选项主要包括:
    -a, --all-tags=true|false:是否获取仓库中的所有镜像,默认为否
    下载镜像到本地后,即可随时使用该镜像了,例如利用该镜像创建一个容器,在其中运行bash应用
    如下

    docker run -it ubuntu:14.04 bash
    FengZhendeMacBook-Pro:java FengZhen$ docker run -it ubuntu:14.04 bash
    root@3697728743e8:/# ls
    bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

    已经是ubuntu的环境了

    查看镜像信息

    使用images命令列出镜像

    FengZhendeMacBook-Pro:java FengZhen$ docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    ubuntu 14.04 578c3e61a98c 42 hours ago 223MB
    ubuntu latest 113a43faa138 42 hours ago 81.2MB
    nginx latest cd5239a0906a 45 hours ago 109MB

    在列出的信息中,可以看到以下几个字段信息
    REPOSITORY:来自于哪个仓库,比如ubuntu仓库用来保存ubuntu系列的基础镜像
    TAG:镜像的标签信息,比如14.04、latest用来标注不同的版本信息。标签只是标记,并不能标识镜像内容
    IMAGE ID:镜像的ID(唯一标识镜像),如ubuntu:lastest和ubutu:16.04镜像的ID都是2fa927b5cdd3,说明他们目前实际上指向同一个镜像
    CREATED:创建时间,说明镜像最后的更新时间
    SIZE:镜像大小,优秀的镜像往往体积都较小
    其中镜像ID信息十分重要,它唯一标识了镜像。在使用镜像ID的时候,一般可以使用该ID的前若干个字符组成的可区分串来替代完整的ID

    使用tag命令添加镜像标签

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

    FengZhendeMacBook-Pro:java FengZhen$ docker tag ubuntu:14.04 newUbuntuTag:14.04
    Error parsing reference: "newUbuntuTag:14.04" is not a valid repository/tag: invalid reference format: repository name must be lowercase
    FengZhendeMacBook-Pro:java FengZhen$ docker tag ubuntu:14.04 newubuntutag:14.04
    
    FengZhendeMacBook-Pro:java FengZhen$ docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    newubuntutag 14.04 578c3e61a98c 42 hours ago 223MB
    ubuntu 14.04 578c3e61a98c 42 hours ago 223MB
    nginx latest cd5239a0906a 45 hours ago 109MB

    可以看到多了一个newubuntutag:14.04标签的镜像,之后就可以直接使用newubuntutag:14.04来表示这个镜像了。可以看到newubuntutag:14.04镜像的ID跟ubuntu:14.04的完全一致。他们实际上指向同一个镜像文件,只是别名不同而已。docker tag命令添加的标签实际上起到了类似链接的作用

    使用inspect命令查看镜像详细信息

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

    FengZhendeMacBook-Pro:java FengZhen$ docker inspect ubuntu:14.04
    [
    {
    "Id": "sha256:578c3e61a98cb5720e7c8fc152017be1dff373ebd72a32bbe6e328234efc8d1a",
    "RepoTags": [
    "newubuntutag:14.04",
    "ubuntu:14.04"
    ],
    "RepoDigests": [
    "ubuntu@sha256:885bb6705b01d99544ddb98cbe4e4555d1efe1d052cef90832e72a0688ac6b37"
    ],
    "Parent": "",
    "Comment": "",
    "Created": "2018-06-05T21:21:36.655541773Z",
    "Container": "c7400e9771375b0166af4a1aa294cc20d73147497224b62978d353713aa5262b",
    "ContainerConfig": {
    "Hostname": "c7400e977137",
    "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:d0cda387c3c3171ae6b7fdb9c6e14e54b43c938dd41fc1877b6ad1feac1f4bc3",
    "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:d0cda387c3c3171ae6b7fdb9c6e14e54b43c938dd41fc1877b6ad1feac1f4bc3",
    "Volumes": null,
    "WorkingDir": "",
    "Entrypoint": null,
    "OnBuild": null,
    "Labels": null
    },
    "Architecture": "amd64",
    "Os": "linux",
    "Size": 223367926,
    "VirtualSize": 223367926,
    "GraphDriver": {
    "Data": {
    "LowerDir": "/var/lib/docker/overlay2/95cf58ea97eb479f7942aeeb6a620cf4b1bd1019dfb5d17b0aaa20d5a398d34f/diff:/var/lib/docker/overlay2/90dec2408941a6d7cc4aadb0774510121cf927f07dfa81c3e3f187b8f80c4c6a/diff:/var/lib/docker/overlay2/e6041ed1c1580124e891f0928f5cad622d62f21748c4fb1332aad03ec8bcdaab/diff:/var/lib/docker/overlay2/6076cfa18569a9e4520e9b7881eb3af355223058af3fad8a6fdb6c4cab2b067b/diff",
    "MergedDir": "/var/lib/docker/overlay2/a00109e35bee4e450a0fcfff9e656ae6d2a1ab7d29d8d3afd3e27c11792e3376/merged",
    "UpperDir": "/var/lib/docker/overlay2/a00109e35bee4e450a0fcfff9e656ae6d2a1ab7d29d8d3afd3e27c11792e3376/diff",
    "WorkDir": "/var/lib/docker/overlay2/a00109e35bee4e450a0fcfff9e656ae6d2a1ab7d29d8d3afd3e27c11792e3376/work"
    },
    "Name": "overlay2"
    },
    "RootFS": {
    "Type": "layers",
    "Layers": [
    "sha256:04964fddc9461e6657e6fb372f96ca77e671871829ed453d933a03c491e70803",
    "sha256:a4aaef726d022d0d7e49c09bebf4a619d6db41bb05cc21d2f6b86d510e2cf3b3",
    "sha256:705419d10b1391753cc659618c6c76deae49e55513714025007440a65d4ed3fd",
    "sha256:6ec525dfd0603634b8e0e7eec752e43f9ab72460f0e3cf29beeba822d708851b",
    "sha256:70d93396f87f34c5b8fa4080bbf22d06cce8c05341a6b11c2e03c6d4d3959747"
    ]
    },
    "Metadata": {
    "LastTagTime": "2018-06-07T14:52:11.7728708Z"
    }
    }
    ]

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

    FengZhendeMacBook-Pro:java FengZhen$ docker inspect -f {{".Architecture"}} ubuntu:14.04
    amd64

    使用history命令查看镜像历史
    使用history子命令,可以列出各层的创建信息

    FengZhendeMacBook-Pro:java FengZhen$ docker history ubuntu:14.04
    IMAGE CREATED CREATED BY SIZE COMMENT
    578c3e61a98c 42 hours ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B 
    <missing> 42 hours ago /bin/sh -c mkdir -p /run/systemd && echo 'do… 7B 
    <missing> 42 hours ago /bin/sh -c sed -i 's/^#s*(deb.*universe)$… 2.76kB 
    <missing> 42 hours ago /bin/sh -c rm -rf /var/lib/apt/lists/* 0B 
    <missing> 42 hours ago /bin/sh -c set -xe && echo '#!/bin/sh' > /… 195kB 
    <missing> 42 hours ago /bin/sh -c #(nop) ADD file:3c65bdbcf1318520e… 223MB

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

    FengZhendeMacBook-Pro:java FengZhen$ docker history --no-trunc=true ubuntu:14.04
    IMAGE CREATED CREATED BY SIZE COMMENT
    sha256:578c3e61a98cb5720e7c8fc152017be1dff373ebd72a32bbe6e328234efc8d1a 42 hours ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B 
    <missing> 42 hours ago /bin/sh -c mkdir -p /run/systemd && echo 'docker' > /run/systemd/container 7B 
    <missing> 42 hours ago /bin/sh -c sed -i 's/^#s*(deb.*universe)$/1/g' /etc/apt/sources.list 2.76kB 
    <missing> 42 hours ago /bin/sh -c rm -rf /var/lib/apt/lists/* 0B 
    <missing> 42 hours ago /bin/sh -c set -xe && echo '#!/bin/sh' > /usr/sbin/policy-rc.d && echo 'exit 101' >> /usr/sbin/policy-rc.d && chmod +x /usr/sbin/policy-rc.d && dpkg-divert --local --rename --add /sbin/initctl && cp -a /usr/sbin/policy-rc.d /sbin/initctl && sed -i 's/^exit.*/exit 0/' /sbin/initctl && echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup && echo 'DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' > /etc/apt/apt.conf.d/docker-clean && echo 'APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' >> /etc/apt/apt.conf.d/docker-clean && echo 'Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";' >> /etc/apt/apt.conf.d/docker-clean && echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/docker-no-languages && echo 'Acquire::GzipIndexes "true"; Acquire::CompressionTypes::Order:: "gz";' > /etc/apt/apt.conf.d/docker-gzip-indexes && echo 'Apt::AutoRemove::SuggestsImportant "false";' > /etc/apt/apt.conf.d/docker-autoremove-suggests 195kB 
    <missing> 42 hours ago /bin/sh -c #(nop) ADD file:3c65bdbcf1318520e7af157cb00317c8312ec16bcaf181d0db919c45f0d7a85e in / 223MB

    搜寻镜像

    使用docker search 命令可以搜索远程仓库中共享的镜像,默认搜索官方仓库中的镜像。用法为docker search TERM,支持的参数主要包括
    --automated=true|false:仅显示自动创建的镜像,默认为否
    --no-trunc=true|false:输出信息不截断显示,默认为否
    -s, --stars=X:指定仅显示评价为指定星级以上的镜像,默认为0,即输出所有镜像
    例如,搜索所有自动创建的评价为3+的带nginx关键字的镜像,如下

    FengZhendeMacBook-Pro:java FengZhen$ docker search --automated -s 3 nginx
    Flag --automated has been deprecated, use --filter=is-automated=true instead
    Flag --stars has been deprecated, use --filter=stars=3 instead
    NAME DESCRIPTION STARS OFFICIAL AUTOMATED
    jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1343 [OK]
    richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 547 [OK]
    jrcs/letsencrypt-nginx-proxy-companion LetsEncrypt container to use with nginx as p… 375 [OK]
    webdevops/php-nginx Nginx with PHP-FPM 104 [OK]
    bitnami/nginx Bitnami nginx Docker Image 53 [OK]
    zabbix/zabbix-web-nginx-mysql Zabbix frontend based on Nginx web-server wi… 52 [OK]
    1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5 ubuntu-16-nginx-php-phpmyadmin-mysql-5 35 [OK]
    tobi312/rpi-nginx NGINX on Raspberry Pi / armhf 19 [OK]
    blacklabelops/nginx Dockerized Nginx Reverse Proxy Server. 9 [OK]
    wodby/drupal-nginx Nginx for Drupal container image 9 [OK]
    webdevops/nginx Nginx container 8 [OK]
    nginxdemos/hello NGINX webserver that serves a simple page co… 6 [OK]
    1science/nginx Nginx Docker images that include Consul Temp… 4 [OK]

    可看到提示

    Flag --automated has been deprecated, use --filter=is-automated=true instead
    Flag --stars has been deprecated, use --filter=stars=3 instead
    

    --automated不提倡使用,建议使用--filter=is-automated=true代替
    -s建议使用--filter=stars=3代替
    如下

    FengZhendeMacBook-Pro:java FengZhen$ docker search nginx --filter=stars=3 --filter=is-automated=true
    NAME DESCRIPTION STARS OFFICIAL AUTOMATED
    jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1344 [OK]
    richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 547 [OK]
    jrcs/letsencrypt-nginx-proxy-companion LetsEncrypt container to use with nginx as p… 375 [OK]
    webdevops/php-nginx Nginx with PHP-FPM 105 [OK]
    bitnami/nginx Bitnami nginx Docker Image 53 [OK]
    zabbix/zabbix-web-nginx-mysql Zabbix frontend based on Nginx web-server wi… 52 [OK]
    1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5 ubuntu-16-nginx-php-phpmyadmin-mysql-5 35 [OK]
    tobi312/rpi-nginx NGINX on Raspberry Pi / armhf 19 [OK]
    wodby/drupal-nginx Nginx for Drupal container image 9 [OK]
    blacklabelops/nginx Dockerized Nginx Reverse Proxy Server. 9 [OK]
    webdevops/nginx Nginx container 8 [OK]
    1science/nginx Nginx Docker images that include Consul Temp… 4 [OK]

    可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、星级(表示该镜像的受欢迎程度)、是否官方创建、是否自动创建等,默认的输出结果将按照星级评价进行排序。

    FengZhendeMacBook-Pro:java FengZhen$ docker search nginx --filter=stars=3
    NAME DESCRIPTION STARS OFFICIAL AUTOMATED
    nginx Official build of Nginx. 8745 [OK] 
    jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1344 [OK]
    richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 547 [OK]
    jrcs/letsencrypt-nginx-proxy-companion LetsEncrypt container to use with nginx as p… 375 [OK]
    kong Open-source Microservice & API Management la… 192 [OK] 
    webdevops/php-nginx Nginx with PHP-FPM 105 [OK]
    kitematic/hello-world-nginx A light-weight nginx container that demonstr… 99 
    bitnami/nginx Bitnami nginx Docker Image 53 [OK]
    zabbix/zabbix-web-nginx-mysql Zabbix frontend based on Nginx web-server wi… 52 [OK]
    linuxserver/nginx An Nginx container, brought to you by LinuxS… 35 
    1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5 ubuntu-16-nginx-php-phpmyadmin-mysql-5 35 [OK]
    tobi312/rpi-nginx NGINX on Raspberry Pi / armhf 19 [OK]
    nginxdemos/nginx-ingress NGINX Ingress Controller for Kubernetes . Th… 11 
    wodby/drupal-nginx Nginx for Drupal container image 9 [OK]
    blacklabelops/nginx Dockerized Nginx Reverse Proxy Server. 9 [OK]
    webdevops/nginx Nginx container 8 [OK]
    centos/nginx-18-centos7 Platform for running nginx 1.8 or building n… 6 
    1science/nginx Nginx Docker images that include Consul Temp… 4 [OK]
    centos/nginx-112-centos7 Platform for running nginx 1.12 or building … 3

    删除镜像

    使用标签删除镜像
    使用docker rmi命令可以删除镜像,命令格式为docker rmi IMAGE [IMAGE..],其中IMAGE可以为标签或ID
    例如,要删除掉newubuntutag:14.04镜像,可以使用如下命令

    FengZhendeMacBook-Pro:java FengZhen$ docker rmi newubuntutag:14.04
    Untagged: newubuntutag:14.04

    当同一个镜像拥有多个标签的时候,docker rmi命令只是删除该镜像多个标签中的指定标签而已,并不影响镜像文件。因此上述操作相当于只是删除了镜像578c3e61a98c的一个标签而已。
    再次查看本地镜像,发现ubuntu:14.04的镜像还是存在的

    FengZhendeMacBook-Pro:java FengZhen$ docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    ubuntu 14.04 578c3e61a98c 3 days ago 223MB
    ubuntu latest 113a43faa138 3 days ago 81.2MB
    nginx latest cd5239a0906a 3 days ago 109MB

    但当镜像只剩下一个标签的时候,使用docker rmi命令就会彻底删除镜像
    例如删除ubuntu:latest的镜像,由于该镜像没有额外的标签指向它,执行docker rmi命令,可以看出它会删除这个镜像文件的所有层

    FengZhendeMacBook-Pro:java FengZhen$ docker rmi ubuntu:latest
    Untagged: ubuntu:latest
    Untagged: ubuntu@sha256:5f4bdc3467537cbbe563e80db2c3ec95d548a9145d64453b06939c4592d67b6d
    Deleted: sha256:113a43faa1382a7404681f1b9af2f0d70b182c569aab71db497e33fa59ed87e6
    Deleted: sha256:a9fa410a3f1704cd9061a802b6ca6e50a0df183cb10644a3ec4cac9f6421677a
    Deleted: sha256:b21f75f60422609fa79f241bf80044e6e133dd0662851afb12dacd22d199233a
    Deleted: sha256:038d2d2aa4fb988c06f04e3af208cc0c1dbd9703aa04905ade206d783e7bc06a
    Deleted: sha256:b904d425ea85240d6af5a6c6f145e05d5e0127f547f8eb4f68552962df846e81
    Deleted: sha256:db9476e6d963ed2b6042abef1c354223148cdcdbd6c7416c71a019ebcaea0edb

    使用镜像ID删除镜像
    当使用docker rmi命令,并且后面跟上镜像ID(也可以是能进行区分部分ID串前缀)时,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。
    注意,当有该镜像创建的容器存在时,镜像文件默认是无法被删除的,例如,先利用ubuntu:14.04镜像创建一个简单的容器来输出一段话
    FengZhendeMacBook-Pro:java FengZhen$ docker run ubuntu:14.04 echo 'hello! docker,i am here'
    hello! docker,i am here
    使用docker ps –a 命令可以看到本机上存在的所有容器

    FengZhendeMacBook-Pro:java FengZhen$ docker ps -a
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    71ec56c543c4 ubuntu:14.04 "echo 'hello! docker…" About a minute ago Exited (0) About a minute ago ecstatic_gates
    

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

    FengZhendeMacBook-Pro:java FengZhen$ docker rmi ubuntu:14.04
    Error response from daemon: conflict: unable to remove repository reference "ubuntu:14.04" (must force) - container 3697728743e8 is using its referenced image 578c3e61a98c
    

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

    FengZhendeMacBook-Pro:java FengZhen$ docker rmi -f ubuntu:14.04
    Untagged: ubuntu:14.04
    Untagged: ubuntu@sha256:885bb6705b01d99544ddb98cbe4e4555d1efe1d052cef90832e72a0688ac6b37
    Deleted: sha256:578c3e61a98cb5720e7c8fc152017be1dff373ebd72a32bbe6e328234efc8d1a

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

    FengZhendeMacBook-Pro:java FengZhen$ docker rm 71ec56c543c4
    71ec56c543c4
    

    再使用ID来删除镜像,此时会正常打印出删除的各层信息

    FengZhendeMacBook-Pro:java FengZhen$ docker rmi 578c3e61a98c
    Untagged: ubuntu:14.04
    Untagged: ubuntu@sha256:885bb6705b01d99544ddb98cbe4e4555d1efe1d052cef90832e72a0688ac6b37
    Deleted: sha256:578c3e61a98cb5720e7c8fc152017be1dff373ebd72a32bbe6e328234efc8d1a
    Deleted: sha256:520e4d96640a482cd5c5be5f42e2941d2d6001262be2e5916420639ed1d4e288
    Deleted: sha256:603f8df1d8f7ccc2850f6147923eeb147f5bf5990382955aa19ce9d4fdc7faae
    Deleted: sha256:701ca6996674b5523da7961585844506ff4eaa30efe40a5421b41473fa190aa1
    Deleted: sha256:2278559b727b2777bc71de91abe6f78a330b402cd0c07f77fe9751745ba28ec1
    Deleted: sha256:04964fddc9461e6657e6fb372f96ca77e671871829ed453d933a03c491e70803

    创建镜像

    创建镜像的方法主要有三种
    1. 基于已有镜像的容器创建
    2. 基于本地模板导入
    3. 基于Dockerfile创建

    基于已有镜像的容器创建
    该方法主要是使用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=true: 提交时暂停容器运行
    演示如何使用该命令创建一个新镜像。首先启动一个镜像,并在其中进行修改操作,例如创建一个test文件,之后退出

    FengZhendeMacBook-Pro:java FengZhen$ docker run -it ubuntu:14.04 /bin/bash
    root@de56c2499e0f:/# touch test
    root@de56c2499e0f:/# ls
    bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test tmp usr var
    root@de56c2499e0f:/# exit
    exit
    

    此容器ID为de56c2499e0f
    此时该容器跟原ubuntu14.04镜像相比,已经发生了改变,可以使用docker commit命令来提交为一个新的镜像。提交时可以使用ID或名称来指定容器
    FengZhendeMacBook-Pro:java FengZhen$ docker commit -m "Added a new file" -a "Docker FengZhen" de56c2499e0f test:0.1
    sha256:3f520588bfe80d30c5964c07bba702bf67b2cc3cd9db1464992b7f474a2c558e
    顺利的话,会返回新创建的镜像的ID,例如3f520588bfe80d30c5964c07bba702bf67b2cc3cd9db1464992b7f474a2c558e
    此时查看镜像列表,会发现新创建的镜像已经存在了。

    FengZhendeMacBook-Pro:java FengZhen$ docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    test 0.1 3f520588bfe8 59 seconds ago 223MB
    ubuntu 14.04 578c3e61a98c 3 days ago 223MB
    nginx latest cd5239a0906a 3 days ago 109MB

    启动新镜像,会发现存在该test文件。

    FengZhendeMacBook-Pro:java FengZhen$ docker run -it test:0.1 /bin/bash
    root@932e7ddfe656:/# ls
    bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test tmp usr var

    基于本地模板导入

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

    FengZhendeMacBook-Pro:java FengZhen$ cat /Users/FengZhen/Downloads/ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04
    sha256:9b485381ee643d26cc1bd53f47d75feb60740a57edb1b91a6f1cd2a89b7c12ec
    
    FengZhendeMacBook-Pro:java FengZhen$ docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    ubuntu 14.04 9b485381ee64 6 seconds ago 215MB
    test 0.1 3f520588bfe8 17 minutes ago 223MB
    ubuntu <none> 578c3e61a98c 3 days ago 223MB
    nginx latest cd5239a0906a 3 days ago 109MB

    发现会把之前的版本TAG覆盖掉
    修改下,先将新导入的镜像删除

    FengZhendeMacBook-Pro:java FengZhen$ docker rmi ubuntu:14.04
    Untagged: ubuntu:14.04

    重命名
    docker tag 578c3e61a98c ubuntu:14.04
    重新导入

    FengZhendeMacBook-Pro:java FengZhen$ cat /Users/FengZhen/Downloads/ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu-mini:14.04
    sha256:93d765cbffc3270af003f3d192a3b53833acd53bf4063a4a57c670c2e774cd6e
    

    也可以直接将新导入的重命名
    如果本地镜像存在多个镜像标签,比如

    FengZhendeMacBook-Pro:java FengZhen$ docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    ubuntu-mini 14.04 93d765cbffc3 About a minute ago 215MB
    test 0.1 3f520588bfe8 22 minutes ago 223MB
    ubuntu-new 14.04 578c3e61a98c 3 days ago 223MB
    ubuntu 14.04 578c3e61a98c 3 days ago 223MB
    nginx latest cd5239a0906a 3 days ago 109MB
    

    存在ubuntu:14.04和ubuntu-new:14.04,ubuntu-new:14.04是通过tag命令新建的镜像标签docker tag ubuntu:14.04 ubuntu-new:14.04
    此时如果使用tag对指定的镜像ID进行仓库:TAG重命名,会再新建一个镜像标签
    FengZhendeMacBook-Pro:java FengZhen$ docker tag 578c3e61a98c ubuntu-edit:14.04
    FengZhendeMacBook-Pro:java FengZhen$ docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    ubuntu-mini 14.04 93d765cbffc3 2 minutes ago 215MB
    test 0.1 3f520588bfe8 23 minutes ago 223MB
    ubuntu-edit 14.04 578c3e61a98c 3 days ago 223MB
    ubuntu-new 14.04 578c3e61a98c 3 days ago 223MB
    ubuntu 14.04 578c3e61a98c 3 days ago 223MB
    nginx latest cd5239a0906a 3 days ago 109MB
    会发现多了一个ubuntu-edit:14.04镜像标签

    存出或载入镜像

    用户可以使用docker save 和 docker load命令来存出和载入镜像
    存出镜像
    如果要导出镜像到本地文件,可以使用docker save命令。例如,导出本地的ubuntu:14.04镜像为文件ubuntu_14.04.tar,如下

    FengZhendeMacBook-Pro:java FengZhen$ docker save -o ubuntu_14.04.tar ubuntu:14.04
    

    之后就可以通过复制ubuntu_14.04.tar文件将镜像分享给他人
    载入镜像
    可以使用docker load将导出的tar文件再导入到本地镜像库,例如从文件ubuntu_14.04.tar导入镜像到本地镜像列表,如下
    先将本地标签为ubuntu:14.04的镜像标签删除

    FengZhendeMacBook-Pro:java FengZhen$ docker rmi ubuntu:14.04
    Untagged: ubuntu:14.04
    Untagged: ubuntu@sha256:885bb6705b01d99544ddb98cbe4e4555d1efe1d052cef90832e72a0688ac6b37
    

    载入

    FengZhendeMacBook-Pro:java FengZhen$ docker load --input ubuntu_14.04.tar 
    Loaded image: ubuntu:14.04
    

    查看本地镜像

    FengZhendeMacBook-Pro:java FengZhen$ docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    ubuntu-mini 14.04 93d765cbffc3 16 minutes ago 215MB
    test 0.1 3f520588bfe8 37 minutes ago 223MB
    ubuntu-edit 14.04 578c3e61a98c 3 days ago 223MB
    ubuntu-new 14.04 578c3e61a98c 3 days ago 223MB
    ubuntu 14.04 578c3e61a98c 3 days ago 223MB
    nginx latest cd5239a0906a 3 days ago 109MB

    发现已经导入成功。
    导入也可以使用
    docker load < ubuntu_14.04.tar

    上传镜像

    可以使用docker push命令上传镜像到仓库,默认上传到Docker Hub官方仓库(需要登录)。命令格式如下
    docker push NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]
    用户在Docker Hub网站注册后可以上传自制的镜像。例如用户user上传本地的test:latest镜像,可以先添加新的标签user/test:latest,然后用docker push 命令上传镜像

    docker tag test:latest user/test:latest
    docker push user/test:latest
    FengZhendeMacBook-Pro:java FengZhen$ docker tag nginx:latest fengzhen/nginx:latest
    FengZhendeMacBook-Pro:java FengZhen$ docker push fengzhen/nginx:latest
    The push refers to repository [docker.io/fengzhen/nginx]
    3ff93588120e: Preparing 
    24ee0a3fd4b9: Preparing 
    d626a8ad97a1: Preparing
    

      

  • 相关阅读:
    NVIDIA GTC照片
    渲染农场云云
    Visual Studio 2008 SP1键盘F10单步调试超慢解决方法
    跨DLL操作fopen的返回值导致出错
    OSL LLVM 3.3 Related Changes
    Windows上编译OpenShadingLanguage
    Windows上编译OpenImageIO
    Windows上编译LLVM 3.2
    Windows上编译OpenEXR
    Windows上编译libtiff
  • 原文地址:https://www.cnblogs.com/EnzoDin/p/9169333.html
Copyright © 2011-2022 走看看