DO280中OpenShift的镜像管理

文/ 张瑞旗 腾科IT培训集团红帽讲师

DO280是红帽RHCA云计算五门核心课程之一OpenShift的代号。学习红帽RHCA云计算课程的朋友都会得到一个学习的教学环境。为了区别其他版本的OpenShift,我在这里就称这种OpenShift教学环境为DO280。
OpenShift利用Docker、Kubernetes及其它开源技术构建起一个PaaS的云计算平台,自然而然地,在这个平台上也使用Docker镜像来发布应用程序。
Docker镜像,或Docker image,是二进制的文件,里面包含了某个应用所需要的运行环境,可以视为一个简化版的操作系统。于是,有人说,Docker镜像就是对操作系统的虚拟化,或者是虚拟的操作系统。镜像、或者镜像跟源码的组合被用来创建应用程序,运行在node1、node2等被管理的节点服务器上,从而实现应用程序的功能。
DO280教学环境软件是OpenShift的一种发布版本,登录之后的界面如下图所示:

为了方便教学,这个版本中,有5个节点或者虚拟出来的5台服务器:

  1. classroom
  2. master
  3. node1
  4. node2
  5. workstation

Docker借助操作系统的底层功能,有效地将不同的应用进行隔离,创建了容器,进而实现了在复杂的环境下,在一台服务器上的快速部署不同的应用程序;而Kubernetes则帮助Docker在多台甚至上万台服务器上快速部署。当然,我们要知道,部署意味着容器的创建、销毁、扩容、减容、组合、联网、安全等等一系列操作。
DO280则充分地体现了OpenShift站在巨人的肩膀上,进一步方便学习,在workstation节点上,提供了一个git源码管理仓库,如下图http://workstation.lab.example.com

这个系统很复杂,并不适合展开来讲,我只想跟大家聊一聊DO280中的镜像管理。鉴于有些初学者很容易把这个git仓库与Docker的镜像仓库弄混,所以看看Git仓库也是很有必要的。
DO280集群中的master、node1、node2则体现了Kubernetes的管理思想。即在整个集群中,有的服务器充当了管理的角色,如master,大部分服务器则充当的是被管理的角色,如node1、node2。被管理的节点或服务器运行的就是整个集群的容器群,或者pay load。pay load这个词在中文里似乎没有很好的词汇与之对应。在物流行业,一辆货车的自重可能是5吨,上面装载了客户的10吨货物,还捎带1吨重的自家的东西。这10吨货物客户是要付钱的,所以称之为pay load。捎带的1吨,以及自重5吨,是不能向客户直接收钱的重量,所以不是pay load。
在master、node1、node2上,除了OpenShift自己的程序,也都安装了Docker。我们登录到master节点上,运行docker info命令:

ssh root@master
# docker info
//会显示如下信息(有省略):
Registry: https://workstation.lab.example.com:5000/v1/  (注1)
Insecure Registries: workstation.lab.example.com:5000(注2) 
172.30.0.0/16(注3) 
127.0.0.0/8(注4)
Registries: workstation.lab.example.com:5000 (insecure)(注5)


可以看到,DO280的集群中,至少有三个地方存放镜像:
1、Docker本地镜像仓库
2、OpenShift外部镜像仓库
3、OpenShift内部镜像仓库
我想大家最关心的事情就是:这三个仓库到底有什么用途?有哪些区别?如何管理和使用?下面我们分别来详细查看三个部分:


第1个镜像仓库:Docker本地仓库

127.0.0.0/8所标记的镜像仓库,是部署在当前主机上、Docker的本地仓库,存储位置在/var/lib/docker/devicemapper/mnt内。我们查询mater上的这个目录,发现是空的。

[ root@master ~ ] docker images
[ root@master ~ ] ls /var/lib/docker/devicemapper/mnt


但是,我们来查询node1和node2的这个目录,则有很多内容,截图如下:


1)往这个镜像里导入镜像

[root@master ~]# docker load -i wordpress.tgz

显示如下:

导入之后,再去看/var/lib/docker/devicemapper/mnt,就会发现这个目录便出现了,其下还创建了一堆目录和文件。

2)在这个仓库里搜索镜像

 

# docker images

可能的结果如下截图:

当然还可以更具体的搜索:
 

# docker images java
# docker images php:7.0

3)使用这个仓库里的镜像创建应用

OpenShift无法使用这个仓库里的镜像。只有将这里的镜像上传到外部仓库或OpenShift内部仓库,才可以被用以创建应用。

4)从这个仓库删除镜像

# docker rmi -f openshiftdemos/gogs:0.9.97
# docker rmi -f docker-image-sha-id

即,使用其sha的id,docker images可以显示这个id。

5)更新这个仓库里的镜像的标签

# docker tag docker.io/wordpress workstation.lab.example.com:5000/wordpress

即将这个从docker.io仓库网站上下载来的wordpress标记为workstation.lab.example.com:5000/wordpress。标记完成后,使用push命令即可以将这个镜像推送到标签所指定的位置。

# docker push workstation.lab.example.com:5000/wordpress

第2个镜像仓库:外部仓库

