文/ 張瑞旗 騰科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項目中或存入在被應用的項目中