文/ 张瑞旗 腾科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
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个仓库到底有什么用途?有哪些区别?如何管理和使用?下面咱们分别来详细查看:安全
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的这个目录,则有不少内容,截图以下:
[root@master ~]# docker load -i wordpress.tgz
显示以下:
导入以后,再去看/var/lib/docker/devicemapper/mnt,就会发现这个目录便出现了,其下还建立了一堆目录和文件。
# docker images
可能的结果以下截图:
固然还能够更具体的搜索:
# docker images java # docker images php:7.0
OpenShift没法使用这个仓库里的镜像。只有将这里的镜像上传到外部仓库或OpenShift内部仓库,才能够被用以建立应用。
# docker rmi -f openshiftdemos/gogs:0.9.97 # docker rmi -f docker-image-sha-id
即,使用其sha的id,docker images能够显示这个id。
# 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
workstation.lab.example.com:5000,能够经过两种方式即加密和明文两种方式访问。明文的则被标记为insecure(不安全)。即上文的注一、注5。DO280中,workstation、foundation和classroom节点上并未安装docker,因此,如下命令除oc以外,都必须在master、node一、node2上才能运行。
# 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标签。
与删除本地镜像同样,使用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
# 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新加城分公司在其网站这样介绍:
# 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项目中的镜像才能够被集群中全部其余项目使用。保存在当前项目中,只能被当前项目使用。
docker tag能够修改这个仓库里的镜像标签及名称。
docker rmi 能够删除这个仓库里的镜像。
173.30.0.0/16所标注的镜像仓库,是OpenShift自带的内部仓库。它运行在某个Pod/容器中。OpenShift Internal Registry,就是OpenShift内部仓库。通常状况下,这些镜像存放在OpenShift项目中。可是,一旦有人在OpenShift中建立了应用,则系统会自动建立相应的镜像,并将其存放在那个应用所在的项目中。
一句话,内部仓库中的镜像大部分存放在OpenShift项目中,其余的镜像,则跟应用一块儿建立,并存放在各自所属的项目中。
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命令直接往这里上传镜像,或下载镜像。参见上图。
# oc delete is wordpress -n openshift
# oc get is --all-namespaces |grep wordpress
利用Docker内部的镜像时,最简单:
# oc new-app --image-stream=wordpress
或者干脆简化成这样:
# oc new-app -i wordpress
固然,还能够为这个App取个名字叫myapp:
# oc new-app -i wordpress --name=myapp
不指定名称的话,会用镜像的名字代替。
修改这个仓库中的镜像的标签:
# 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内部仓库、项目仓库——的操做作一个简单的对比:
本地仓库: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
本地仓库: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
本地仓库: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
本地仓库: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
本地仓库:不能使用,必须导入到外部仓库或内部仓库中 外部仓库: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
本地仓库:/var/lib/docker/devicemapper 外部仓库:workstation.lab.example.com:5000 内部仓库: 172.30.0.0/16 docker-registry pod中 openshift项目中或存入在被应用的项目中