4. 使用Docker镜像

镜像(image)是Docker三大核心概念中最为重要的,自Docker诞生之日起“镜像”就是相关社区最为热门的关键词。
Docker运行容器前需要本地存在对应的镜像,如果镜像没保存在本地,Docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器的仓库),用户也可以通过配置,使用自定义的镜像仓库。
接下来将介绍更多关于docker images的内容,包括:

  • 使用和管理本地主机上的images
  • 创建一个基础的images
  • 上传images到docker hub (公共images仓库)
  • 列出本地主机上已经存在的images
1、搜索镜像

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

  • –automated=true|false:仅显示自动创建的镜像,默认为否;
  • –no-trunc=true|false:输出信息不截断显示,默认为否;
  • -s, --stars=X:指定仅显示评价为指定星级以上的镜像,默认为0,即输出所有镜像。
    例如,搜索所有自动创建的评价为1+的带nginx关键字的镜像,默认的输出结果将按照星级评价进行排序,如下所示:
docker search --automated -s 3 nginx

在这里插入图片描述

  • NAME:镜像名称
  • DESCRIPTION:描述
  • STARS:星级,代表受欢迎程度
  • OFFICIAL:是否官方创建
  • AUTOMATED:是否自动创建
2、获取镜像

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

[root@docker01 ~]# docker pull ubuntu:14.04

在这里插入图片描述
对于Docker镜像来说,如果不显式指定TAG,则默认会选择latest标签,这会下载仓库中最新版本的镜像。下面的例子将从Docker Hub的Ubuntu仓库下载一个最新的Ubuntu操作系统的镜像。

[root@docker01 ~]# docker pull ubuntu

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

$ docker pull hub.c.163.com/public/ubuntu:14.04
3、查看镜像信息
使用images命令列出镜像

使用docker images命令可以列出本地主机上已有镜像的基本信息。
[root@docker01 ~]# docker images
在这里插入图片描述
在列出的信息中,可以看到以下几个字段信息。

  • 来自于哪个仓库:比如ubuntu仓库用来保存ubuntu系列的基础镜像;
  • 镜像的标签信息:比如14.04、latest用来标注不同的版本信息。标签只是标记,并不能标识镜像内容;TAG信息用来标记来自同一个仓库的不同镜像。例如ubuntu仓库中有多个镜像,通过TAG信息来区分发行版本。
  • 镜像的ID(唯一标识镜像):如果镜像ID相同,说明实际上指向同一个镜像;在使用镜像ID的时候,一般可以使用该ID的前若干个字符组成的可区分串来替代完整的ID
  • 创建时间:说明镜像最后的更新时间;
  • 镜像大小:优秀的镜像往往体积都较小。镜像大小信息只是表示该镜像的逻辑体积大小,实际上由于相同的镜像层本地只会存储一份,物理上占用的存储空间会小于各镜像的逻辑体积之和。
    为了方便在后续工作中使用特定镜像,还可以使用docker tag命令来为本地镜像任意添加新的标签。例如添加一个新的mynginx:latest镜像标签:
[root@docker01 devicemapper]# docker tag nginx:latest mynginx:latest
查看:
[root@docker01 devicemapper]# docker images

在这里插入图片描述
可以看到mynginx和nginx的镜像ID是一致的,它们实际上指向同一个镜像文件,只是别名不同而已。docker tag命令添加的标签实际上起到了类似链接的作用。

使用inspect命令查看详细信息

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