workstation.lab.example.com:5000,可以通过两种方式即加密和明文两种方式访问。明文的则被标记为insecure(不安全)。即上文的注1、注5。DO280中,workstation、foundation和classroom节点上并未安装docker,所以,以下命令除oc之外,都必须在master、node1、node2上才能运行。

1)向这个仓库添加镜像

# docker push workstation.lab.example.com:5000/wordpress


推送前,最好使用docker images查询一下,本地仓库中是否个名叫workstation.lab.example.com:5000/wordpress的镜像,没有的话,需要使用docker tag生成一个。比如说,我们在本地仓库里使用docker load -i wordpress.tgz之后,使用docker images可以看到,其完整的名称为docker.io/wordpress:latest。即docker.io这个仓库网站的根目录下的wordpress最新版本。我们不做任何标签,就直接推送,肯定会失败。

# docker push docker.io/wordpress


运行上面的命令行之后,显示的信息如下:
Error response from daemon: You cannot push a "root" repository. Please rename your repository to docker.io/<user>/<repo> (ex: docker.io/<user>/wordpress)
译文:你不能推送root用户的镜像。请将你的镜像以docker.io/<用户名>/wordpress形式更改名称后,再来推送。
也就是说,刚刚那条命令是docker.io这个仓库网站推送镜像。必须是注册用户才可以进行这样的操作。而我们只是想向DO280本地集群的公共仓库workstation.lab.example.com:5000推送(上传)镜像而已。进行如下操作:

# docker tag docker.io/wordpress workstation.lab.example.com:5000/wordpress


wordpress后面没有加标签,则会被默认为latest标签。
 

2)从这个仓库里删除镜像

与删除本地镜像一样,使用docker rmi + 完整的镜像名称。如docker images   //查看镜像,发现一个名叫workstation.lab.example.com:5000/wordpress,想删除它:

# docker rmi workstation.lab.example.com:5000/wordpress

有时候,这个镜像可能正在使用,则可以加个参数-f删除,即:

# docker rmi -f workstation.lab.example.com:5000/wordpress


3)搜索这个仓库里的镜像

# oc new-app -S wordpress


搜索一个名称wordpress的镜像。这条命令的范围很广。如果不加限制,则搜索本地仓库、外部仓库和内部仓库中的镜像(Docker术语)、镜像序列(OpenShift术语)和模板文件。
我们来看一看这个例子:

[root@master ~]# oc new-app -S


运行后,会显示如下信息:

error: You must specify one or more images, image streams, templates, or source code locations to create an application.
To list all local templates and image streams, use:
  oc new-app -L
To search templates, image streams, and Docker images that match the arguments provided, use:
  oc new-app -S php //搜索php的镜像和模板
  oc new-app -S --template=ruby  //搜索ruby相关的模板
  oc new-app -S --image-stream=mysql  //搜索mysql的镜像序列
  oc new-app -S --docker-image=python  //搜索python的docker镜像


可知,要显示本地所有的模板和镜像序列,应该使用oc new-app -L。要使用参数搜索的话,则应该使用oc new-app -S php之类的方法。如果使用--docker-image来过滤结果,除了显示本地Docker仓库的镜像之外,还会显示错误:
Docker registry lookup failed: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on 172.25.250.10:53: server misbehaving
为什么呢?因为,它还会到docker.io这个仓库网站上去搜索。因为,DO280只是一个教学环境,在启动Docker守护进程时,已经屏蔽这docker.io这个仓库。所以,会出现server misbehaving(服务器异常)。
但可以肯定的是,oc new-app -S keyword会搜索DO280的外部镜像仓库,workstation.lab.example.com:5000。
有人看到io会想到“input/output”。实际上,.io是分配给一个英国属地的“国别顶级域”。全球最大的域名注册商之一的godaddy新加城分公司在其网站这样介绍:

4)使用这个仓库里的镜像

# oc new-app --docker-image=workstation.lab.example.com:5000/postgresql:9.2 --insecure-registry


注意使用的参数是--docker-image。如果使用的是内部仓库里的镜像,则要使用--image-stream参数,也可以简写成-i。如果在内部镜像库里没有这个镜像,则会在当前的项目内保存一份这个镜像的副本。如:

# oc new-app --docker-image=workstation.lab.example.com:5000/gogs --insecure-registry
# oc get is  //查看当前项目的镜像序列


显示的结果如下:

NAME      DOCKER REPO                     TAGS       UPDATED
is/gogs   172.30.241.45:5000/test/gogs    latest     6 seconds ago


test是项目名称。172.30.241.45:5000是运行在default项目中的内部镜像仓库。一般情况下,保存在openshift项目中的镜像才可以被集群中所有其他项目使用。保存在当前项目中,只能被当前项目使用。

5)修改这个仓库里的镜像

docker tag可以修改这个仓库里的镜像标签及名称。
docker rmi 可以删除这个仓库里的镜像。

第3个镜像仓库:OpenShift内部仓库

