美文网首页
Docker 镜像操作

Docker 镜像操作

作者: 凤落溪凰落地 | 来源:发表于2018-11-02 16:38 被阅读0次

使用 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
1.png

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

2、获取镜像

镜像是运行容器的前提,官方的 Docker Hub 网站已经提供了数十万个镜像供大家开放
下载。

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

docker pull ubuntu:14.04
2.png

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

下面的例子将从 Docker Hub 的 Ubuntu 仓库下载一个最新的 Ubuntu 操作系统的镜像。

 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 命令可以列出本地主机上已有镜像的基本信息。

 docker images
3.png

在列出的信息中,可以看到以下几个字段信息。

来自于哪个仓库:比如 ubuntu 仓库用来保存 ubuntu 系列的基础镜像;

镜像的标签信息:比如 14.04、latest 用来标注不同的版本信息。标签只是标记,并不能标识镜像内容;TAG 信息用来标记来自同一个仓库的不同镜像。例如 ubuntu 仓库中有多个镜像,通过 TAG 信息来区分发行版本。

镜像的 ID(唯一标识镜像):如果镜像 ID 相同,说明实际上指向同一个镜像;在使用镜
像 ID 的时候,一般可以使用该 ID 的前若干个字符组成的可区分串来替代完整的 ID

创建时间:说明镜像最后的更新时间;

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

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

例如添加一个新的 mynginx:latest 镜像标签:

 docker tag nginx:latest mynginx:latest

查看:

 docker images
4.png

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

使用 inspect 命令查看详细信息

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

 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:

docker inspect -f {{".Architecture"}} nginx
amd64

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

docker history nginx
5.png

4、删除镜像

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

例如,要删除掉 mynginx:latest 镜像,可以使用如下命令:

 docker rmi mynginx

使用镜像 ID 删除镜像

 docker rmi 747cb2d60bbe

当使用 docker rmi 命令,并且后面跟上镜像的 ID(也可以是能进行区分的部分 ID 串前
缀)时,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。

注意,当有该镜像创建的容器存在时,镜像文件默认是无法被删除的。如果要想强行删除
镜像,可以使用-f 参数。
注意,通常并不推荐使用-f 参数来强制删除一个存在容器依赖的镜像。正确的做法是,先删除依赖该镜像的所有容器,再来删除镜像

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

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

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
touch test
 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
此时查看本地镜像列表,会发现新创建的镜像已经存在了:

6.png
我们可以再做一个 mariadb 的数据库镜像
先启动一个 centos 的容器
 docker run -it centos /bin/bash

然后在容器里面安装 mariadb-server 软件包

 yum install mariadb-server -y

当结束后,我们使用 exit 来退出,现在我们的容器已经被我们改变了
使用 docker commit 命令来提交相应的副本。

docker commit -m "add mariadb server" -a "docker li"

可以查看到相应的 mariadb 镜像

[root@docker01 ~]# docker images
7.png

2)基于本地模板导入

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

要直接导入一个镜像,可以使用 OpenVZ 提供的模板来创建,或者用其他已导出的镜像模板
来 创 建 。 OPENVZ 模 板 的 下 载 地 址 为
http://openvz.org/Download/templates/precreated

例如,
下载了 fedora-23-x86_64.tar.gz 的模板压缩包,之后使用以下命令导入:

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


8.png

相关文章

  • docker基本操作

    # docker基本操作 ## 镜像操作 ### 获取镜像 从Docker Hub搜索镜像: docker s...

  • Docker命令及实战

    常用Docker命令 docker容器信息 镜像操作 镜像搜索 镜像下载 删除镜像 容器操作 提示:对于容器的操作...

  • 大觅网

    Docker镜像操作查看镜像:docker images搜索镜像:docker search 镜像关键字拉取镜像:...

  • Docker基本操作

    1. 镜像操作 搜索镜像:docker search 镜像名 拉取镜像docker pull 镜像名docker ...

  • Docker常用命令

    镜像操作docker images 查看所有镜像docker pull <镜像名:tag> 拉取镜像 如:...

  • Docker

    [TOC] 使用 Docker 镜像 下载镜像 列出镜像 构建镜像 删除本地镜像 操作 Docker 容器 容器是...

  • docker命令

    镜像、容器基本操作 1、获取镜像docker pull 2、运行容器docker run docker run -...

  • Docker常用命令学习

    启动docker引擎 重启docker引擎 查看docker版本 docker镜像常用操作查看本地所有镜像 其中R...

  • Docker入门-常用命令

    Docker镜像操作 Docker运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker会从镜像仓库...

  • Docker常用操作命令

    镜像操作 安装镜像 镜像仓库 Docker仓库[https://hub.docker.com/]版本号在tags中...

网友评论

      本文标题:Docker 镜像操作

      本文链接:https://www.haomeiwen.com/subject/medcxqtx.html