Docker学习笔记之从镜像仓库获得镜像
0x00 概述
之前我们说到了,Docker 与其他虚拟化软件的一处不同就是将镜像管理纳入到了功能之中。实现虚拟化只是程序能够无缝移植的一部分,而有了镜像管理,就真正取代了我们在移植过程中的繁琐操作。利用 Docker 的镜像管理功能,我们可以很方便的通过网络传输和分享镜像,并保障镜像内容的一致性。所以,了解 Docker 的镜像管理方法可以算是掌握 Docker 的第一步。
0x01 镜像仓库
在之前的小节里,我们已经提到过 Docker 里集中存放镜像的一个概念,也就是镜像仓库。
如果说我们把镜像的结构用 Git 项目的结构做类比,那么镜像仓库就可以看似 GitLab、GitHub 等的托管平台,只不过 Docker 的镜像仓库托管的不是代码项目,而是镜像。
当然,存储镜像并不是镜像仓库最值得炫耀的功能,其最大的作用是实现了 Docker 镜像的分发。借助镜像仓库,我们得到了一个镜像的中转站,我们可以将开发环境上所使用的镜像推送至镜像仓库,并在测试或生产环境上拉取到它们,而这个过程仅需要几个命令,甚至自动化完成。
0x02 获取镜像
虽然有很多种方式将镜像引入到 Docker 之中,但我们最为常用的获取现有镜像的方式还是直接从镜像仓库中拉取,因为这种方式简单、快速、有保障。
要拉取镜像,我们可以使用 docker pull
命令,命令的参数就是我们之前所提到的镜像仓库名。
$ sudo docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
124c757242f8: Downloading [===============================================> ] .19MB/.76MB
9d866f8bde2a: Download complete
fa3f2f277e67: Download complete
398d32b153e8: Download complete
afde35469481: Download complete
当我们运行这个命令后,Docker 就会开始从镜像仓库中拉取我们所指定的镜像了,在控制台中,我们可以看到镜像拉取的进度。下载进度会分为几行,其实每一行代表的就是一个镜像层。Docker 首先会拉取镜像所基于的所有镜像层,之后再单独拉取每一个镜像层并组合成这个镜像。当然,如果在本地已经存在相同的镜像层 ( 共享于其他的镜像 ),那么 Docker 就直接略过这个镜像层的拉取而直接采用本地的内容。
上面是一个拉取官方镜像并且没有给出镜像标签的例子,大家注意到,当我们没有提供镜像标签时,Docker 会默认使用 latest 这个标签,这个我们在之前的小节中提到过,就不在赘述了。
当然,我们也能够使用完整的镜像命名来拉取镜像。
$ sudo docker pull openresty/openresty:1.13.6.2-alpine
1.13.6.2-alpine: Pulling from openresty/openresty
ff3a5c916c92: Pull complete
ede0a2a1012b: Pull complete
0e0a11843023: Pull complete
246b2c6f4992: Pull complete
Digest: sha256:23ff32a1e7d5a10824ab44b24a0daf86c2df1426defe8b162d8376079a548bf2
Status: Downloaded newer image for openresty/openresty:1.13.6.2-alpine
镜像在被拉取之后,就存放到了本地,接受当前这个 Docker 实例管理了,我们可以通过 docker images
命令看到它们。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest cd6d8154f1e1 days ago .1MB
openresty/openresty 1.13.6.2-alpine 08d5c926e4b6 months ago .3MB
0x03 Docker Hub
既然说到镜像仓库,就不得不提 Docker Hub 了。Docker Hub 是 Docker 官方建立的中央镜像仓库,除了普通镜像仓库的功能外,它内部还有更加细致的权限管理,支持构建钩子和自动构建,并且有一套精致的 Web 操作页面。
Docker Hub 的地址是:hub.docker.com/
由于定位是 Docker 的中央镜像仓库系统,同时也是 Docker Engine 的默认镜像仓库,所以 Docker Hub 是开发者共享镜像的首选,那么也就意味着其中的镜像足够丰富。
常用服务软件的镜像,我们都能在 Docker Hub 中找到,甚至能找到针对它们不同用法的不同镜像。
同时,Docker Hub 也允许我们将我们制作好的镜像上传到其中,与广大 Docker 用户共享你的成果。
0x04 搜索镜像
由于 Docker Hub 提供了一套完整的 Web 操作界面,所以我们搜索其中的镜像会非常方便。
在上方的搜索条中输入镜像的关键词,回车搜索我们就可以看到镜像搜索的结果了。
在 Docker Hub 的搜索结果中,有几项关键的信息有助于我们选择合适的镜像:
- OFFICIAL 代表镜像为 Docker 官方提供和维护,相对来说稳定性和安全性较高
- STARS 代表镜像的关注人数,这类似 GitHub 的 Stars,可以理解为热度
- PULLS 代表镜像被拉取的次数,基本上能够表示镜像被使用的频度
当然,关于镜像更多的信息我们可以在 DETAILS 中看到,这其中通常还包括了每个镜像不同的使用方法。具体如何阅读这些使用说明,我们会在之后的小节里专门介绍。
除了直接通过 Docker Hub 网站搜索镜像这种方式外,我们还可以用 docker CLI 中的 docker search
这个命令搜索 Docker Hub 中的镜像。
$ sudo docker search ubuntu
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating sys… [OK]
dorowu/ubuntu-desktop-lxde-vnc Ubuntu with openssh-server and NoVNC [OK]
rastasheep/ubuntu-sshd Dockerized SSH service, built on top of offi… [OK]
consol/ubuntu-xfce-vnc Ubuntu container with "headless" VNC session… [OK]
ansible/ubuntu14.-ansible Ubuntu 14.04 LTS with ansible [OK]
ubuntu-upstart Upstart is an event-based replacement for th… [OK]
neurodebian NeuroDebian provides neuroscience research s… [OK]
## ......
使用 docker search
命令,我们可以得到一个类似于 Docker Hub 网页版搜索的镜像列表结果,其中的信息与网页版也是类似的。通过这种方式我们可以在不方便访问 Web 的环境下搜索镜像,对于控制台爱好者来说也是一种不错的选择。
0x05 管理镜像
对镜像的管理要比搜索和获取镜像更常用,所以了解镜像管理相关的操作以及知识是非常有必要的。
除了之前我们所提到的 docker images
可以列出本地 Docker 中的所有镜像外,如果我们要获得镜像更详细的信息,我们可以通过 docker inspect
这个命令。
$ sudo docker inspect redis:3.2
[
{
"Id": "sha256:2fef532eadb328740479f93b4a1b7595d412b9105ca8face42d3245485c39ddc",
"RepoTags": [
"redis:3.2"
],
"RepoDigests": [
"redis@sha256:745bdd82bad441a666ee4c23adb7a4c8fac4b564a1c7ac4454aa81e91057d977"
],
## ......
}
]
在 docker inspect
的结果中我们可以看到关于镜像相当完备的信息,由于条目分类比较多,这里我就不一一罗列展开了。
除了能够查看镜像的信息外,docker inspect
还能查看容器等之前我们所提到的 Docker 对象的信息,而传参的方式除了传递镜像或容器的名称外,还可以传入镜像 ID 或容器 ID。
$ sudo docker inspect redis:4.0
$ sudo docker inspect 2fef532e
0x06 参数识别
细心的读者在这里一定发现了一个细节,之前我们所谈到镜像 ID 是 64 个字符,而 docker images
命令里的缩写也有 12 个字符,为什么我这里展示的操作命令里只填写了 8 个字符呢?
这就有必要专门说说 Docker 所支持的这种传参方式了。
不论我们是通过镜像名还是镜像 ID 传递到 docker inspect
或者其他类似的命令 ( 需要指定 Docker 对象的命令 ) 里,Docker 都会根据我们传入的内容去寻找与之匹配的内容,只要我们所给出的内容能够找出唯一的镜像,那么 Docker 就会对这个镜像执行给定的操作。反之,如果找不到唯一的镜像,那么操作不会进行,Docker 也会显示错误。
也就是说,只要我们提供了能够唯一识别镜像或容器的信息,即使它短到只有 1 个字符,Docker 都是可以处理的。
例如我们有五个镜像:
REPOSITORY TAG IMAGE ID CREATED SIZE
php -fpm f214b5c48a25 days ago 368MB
ubuntu latest cd6d8154f1e1 days ago .1MB
redis 3.2 2fef532eadb3 days ago 76MB
redis 4.0 e1a73233e3be days ago .4MB
openresty/openresty 1.13.6.2-alpine 08d5c926e4b6 months ago .3MB
cogset/cron latest c01d5ac6fc8a months ago 125MB
我们注意到镜像 ID 前缀为 2 的只有 redis:3.2 这个镜像,那么我们就可以使用 2 来指代这个镜像。
$ sudo docker inspect
而前缀为 c 的镜像有两个,这时候如果我们直接使用 c 来指代镜像的话,Docker 会提示未能匹配到镜像。
$ sudo docker inspect c
[]
Error: No such object: c
0x07 删除镜像
虽然 Docker 镜像占用的空间比较小,但日渐冗杂的镜像和凌乱的镜像版本会让管理越来越困难,所以有时候我们需要清理一些无用的镜像,将它们从本地的 Docker Engine 中移除。
删除镜像的命令是 docker rmi
,参数是镜像的名称或 ID。
$ sudo docker rmi ubuntu:latest
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:de774a3145f7ca4f0bd144c7d4ffb2931e06634f11529653b23eba85aef8e378
Deleted: sha256:cd6d8154f1e16e38493c3c2798977c5e142be5e5d41403ca89883840c6d51762
Deleted: sha256:2416e906f135eea2d08b4a8a8ae539328482eacb6cf39100f7c8f99e98a78d84
Deleted: sha256:7f8291c73f3ecc4dc9317076ad01a567dd44510e789242368cd061c709e0e36d
Deleted: sha256:4b3d88bd6e729deea28b2390d1ddfdbfa3db603160a1129f06f85f26e7bcf4a2
Deleted: sha256:f51700a4e396a235cee37249ffc260cdbeb33268225eb8f7345970f5ae309312
Deleted: sha256:a30b835850bfd4c7e9495edf7085cedfad918219227c7157ff71e8afe2661f63
删除镜像的过程其实是删除镜像内的镜像层,在删除镜像命令打印的结果里,我们可以看到被删除的镜像层以及它们的 ID。当然,如果存在两个镜像共用一个镜像层的情况,你也不需要担心 Docker 会删除被共享的那部分镜像层,只有当镜像层只被当前被删除的镜像所引用时,Docker 才会将它们从硬盘空间中移除。
docker rmi
命令也支持同时删除多个镜像,只需要通过空格传递多个镜像 ID 或镜像名即可。
$ sudo docker rmi redis:3.2 redis:4.0
Untagged: redis:3.2
Untagged: redis@sha256:745bdd82bad441a666ee4c23adb7a4c8fac4b564a1c7ac4454aa81e91057d977
Deleted: sha256:2fef532eadb328740479f93b4a1b7595d412b9105ca8face42d3245485c39ddc
## ......
Untagged: redis:4.0
Untagged: redis@sha256:b77926b30ca2f126431e4c2055efcf2891ebd4b4c4a86a53cf85ec3d4c98a4c9
Deleted: sha256:e1a73233e3beffea70442fc2cfae2c2bab0f657c3eebb3bdec1e84b6cc778b75
## ......
Docker学习笔记之从镜像仓库获得镜像的更多相关文章
- docker学习笔记(2)- 仓库
Docker仓库是镜像存储.分发.部署的关键,制作好应用程序镜像后上传到仓库,使用Docker daemon从仓库拉取后运行,我们可以使用官方共有仓库docker hub或者搭建私有仓库 Docker ...
- docker学习笔记6:利用dockerfile创建镜像介绍(生成简单web服务器镜像)
本文介绍如何利用dockerfile来创建镜像.下面介绍具体的操作过程: 一.创建构建环境 操作示例如下: xxx@ubuntu:~$ pwd /home/xxx xxx@ubuntu:~$ mkdi ...
- Docker学习笔记一 概念、安装、镜像加速
本文地址:https://www.cnblogs.com/veinyin/p/10406378.html Docker 是一个容器,可以想象成一个轻便的虚拟机,但不虚拟硬件和操作系统. 优点:启动快 ...
- docker学习笔记之把容器commit成镜像
docker提供了两种镜像制作的方式,提高了使用的灵活性: 1.可以将更改后的容器提交,制作成镜像(这是接下来要说明的) 2.通过Dockerfile来制作镜像 下面通过一个例子来展示方法1. 本地有 ...
- Docker学习笔记(2):使用Dockerfile构建镜像
Dockerfile是用来构建Docker镜像的文件,是由一系列命令和参数构成的脚本.每条指令都必须为大写字母且后面要跟随至少一个参数,每条指令都会创建一个新的镜像层,并对镜像进行提交. Docker ...
- docker学习笔记-06:自定义DockerFile生成镜像
一.自定义centos的DockerFile 1.从阿里源里拉的centos镜像新建的容器实例中,没有vim编辑器和ifconfig命令,所以自定义centos的DockerFile,创建自己想要的镜 ...
- docker学习笔记(3)- 镜像
简介 在docker学习笔记(1)- 架构概述一节中可以看到镜像是docker三大组件之一,可以将Docker镜像类比为虚拟机的模版. 镜像由多个层组成,每层叠加之后从外部看就像一个独立的对象,镜像的 ...
- docker学习笔记1 -- 安装和配置
技术资料 docker中文官网:http://www.docker.org.cn/ 中文入门课程:http://www.docker.org.cn/book/docker.html docker学习笔 ...
- Docker学习笔记总结
Docker学习笔记 https://yeasy.gitbooks.io/docker_practice/content/ 一 环境搭建 Ubuntu安装 .添加软件源的GPG密钥 curl -f ...
- Docker:学习笔记(1)——基础概念
Docker:学习笔记(1)——基础概念 Docker是什么 软件开发后,我们需要在测试电脑.客户电脑.服务器安装运行,用户计算机的环境各不相同,所以需要进行各自的环境配置,耗时耗力.为了解决这个问题 ...
随机推荐
- openshift node资源限制
在oc的node配置文件中添加 ...... kubeletArguments: cgroups-per-qos: - "true" cgroup-driver: - " ...
- Element-ui的表单中怎么添加正则校验
1. 以中国大陆手机号验证为例 // 这是组价的代码 <el-form-item prop="mobile"> <el-input type="text ...
- 建模:通过ES平铺关系型数据库多表的数据
问:建模要从一个限界上下文中来建模,是否可以简单的把几张表进行笛卡尔乘积方式的平铺? 答:不能,原因之一,数据量会急剧增长:原因之二,这样的平铺是毫无意义的,必须要定义一个维度,在这个维度上根据需求约 ...
- [Java in NetBeans] Lesson 11. While Loops
这个课程的参考视频和图片来自youtube. 主要学到的知识点有:(the same use in C/C++) 1. while loop while(i < max){} will keep ...
- js模拟链表
链表: 每个元素,都有一个指针,指向下一个元素 //链表 function LinkedList(){ var head = null; length = 0; this.append = funct ...
- Linux和windows 查看程序、进程的依赖库的方法
Linux: 1. 利用ldd查看可执行程序的依赖库 [root@~]# ldd /usr/local/php/bin/php linux-vdso.so.1 => (0x00007ff ...
- 记无法用被动方式登录远程linux主机的原因
[环境]: linux主机:华为企业云 ftp服务端:vsftpd 客户端:ftp命令行工具,安卓端ES文件浏览器 [现象]: 在ES文件浏览器中,使用被动方式没法连接,使用主动方式可以连接,但是没法 ...
- python ---多进程 Multiprocessing
和 threading 的比较 多进程 Multiprocessing 和多线程 threading 类似, 他们都是在 python 中用来并行运算的. 不过既然有了 threading, 为什么 ...
- 15. 3Sum(字典)
Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find ...
- Catch That Cow (bfs)
Catch That Cow bfs代码 #include<cstdio> #include<cstring> #include<algorithm> #inclu ...