第三章 使用Docker镜像

3.1 获取镜像

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

       获取一个Ubuntu 14.04的系统镜像

# docker pull ubuntu:14.04

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

# docker pull ubuntu

       一般来说,镜像的latest标签意味着该镜像的内容会跟踪最新的非稳定版本而发布,内容是不稳定的。

       下载过程中,可以看出,镜像文件一般由若干层(layer)组成,db9476e6d963ed这样的串是层的唯一ID(实际上完整的ID包括256比特,由64个十六进制字符组成)。使用docker pull命令下载时会获取并输出镜像的各层信息。当不同的镜像包括相同的层时,本地仅存储的一份内容,减小了需要的存储空间。

3.2 查看镜像信息

3.2.1 使用images命令列出镜像

# docker images

REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE

ubuntu1404                  nginx               0818f7ecaaa4        6 days ago          266 MB

ubuntu                      nginx               0818f7ecaaa4        6 days ago          266 MB

docker.io/httpd.v2          latest              86beaa6619c8        6 days ago          199 MB

docker.io/ubuntu            14.04               578c3e61a98c        13 days ago         223 MB

docker.io/ubuntu            latest              113a43faa138        13 days ago         81.2 MB

docker.io/httpd             latest              fb2f3851a971        7 weeks ago         178 MB

docker.io/hello-world       latest              e38bc07ac18e        2 months ago        1.85 kB

docker.io/ubuntu            15.10               9b9cb95443b5        23 months ago       137 MB

docker.io/training/webapp   latest              6fae60ef3446        3 years ago         349 MB

仓库---标签---镜像唯一ID---镜像最后更新时间----镜像大小

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

        镜像大小信息只是表示该镜像的逻辑体积大小,实际上由于相同的镜像层本地只会 一份,物理上占用的存储空间会小于各镜像的逻辑体积之和

3.2.2 使用tag命令添加镜像标签

       为了方便在后续工作中使用特定的镜像,还可用使用docker tag 命令来为本地镜像任意添加新的标签。

# docker images

REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE

docker.io/ubuntu            latest              113a43faa138        13 days ago         81.2 MB

[root@docker ~]# docker tag ubuntu:latest myubuntu:latest

# docker images

REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE

docker.io/ubuntu            latest              113a43faa138        13 days ago         81.2 MB

myubuntu                    latest              113a43faa138        13 days ago         81.2 MB

        它们实际上指向同一个镜像文件,只是别名不同而已。Docker tag命令添加的标签实际上起到了类似链接的作用。

3.2.3 使用inspect命令查看详细信息

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

[root@docker ~]# docker inspect ubuntu:nginx

