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

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

前段时间,笔者看到一篇文章,题目是“容器就是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:

通过浏览器进行查看,

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

简直帅呆了!

原文发布于微信公众号 - 大魏分享(david-share)

原文发表时间:2017-07-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏性能与架构

如何 build 出尽可能小的 docker image?

1. 简介 我们自己构建 Docker image 时都希望结果镜像越小越好,那么如何才能尽量变小呢? 下面我们通过一个简单的案例,了解下优化思路,看一个简单的...

3116
来自专栏Coding01

从最简单的入手学习 Docker (一)

不管是在大公司还是小公司,由于代码有版本控制,大家的代码能保证一致;但由于大家相互之间的开发硬件不一样 (如,有人喜欢在 windows 环境下开发,有些人用 ...

1023
来自专栏Laoqi's Linux运维专列

Docker 配置安装(Ⅱ)

3046
来自专栏编程坑太多

『中级篇』docker 使用bind Mounting实战(36)

PS:通过这个例子我想到了,我做java开发的可以吧对应的tomcat里面的webapp下的关联容器外部,容器内就跑tomcat 连接容器外的文件app 就可以...

1436
来自专栏Felix的技术分享

Docker简单使用

21611
来自专栏Hadoop实操

如何基于CDSW基础镜像定制Docker

CDSW中提供的基础镜像中已有R的环境,但是在真实使用过程中往往需要安装更多R的包。我们在创建一个新的Project时如果使用CDSW基础镜像,每次都需要重新安...

4036
来自专栏小樱的经验随笔

这可能是最为详细的Docker入门吐血总结

在计算机技术日新月异的今天, Docker 在国内发展的如火如荼,特别是在一线互联网公司, Docker 的使用是十分普遍的,甚至成为了一些企业面试的加分项,不...

1.9K8
来自专栏写代码的海盗

Docker学习总结之docker入门 What is Docker?What can I use Docker for?What are the major Docker components?

  Understanding Docker 以下均翻译自Docker官方文档 ,转载请注明:Vikings翻译。 What is Docker? Dock...

2703
来自专栏散尽浮华

Docker容器学习梳理--基础知识(2)

之前已经总结了Docker容器学习梳理--基础知识(1),但是不够详细,下面再完整补充下Docker学习的一些基础。 Docker是个什么东西 Docker是一...

26510
来自专栏java技术学习之道

如何使用 Docker 搭建 Java Web 运行环境

2415

扫码关注云+社区