镜像
镜像是一种轻量级的,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件。它包含运行某个软件所需的所有内容,包括代码、运行时所需的库、环境变量和配置文件。
镜像内容
我们发现,在Apache官网上下载的Tomcat也就10MB左右,但是我们打包出来的包含Tomcat服务的镜像将近500MB。再看其他镜像,MySQL镜像将近500MB,Redis镜像将近100MB,为什么这些镜像会远远大于软件本身的大小呢?
因为一个镜像包含三部分:
- 软件包。
- 软件包自身依赖。
- 软件包所需操作系统依赖。
镜像分层原理
Docker为了能让镜像能够复用,在设计镜像的过程中,给镜像做了一个分层的处理。
如果不采用分层设计,那么每打包的的镜像都是这样的:
如果每一个镜像都需要操作系统的基础依赖,而这些镜像都单独封装了一份操作系统基础依赖,这样以来会造成大量磁盘空间浪费,让每一个镜像变得更大。
采用分层设计后,在打包镜像时,会细粒度的将镜像分成很多层,然后从中抽出公共层,让需要使用到的镜像共同使用。如果粒度越细,抽取出来的公共层就越多,复用度就越高,实现了资源的共享,从而减少Docker仓库的整体体积。
比方说,现在公共仓库中有两个镜像,两个镜像如果独立存在占用都是400MB,已知两个镜像的公共部分占用200MB,那么如果两个镜像同时存于一个UnionFS中,那么其中一个镜像就可以减少200MB的占用。甚至再来一个镜像,该镜像如果也需要使用公共部分,那么也可以减少200MB的占用,这样就减少了Docker仓库的整体体积。当Docker仓库中镜像越来越多的时候,也就是公共层越来越多,那么拉取镜像也会越来越快。
UnionFS
我们从Docker Hub上拉下来的每一个镜像都不是独立构成的,而是由N个镜像共同组成。为什么呢?就要讲到UnionFS联合文件系统了。
UnionFS是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。UnionFS是Docker镜像的基础。
这种文件系统特性就是:一次同时加载多个文件系统,但从如外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
使用通俗的话来解释上图就是:运行镜像时,实际上是从下往上一层一层加载的过程。首先加载操作系统基础依赖,然后在操作系统基础依赖之上再去加载软件依赖库,最后再在软件依赖库之上加载软件。加载完软件之后,既有软件依赖库,又有操作系统基础依赖。这样表面上给使用者看来是一个文件系统,实际上是把多个文件给联合到了一起。
拉取镜像
Docker Hub类似于Maven Repository,是Docker维护的远程仓库的Web页面,专门用来查找各种镜像。
-
进入Docker Hub:registry.hub.docker.com/
无需登录,可以直接搜索各类镜像进行拉取。
-
直接搜索需要拉取的镜像(以MySQL
5.7为例)在Docker Hub中搜索到带有Official Image标签的服务,表示为官方镜像。如果不带该标签的,全部为个人镜像。我们在拉取时,尽量选用官方提供的镜像。
-
选择拉取MySQL的版本
可以直接搜索版本号。
-
复制拉取命令
-
在控制台执行命令
docker pull mysql:5.7此时Docker会现在本地仓库寻找是否有MySQL
5.7镜像,如果有,直接拉取;如果没有,就会通过互联网去远程仓库拉取MySQL5.7镜像到本地仓库,再拉取到Docker中。
镜像加速
因为Docker全世界维护一个远程仓库,那么由于国内外网络差异,国内拉取镜像的速度可能会比较慢,所以Alibaba在国内维护了一个Docker仓库的镜像。所以我们下载中,没有必要使用Docker默认远程仓库,我们可以使用阿里云给每一个开发人员提供的镜像加速服务从Alibaba镜像仓库中拉取镜像。
-
登录阿里云:www.aliyun.com/
-
进入管理控制台
-
在控制台中搜索:容器镜像服务
-
点击镜像加速器,选择Docker的安装平台(文本是CentOS 7)
-
根据要求输入命令
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://6sluz56c.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker -
查看docker远程仓库信息,增加了一个镜像地址
docker info