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項目中或存入在被應用的項目中
相關文章
相關標籤/搜索