[

    {

        "Id": "sha256:0818f7ecaaa4fca4d2e5e5ed624fec9af79ceee33645c9632fad11dcdc012cbb",

        "RepoTags": [

            "ubuntu1404:nginx",

            "ubuntu:nginx"

        ],

        "RepoDigests": [],

        "Parent": "sha256:d336958b792f16df44b4ae6075e6f55ab117ea6ddaefeb08c4f74bda8f87d6fa",

        "Comment": "",

        "Created": "2018-06-12T09:19:54.80279903Z",

        "Container": "a776e4cbbe2ea565df696a51cbfa9e322e45d3a28377420d50050ee417509941",

        "ContainerConfig": {

            "Hostname": "18469ba8622a",

            "Domainname": "",

            "User": "",

            "AttachStdin": false,

            "AttachStdout": false,

            "AttachStderr": false,

            "ExposedPorts": {

                "80/tcp": {}

            },

            "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) ",

                "EXPOSE 80/tcp"

            ],

            "ArgsEscaped": true,

            "Image": "sha256:d336958b792f16df44b4ae6075e6f55ab117ea6ddaefeb08c4f74bda8f87d6fa",

            "Volumes": null,

            "WorkingDir": "",

            "Entrypoint": null,

            "OnBuild": [],

            "Labels": {}

        },

        "DockerVersion": "1.13.1",

        "Author": "lxldoudou \"[email protected]\"",

        "Config": {

            "Hostname": "18469ba8622a",

            "Domainname": "",

            "User": "",

            "AttachStdin": false,

            "AttachStdout": false,

            "AttachStderr": false,

            "ExposedPorts": {

                "80/tcp": {}

            },

            "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:d336958b792f16df44b4ae6075e6f55ab117ea6ddaefeb08c4f74bda8f87d6fa",

            "Volumes": null,

            "WorkingDir": "",

            "Entrypoint": null,

            "OnBuild": [],

            "Labels": {}

        },

        "Architecture": "amd64",

        "Os": "linux",

        "Size": 265532235,

        "VirtualSize": 265532235,

        "GraphDriver": {

            "Name": "overlay2",

            "Data": {

                "LowerDir": "/var/lib/docker/overlay2/8993e0b1ebd18bb827abc3e18dd68e96d257572f07259f9c580aa06b09259bf3/diff:/var/lib/docker/overlay2/f33e06d355741adb5558c60fdac7adef4cd9a6e2d5f86b2f6f3eaf7586f59d1f/diff:/var/lib/docker/overlay2/4c802e2f96c851c1a951489d76b8499d7456f6d4b8458fa16333b8320397dd6e/diff:/var/lib/docker/overlay2/02b543fdd42c8ecd5bb1825bb0876775ed45423b644ae3e6332f930fba653fb8/diff:/var/lib/docker/overlay2/392a73552eda4ed7e529cac6ec72bc6764da8b8591fd5bf9dc209a24b9093ff3/diff:/var/lib/docker/overlay2/0a74838d6f4b494224f1c98a3b2dfecf9390e30b5fb36ae564b595ce8f70ed22/diff",

                "MergedDir": "/var/lib/docker/overlay2/8df78e6b77c0b6097417e3d42b0bb98ae378e68222c885b7333c7824790ccefe/merged",

                "UpperDir": "/var/lib/docker/overlay2/8df78e6b77c0b6097417e3d42b0bb98ae378e68222c885b7333c7824790ccefe/diff",

                "WorkDir": "/var/lib/docker/overlay2/8df78e6b77c0b6097417e3d42b0bb98ae378e68222c885b7333c7824790ccefe/work"

            }

        },

        "RootFS": {

            "Type": "layers",

            "Layers": [

                "sha256:04964fddc9461e6657e6fb372f96ca77e671871829ed453d933a03c491e70803",

                "sha256:a4aaef726d022d0d7e49c09bebf4a619d6db41bb05cc21d2f6b86d510e2cf3b3",

                "sha256:705419d10b1391753cc659618c6c76deae49e55513714025007440a65d4ed3fd",

                "sha256:6ec525dfd0603634b8e0e7eec752e43f9ab72460f0e3cf29beeba822d708851b",

                "sha256:70d93396f87f34c5b8fa4080bbf22d06cce8c05341a6b11c2e03c6d4d3959747",

                "sha256:ee843aa4be8f416db2245acf2ffad090a87af23d57e1dc10d3aba0dce9e26dcc",

                "sha256:6e0a7ef55614ad230341b4f6c0bafaae8b512ce76b0f363e5468cb60c4a9cd48"

            ]

        }

    }

]

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

[root@docker ~]# docker inspect -f {{".Architecture"}} ubuntu:nginx

amd64

[root@docker ~]# docker inspect -f {{".Author"}} ubuntu:nginx

lxldoudou "[email protected]"

3.2.4 使用history命令查看镜像历史

       既然镜像文件是由多个层 组成,那么咱们知道各个层的内容具体是什么呢?这个时候使用history子命令,该命令将列出各层的创建信息。

[root@docker ~]# docker history ubuntu:nginx

IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT

0818f7ecaaa4        6 days ago          /bin/sh -c #(nop)  EXPOSE 80/tcp                0 B                 

d336958b792f        6 days ago          /bin/sh -c apt-get install -y nginx             20.8 MB             

9ae6b6a79fb3        6 days ago          /bin/sh -c apt-get update                       21.3 MB             