[root@docker01 devicemapper]# docker inspect nginx
[
    {
        "Id": "sha256:1e5ab59102ce46c277eda5ed77affaa4e3b06a59fe209fe0b05200606db3aa7a",
        "RepoTags": [
            "mynginx:latest",
            "nginx:latest"
        ],
        "RepoDigests": [
            "nginx@sha256:004ac1d5e791e705f12a17c80d7bb1e8f7f01aa7dca7deee6e65a03465392072"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2017-10-10T00:26:17.56397833Z",
        "Container": "95219599af11973e48035ec6002e8f7e6b47cbb95acc6669e47e72605a4cbb58",
        "ContainerConfig": {
            "Hostname": "95219599af11",
            "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",
                "NGINX_VERSION=1.13.5-1~stretch",
                "NJS_VERSION=1.13.5.0.1.13-1~stretch"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"nginx\" \"-g\" \"daemon off;\"]"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:4a0ecd1e8734031c4c84ceb6944b5b5acb0a07d38173ae287fefc739b047e289",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": [],
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGTERM"
        },
        "DockerVersion": "17.06.2-ce",
        "Author": "",
        "Config": {
            "Hostname": "",
            "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",
                "NGINX_VERSION=1.13.5-1~stretch",
                "NJS_VERSION=1.13.5.0.1.13-1~stretch"
            ],
            "Cmd": [
                "nginx",
                "-g",
                "daemon off;"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:4a0ecd1e8734031c4c84ceb6944b5b5acb0a07d38173ae287fefc739b047e289",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": [],
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGTERM"
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 108275923,
        "VirtualSize": 108275923,
        "GraphDriver": {
            "Data": {
                "DeviceId": "23",
                "DeviceName": "docker-253:0-34043047-49314c8b2bc11fb9c2b59e373f4c0a586fc31b9d72b86532d24a9ebdfb654fc4",
                "DeviceSize": "10737418240"
            },
            "Name": "devicemapper"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:cec7521cdf36a6d4ad8f2e92e41e3ac1b6fa6e05be07fa53cc84a63503bc5700",
                "sha256:453fc2d51e11412f191e21f29cd098cc912995076b1bbf0931f228adc33b039d",
                "sha256:a1a53f8d99b57834ca1d6370a3988d4bbd4a5235d5ff3741d0d6ecdd099872d7"
            ]
        },
        "Metadata": {
            "LastTagTime": "2017-10-23T11:36:27.794137429+08:00"
        }
    }
]

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

[root@docker01 devicemapper]# docker inspect -f {{".Architecture"}} nginx
amd64
使用history命令查看镜像历史

既然镜像文件由多个层组成,那么怎么知道各个层的内容具体是什么呢?这时候可以使用history子命令,该命令将列出各层的创建信息。
[root@docker01 devicemapper]# docker history nginx
在这里插入图片描述

4、删除镜像
使用标签删除镜像

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

[root@docker01 devicemapper]# docker rmi mynginx
Untagged: myubuntu:latest
使用镜像ID删除镜像
[root@docker01 devicemapper]# docker rmi 747cb2d60bbe

当使用docker rmi命令,并且后面跟上镜像的ID(也可以是能进行区分的部分ID串前缀)时,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。
注意,当有该镜像创建的容器存在时,镜像文件默认是无法被删除的。如果要想强行删除镜像,可以使用-f参数。注意,通常并不推荐使用-f参数来强制删除一个存在容器依赖的镜像。正确的做法是,先删除依赖该镜像的所有容器,再来删除镜像。

5、创建镜像

创建镜像的方法主要有三种:基于已有镜像的容器创建、基于本地模板导入、基于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=true:提交时暂停容器运行。
    下面将演示如何使用该命令创建一个新镜像。首先,启动一个镜像,并在其中进行修改操作,例如创建一个test文件,之后退出:
$ docker run -it ubuntu:14.04 /bin/bash
root@a925cb40b3f0:/# touch test
root@a925cb40b3f0:/# exit

记住容器的ID为a925cb40b3f0
此时该容器跟原ubuntu:14.04镜像相比,已经发生了改变,可以使用docker commit命令来提交为一个新的镜像。提交时可以使用ID或名称来指定容器:

$ docker commit -m "Added a new file" -a "Docker Newbee" a925cb40b3f0 test:0.1
9e9c814023bcffc3e67e892a235afe61b02f66a947d2747f724bd317dda02f27

顺利的话,会返回新创建的镜像的ID信息,例如9e9c814023bcffc3e67e892a235afe61b02f66a947d2747f724bd317dda02f27。
此时查看本地镜像列表,会发现新创建的镜像已经存在了:
在这里插入图片描述
我们可以再做一个mariadb的数据库镜像

先启动一个centos的容器
[root@docker01 ~]# docker run -it centos /bin/bash
[root@d0e74c7810dd /]#
然后在容器里面安装mariadb-server软件包
[root@d0e74c7810dd /]# yum install mariadb-server -y
当结束后,我们使用exit来退出,现在我们的容器已经被我们改变了
使用docker commit命令来提交相应的副本。
[root@docker01 ~]# docker commit -m "add mariadb server" -a "docker li" d0e74c7810dd mariadb:1.0
sha256:0b618ba65b672d80d48443e17891ca9a8f80d69048aae6334d4848855d40ef85

可以查看到相应的mariadb镜像
[root@docker01 ~]# docker images
在这里插入图片描述

2)基于本地模板导入

