DO280中OpenShift的镜像管理

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

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

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

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

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

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

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的集群中,有4个地方存放容器镜像:
一、Docker本地镜像仓库git

二、OpenShift外部镜像仓库sql

三、OpenShift内部镜像仓库docker

四、项目内部镜像仓库浏览器

我想你们最关心的事情就是:这4个仓库到底有什么用途?有哪些区别?如何管理和使用?下面咱们分别来详细查看:安全


第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(不安全)。即上文的注一、注5。DO280中,workstation、foundation和classroom节点上并未安装docker,因此,如下命令除oc以外,都必须在master、node一、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、node一、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(不安全内部仓库)
...


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

1)添加镜像

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

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
项目仓库:oc delete is wordpress:9.2 -n project_a

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
方法二:docker-registry-cli workstation.lab.example.com search wordpress
内部仓库:oc get is --all-namespaces | grep wordpress

 

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项目中或存入在被应用的项目中
相关文章
相关标签/搜索