8499baac2a18        6 days ago          /bin/sh -c #(nop)  MAINTAINER lxldoudou "3...   0 B                 

578c3e61a98c        13 days ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0 B                 

<missing>           13 days ago         /bin/sh -c mkdir -p /run/systemd && echo '...   7 B                 

<missing>           13 days ago         /bin/sh -c sed -i 's/^#\s*\(deb.*universe\...   2.76 kB             

<missing>           13 days ago         /bin/sh -c rm -rf /var/lib/apt/lists/*          0 B                 

<missing>           13 days ago         /bin/sh -c set -xe   && echo '#!/bin/sh' >...   195 kB              

<missing>           13 days ago         /bin/sh -c #(nop) ADD file:3c65bdbcf131852...   223 MB

可以使用--no-trunc选项来输出完整命令

[root@docker ~]# docker history ubuntu:nginx --no-trunc

3.3 搜寻镜像

       使用docker search 命令可以搜索远端仓库中共享的镜像,默认搜索官方仓库中的镜像。

       -s 指定仅显示评价为指定星级以上的镜像,默认为0,即输出所有镜像。

[root@docker ~]# docker search -s 4 nginx

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

INDEX       NAME                                                             DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED

docker.io   docker.io/nginx                                                  Official build of Nginx.                        8828      [OK]       

docker.io   docker.io/jwilder/nginx-proxy                                    Automated Nginx reverse proxy for docker c...   1348                 [OK]

docker.io   docker.io/richarvey/nginx-php-fpm                                Container running Nginx + PHP-FPM capable ...   579                  [OK]

3.4 删除镜像

3.4.1 使用标签删除镜像

        使用docker rmi 命令可以删除镜像,命令格式:Docker rmi IMAGE [IMAGE…],其中IMAGE可以为标签ID

[root@docker ~]# docker rmi myubuntu:latest

Untagged: myubuntu:latest

        当同一个镜像拥有多个标签的时候,docker rmi 命令只是删除该镜像多个标签中的指定标签而已,并不影响镜像文件。

        当镜像只剩下一个标签的时候,此时再使用docker rmi命令会彻底删除镜像。

3.4.2 使用镜像ID删除镜像

        当使用docker rmi 命令,并且后面跟上镜像ID时,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。

        当有该镜像创建的容器存在时,镜像文件默认时无法被删除的

[root@docker ~]# docker images

REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE

ubuntu1404                  nginx               0818f7ecaaa4        6 days ago          266 MB

ubuntu                      nginx               0818f7ecaaa4        6 days ago          266 MB

docker.io/httpd.v2          latest              86beaa6619c8        6 days ago          199 MB

docker.io/ubuntu            14.04               578c3e61a98c        13 days ago         223 MB

注意前两行内容,两个标签,一个镜像ID

[root@docker ~]# docker rmi ubuntu1404:nginx

Untagged: ubuntu1404:nginx

[root@docker ~]# docker rmi 0818f7ecaaa4

Untagged: ubuntu:nginx

Deleted: sha256:0818f7ecaaa4fca4d2e5e5ed624fec9af79ceee33645c9632fad11dcdc012cbb

Deleted: sha256:d336958b792f16df44b4ae6075e6f55ab117ea6ddaefeb08c4f74bda8f87d6fa

Deleted: sha256:96cc7cea02bd1c3b376fe9d9870bfaf41515b4e4473fc5434e5573732f835a6d

Deleted: sha256:9ae6b6a79fb3096e1f1857494786152ba23034184cb9a2fbca8dfdcbafc91a25

Deleted: sha256:4356847edaeeb0528bf50bdfb2d54d01a2095dcb0915564ca9ab54d1f9f15973

Deleted: sha256:8499baac2a18fb6c8d99ff3405bbd9c5be3f2f30a13b2d7b11e59fd97ac7762d

3.5 创建镜像

       创建镜像的方法主要有三种:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建。

3.5.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=true:提交时暂停容器运行。

[root@docker ~]# docker run -it ubuntu:14.04 /bin/bash

root@21af72f41ef0:/# mkdir test

root@21af72f41ef0:/# touch ./test/test.txt

root@21af72f41ef0:/# exit

记住容器的ID21af72f41ef0

[root@docker ~]# docker commit -m "Added a new file" -a "lxldoudou [email protected]" 21af72f41ef0 test:01

sha256:c00e0901125e50c5865987c40f9ed12489076d3083ae2fcce413c0d6bc404cc1

查看新建立的镜像

[root@docker ~]# docker images

REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE

test                        01                  c00e0901125e        24 seconds ago      223 MB

测试

[root@docker ~]# docker run -it test:01 /bin/bash

root@ad69de7c1892:/# ls -l test/test.txt

-rw-r--r-- 1 root root 0 Jun 19 06:12 test/test.txt

3.5.2 基于本地模板导入

       用户也可以直接从一个操作系统模板文件导入一个镜像,主要使用docker import命令。命令格式为:docker import [OPTIONS] file | url - [REPOSITORY[:TAG]]

       要直接导入一个镜像,可以使用OpenVZ提供的模板来创建,或者用其他已导出来的镜像模板来创建。

       OpenVZ模板的下载地址:https://openvz.org/Download/template/precreated

下载一个centos7的模板压缩包,之后使用以下命令导入

[root@docker ~]# wget https://download.openvz.org/template/precreated/centos-7-x86_64.tar.gz

--2018-06-19 14:28:27--  https://download.openvz.org/template/precreated/centos-7-x86_64.tar.gz

正在解析主机 download.openvz.org (download.openvz.org)... 185.231.241.69

正在连接 download.openvz.org (download.openvz.org)|185.231.241.69|:443... 已连接。

已发出 HTTP 请求,正在等待回应... 200 OK

长度:221597800 (211M) [application/x-gzip]

正在保存至: “centos-7-x86_64.tar.gz”

 

100%[================================================================================================================>] 221,597,800  234KB/s 用时 16m 41s

 

2018-06-19 14:45:14 (216 KB/s) - 已保存 “centos-7-x86_64.tar.gz” [221597800/221597800])

[root@docker ~]# cat centos-7-x86_64.tar.gz | docker import - centos:7.0

sha256:7eb9ad8c57acf6fd6743584a3e07170cd903abdf39fd37512cebdb58db01b802

[root@docker ~]# docker images

REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE

centos                      7.0                 7eb9ad8c57ac        5 seconds ago       589 MB

3.6 存出和载入镜像

3.6.1 存出镜像

        如果要导出镜像到本地文件,可以使用docker save 命令。

[root@docker ~]# docker save -o ubuntu_14.04.tar ubuntu:14.04

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

3.6.2 载入镜像

        使用docker load 将导出的tar文件再导入到本地镜像库,例如将本地的ubuntu_14.04.tar导入镜像到本地镜像列表

[root@docker ~]# ls -l

总用量 489212

……………………………………

-rw-------  1 root root 232536576 6  19 14:41 ubuntu_14.04.tar

………………………………………

 

[root@docker ~]# docker load --input ubuntu_14.04.tar

Loaded image: ubuntu:14.04

或者

[root@docker ~]# docker load < ubuntu_14.04.tar

Loaded image: ubuntu:14.04

3.7 上传镜像

       可以使用docker push 命令上传镜像到仓库,默认上次到Docker Hub官方仓库(需要登录)。命令格式:

       docker push NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT] / ] NAME[:TAG]]

[root@docker ~]# docker tag test:01 lxldoudou/test:01

[root@docker ~]# docker push lxldoudou/test:01

The push refers to a repository [docker.io/lxldoudou/test]

64fa89924107: Preparing

70d93396f87f: Preparing

6ec525dfd060: Preparing

705419d10b13: Preparing

a4aaef726d02: Preparing

04964fddc946: Waiting

       第一次上传时,提提示输入登陆信息或进行注册

 

猜你喜欢

转载自www.cnblogs.com/lingxiaolong/p/9198763.html