用户也可以直接从一个操作系统模板文件导入一个镜像,主要使用docker import命令。命令格式为:

docker import [OPTIONS] file|URL|-[REPOSITORY[:TAG]]

要直接导入一个镜像,可以使用OpenVZ提供的模板来创建,或者用其他已导出的镜像模板来创建。OPENVZ模板的下载地址为http://download.openvz.org/template/precreated/
例如,下载了fedora-23-x86_64.tar.gz的模板压缩包,之后使用以下命令导入:

[root@docker01 ~]# cat fedora-23-x86_64.tar.gz | docker import - fedora:23

然后查看新导入的镜像,会发现它已经在本地存在了:
在这里插入图片描述

6、存出和载入镜像

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

1)存出镜像

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

[root@docker01 ~]# docker save -o ubuntu_14.04.tar ubuntu:14.04
[root@docker01 ~]# ls -lh ubuntu_14.04.tar 
-rw------- 1 root root 189M Nov  7 15:39 ubuntu_14.04.tar
[root@docker01 ~]# 

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

2)载入镜像

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

[root@docker01 ~]# docker load --input ubuntu_14.04.tar
或者:
[root@docker01 ~]# docker load < ubuntu_14.04.tar 

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

7、上传镜像

用户可以通过docker push命令,把自己创建的镜像上传到仓库中来共享。默认上传到Docker Hub官方仓库(需要登录),官网地址:https://hub.docker.com
命令格式为:

docker push NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]
1)首先申请一个docker hub帐号

在这里插入图片描述

2)注册成功后,登录到docke hub点击一下按钮:create —> create repository ,取个名字,这里我们最终创建的仓库名称:lidnyun/kube-apiserver-amd64 ,这个lidnyun是帐号,kube-apiserver-amd64是其中一个仓库名。如图所示:

在这里插入图片描述

3)为存在于本地的镜像打标签

命令如下:

docker tag <existing-image> <hub-user>/<repo-name>[:<tag>]

这里的tag不指定就是latest。
具体样例如下:

docker tag gcr.io/google_containers/kube-apiserver-amd64:v1.5.5 lidnyun/kube-apiserver-amd64:v1.5.5
  • lidnyun是步骤一提到的账户名
  • kube-apiserver-amd64是步骤一提到的仓库名称
  • v1.5.5是tag版本。
4)在本地登录docker hub帐号

命令如下:

root@master:~# docker  login
Username: lidnyun
Password:
Email: 邮箱地址
WARNING: login credentials saved in /root/.docker/config.json
Login Succeeded
5)push镜像

命令如下:

docker push <hub-user>/<repo-name>:<tag>

具体样例如下:

root@master:~# docker push lidnyun/kube-apiserver-amd64:v1.5.5
The push refers to a repository [docker.io/lidnyun/kube-apiserver-amd64]
48ca1ee39728: Pushing [==>                                                ] 6.097 MB/124.8 MB
c0de73ac9968: Pushing [==================================================>] 1.312 MB
v1.5.5: digest: sha256:7dd91e4670b3563de04fee77c3206d84ca556ea88f95a40ee510ca2b77dc49d7 size: 739
6)可以有以下两种方式进行验证
  • A、网址方式。登录到docker hub网站,查看一下刚才创建的仓库名称,如图:
    在这里插入图片描述
  • B、命令方式。
    通过命令拉取一下镜像看看是否成功。命令如下:
    docker pull  <hub-user>/<repo-name>:<tag>
    
    具体样例如下:
    docker pull  lidnyun/kube-apiserver-amd64:v1.5.5
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值