173.30.0.0/16所标注的镜像仓库,是OpenShift自带的内部仓库。它运行在某个Pod/容器中。OpenShift Internal Registry,就是OpenShift内部仓库。一般情况下,这些镜像存放在OpenShift项目中。但是,一旦有人在OpenShift中创建了应用,则系统会自动创建相应的镜像,并将其存放在那个应用所在的项目中。
一句话,内部仓库中的镜像大部分存放在OpenShift项目中,其他的镜像,则跟应用一起创建,并存放在各自所属的项目中。

1)向这个仓库添加镜像

oc import-image wordpress \
--from workstation.lab.example.com:5000/wordpress \
--insecure=true --confirm


显示如下:

上图划线部分显示,镜像已经从外部镜像仓库中导入到内部镜像仓库中,其地址是:
172.30.241.45:5000/default/wordpress
这个172.30.241.45从哪里来的?翻遍所有节点都找不到。不过,运行以下命令就可以看到。

oc get all -n default  //查看default项目下所有的资源
NAME                    CLUSTER-IP       EXTERNAL-IP    PORT(S)
svc/docker-registry     172.30.241.45     <none>        5000/TCP
svc/kubernetes          172.30.0.1        <none>        443/TCP,53/UDP,53/TCP
svc/registry-console    172.30.30.131     <none>        9000/TCP
svc/router              172.30.127.247    <none>        80/TCP,443/TCP,1936/TCP


找到了!就是default项目下的docker-registry,还可以看到它公开了一个服务路由:
https://registry-console-default.cloudapps.lab.example.com
在workstation上打开浏览器查看,可以看到如下界面:


从网页界面看到的结果可知,我们也可以使用docker命令直接往这里上传镜像,或下载镜像。参见上图。

2)从这个仓库里删除镜像

# oc delete is wordpress -n openshift

3)搜索这个仓库里的镜像

# oc get is --all-namespaces |grep wordpress

4)使用这个仓库里的镜像

利用Docker内部的镜像时,最简单:

# oc new-app --image-stream=wordpress

或者干脆简化成这样:

# oc new-app -i wordpress

当然,还可以为这个App取个名字叫myapp:

# oc new-app -i wordpress --name=myapp

不指定名称的话,会用镜像的名字代替。

5)修改这个仓库里的镜像

修改这个仓库中的镜像的标签:
 

# oc tag gogs  gogs:0.9.97
# oc get is    //当前项目是test,显示结果如下
NAME      DOCKER REPO                     TAGS
gogs      172.30.241.45:5000/test/gogs    latest,0.9.97
//有两个tag,要删除掉latest
# oc tag -d gogs:latest
# oc get is
NAME      DOCKER REPO                     TAGS
gogs      172.30.241.45:5000/test/gogs    0.9.97

最后,在master、node1、node2上分别列举一个docker的服务进程,会有相同的发现,如下:

# ps aux | grep docker
…
--storage-driver devicemapper (存储驱动)
--storage-opt dm.thinpooldev=/dev/mapper/docker--vg-docker--pool  (物理卷)
--add-registry workstation.lab.example.com:5000 (启用仓库)
--add-registry registry.access.redhat.com (启用仓库)
--block-registry registry.access.redhat.com (禁止访问Red Hat的私有仓库)
--block-registry docker.io (禁止访问Docker的公共仓库)
--insecure-registry workstation.lab.example.com:5000 (不安全的外部仓库)
--insecure-registry 172.30.0.0/16(不安全内部仓库)
...


最后,我们将三个镜像仓库——Docker本地仓库、OpenShift外部仓库、OpenShift内部仓库——的操作做一个简单的对比:

1)添加镜像

本地仓库:docker load -i wordpress.tar
外部仓库:docker push workstation.lab.example.com:5000/wordpress
内部仓库:oc import-image wordpress workstation.lab.example.com:5000/wordpress --insecure=true --confirm

2)删除镜像

本地仓库:docker rmi -f docker.io/wordpress:9.2
外部仓库:docker rmi -f workstation.lab.example.com:5000/wordpress:9.2
内部仓库:oc delete is wordpress:9.2 -n openshift

3)修改镜像

本地仓库:docker tag docker.io/wordpress workstation.lab.example.com:5000/wordpress
外部仓库:docker tag workstation.lab.example.com:5000/wordpress workstation.lab.example.com:5000/wordpress:9.2
内部仓库:oc tag wordpress wordpress:9.2

4)搜索镜像

本地仓库:docker images | grep wordpress
外部仓库:oc new-app -S wordpress
内部仓库:
oc get is --all-namespaces | grep wordpress 
https://master.lab.example.com:8443
https://registry-console-default.cloudapps.lab.example.com

5)使用镜像(用来创建OpenShift应用)

本地仓库:不能使用,必须导入到外部仓库或内部仓库中
外部仓库:oc new-app --insecure-registry --name=myapp --docker-image=workstation.lab.example.com:5000/wordpress
内部仓库:
oc new-app -i wordpress --name=myapp 
或者 oc new-app --image-stream=wordpress --name=myapp

6)存放位置

本地仓库:/var/lib/docker/devicemapper
外部仓库:workstation.lab.example.com:5000
内部仓库:
172.30.0.0/16
docker-registry pod中
openshift项目中或存入在被应用的项目中

 

转载于:https://my.oschina.net/u/589241/blog/2998082

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值