前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何有效地对Docker的镜像进行管理?

如何有效地对Docker的镜像进行管理?

作者头像
魏新宇
发布2018-03-22 16:09:33
1.7K0
发布2018-03-22 16:09:33
举报

容器的存储空间如何提供?

前段时间,笔者看到一篇文章,题目是“容器就是Linux”,写的不错。容器说简单点就是容器级别的虚拟化,在一个Kernel Space上虚拟出多个User Space。那么,容器如何使用存储空间呢?

我们知道,Windows和Linux的操作系统,都是使用文件系统的。在RHEL上,可以针对磁盘划分区,然后创建文件系统。当然,也可以使用LVM的方式,将磁盘创建vg,划分lv,然后创建文件系统。

那么,Docker通过什么方式获取存储空间呢,或者说使用什么存储驱动?

在RHEL, CentOS, or Oracle Linux这几种操作系统中,Docker存储驱动使用Device Mapper。在RHEL上(容器宿主机),通过devicemapper从物理的制定裸设备上获取空间,分配给容器使用,容器才能启动。同时,我们将docker image存在服务器本地的时候,也需要调用容器所在物理机的devicemapper创建存储池进行存储。

(详细内容参照社区文档:https://docs.docker.com/engine/userguide/storagedriver/device-mapper-driver/)

DeviceMapper是一个Linux内核的框架,它用于为Docker进行卷管理。因此,devicemapper是在block层进行操作,为容器提供并管理块设备,而不是文件系统。

DerviceMapper的两种工作方式

devicemapper的两种工作模式是:loop-lvm和direct-lvm两种。前一种方式性能较差,适合测试环境。第二种模式性能好,适合于生产。用社区的话说,第一种模式loop-lvm的好处是配置简单,因此适用于测试。实际上,在红帽容器云解决方案中,第二种配置方式也很简单。这里我们只对第二种方式展开说明。

direct-lvm到底是什么?其实就是利用容器所在的宿主机(通常是物理机 + RHEL),上的块设备,创建一个thin的pool,用于将docker image本地存放并为启动的容器分配空间。

在红帽的Openshift中,如何创建direct-lvm?方法很简单:

首先将docker服务停止:

systemctl stop docker

为Docker宿主机增加一块磁盘,这个磁盘可以是本地的,也可以是共享存储的。例如是/dev/sdb。

在docker宿主机上做如下配置(openshift的master和node节点都需要做)

修改/etc/sysconfig/docker-storage-setup配置文件,修改成如下:

DEVS=/dev/sdb

VG=docker-vg

SETUP_LVM_THIN_POOL=yes

然后执行如下命令创建存储池:

docker-storage-setup 

最后启动docker服务:

systemctl start docker

通过docker info进行查看,pool已经创建完成:

Openshift的两个镜像库

在Openshift中,有两个镜像库,本地镜像库和内部镜像库。

第一个本地镜像库,用于存放客户IT部门共用的镜像,如JBoss、Ruby、RHEL、CentOS、MongoDB、NGINX、Haproxy等等。说简单点,就是在docker.io和红帽的"容器应用商店"中(https://access.redhat.com/containers/),所有用户需要的,都可以放到本地的这个镜像库。

“既然网上有docker镜像,为什么要放到本地”?

很简单,客户数据中心,并不是所有服务器和容器都能连接外网的,即使能够连接外网,把常用的镜像pull到本地,访问速度也更快。

第二个内部镜像库(Internal Registry)。这个集成的镜像库,用于存放S2I过程中所产生的镜像。细心的朋友应该注意到,在Openshift中,一个S2I的过程中,当Build成功后,build成功的image将会被push到内部镜像库。

在Openshift中,内部镜像库也是一个容器。如下图所示的docker-registry-2-8cbsj

内部镜像库的docker-registry-2-8cbsj的IP和SVC的IP同网段,也是172网段的:

Openshift本地镜像库的管理

对于本地镜像库,我们可以用如下方式查看本地有的镜像:

在Master节点上,查看master本地镜像库有的镜像:

在Node节点上,查看node本地镜像库有的镜像:

细心的朋友会问,为什么本地镜像库会有172开头和registry开头的镜像?

其实这显示的是,镜像的来源,而不是目前在哪。docker images只会显示本地镜像库有的镜像,不会显示互联网上的镜像。

如果本地没有需要的镜像,想从网上下载,怎么操作?

首先用如下命令在互联网上进行查看(例如要查找ceph的容器化镜像):

需要注意的是,docker search只会查找互联网上的镜像,不会查找本地镜像.

在上图中,我们看到很多个ceph相关的镜像。默认情况下,我们优先选择使用红帽“容器应用商店”的镜像,因为它经过红帽的安全认证,更为安全。

过一会,下载完成。通过命令行查看本地镜像库,可以看到已经下载,并打上了latest的标签:

Openshift内部镜像库的管理

Openshift内部镜像库是个容器,前面已经提到了。默认这个容器如果重启后,数据就丢失了,之前S2I生成的镜像也就付之一炬,这显然是不合理的。因此,我们需要给内部镜像库增加持久存储,并且最好是外置共享存储空间。这样做的好处是,万一内部镜像库所在的物理服务器出现故障,这个容器在其他Openshift的node上重启,则还可以访问到共享存储存放的镜像数据。

默认情况下,内部镜像库没有外置持久存储。

我们通过NFS共享的存储空间,创建PV和PVC,然后将PVC绑定到内部镜像库的DC上:

PV配置文件:

PVC配置文件:

PVC和PV bound:

修改内部镜像库的dc:

oc volume dc/docker-registry --add--name=registry-storage -t pvc --claim-name=registry-pvc --overwrite

BTW:

如果在添加持久存储之前,内部镜像库已经有S2I的镜像存在,那么需要先备份出来:

将容器中/registry目录中的内容备份到master节点本地目录:

[root@master ~]# cd /home/david/backup

在持久存储添加完毕后以后,dc重新出发一次pod的部署,再将之前备份的S2I镜像移动到持久存储中:

我们可以通过命令行,登录到内部镜像库中,查看已经有的镜像:

我们将docker-registry删除,rc会触发docker-registry的自动创建,通过上面的方式可以查看到,数据依然存在。

在Openshift3.5中,如果想快速查看内部镜像库有的镜像,最好的方法是访问内部镜像库的console:

通过浏览器进行查看,

我们还可以将一个镜像点开,查看其历史信息:

简直帅呆了!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大魏分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档