CoreOSRkt容器鏡像怎么制作

這篇文章主要介紹“CoreOS Rkt容器鏡像怎么制作”,在日常操作中,相信很多人在CoreOS Rkt容器鏡像怎么制作問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”CoreOS Rkt容器鏡像怎么制作”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

山東網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,山東網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為山東成百上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的山東做網(wǎng)站的公司定做!

AppC規(guī)范究竟約定了什么

使用了開源軟件的人,未必都會(huì)有心情仔細(xì)閱讀各種開源協(xié)議的內(nèi)容。大多數(shù)的使用容器產(chǎn)品用戶,也不見得要對(duì)容器規(guī)范的內(nèi)容有很高的興致。

不過(guò),為了更好的理解后面將要介紹到的相關(guān)工具,還是不妨稍微深入的了解一些AppC規(guī)范約定的內(nèi)容。其內(nèi)容歸納起來(lái)主要有四個(gè)方面,下面依次羅列出來(lái),并與當(dāng)下的主流容器Docker做一個(gè)簡(jiǎn)要的對(duì)比。

PS:嚴(yán)格來(lái)說(shuō),AppC與AppC Spec兩個(gè)詞是有區(qū)別的。前者指的是CoreOS的App Container這個(gè)項(xiàng)目,包括規(guī)范和相關(guān)的工具,而后者特指AppC中約定的容器規(guī)范。但在許多地方,特別是翻譯的文章中,經(jīng)??吹竭@兩個(gè)詞被混用,因此一般也不必太講究了。

1.容器的鏡像格式

本質(zhì)上說(shuō),容器鏡像就是符合特定目錄結(jié)構(gòu)的文件壓縮包。鏡像中的內(nèi)容在容器啟動(dòng)后被展開,然后復(fù)制到一個(gè)獨(dú)立的namespace空間內(nèi),并通過(guò)cgroup限制容器能夠使用的系統(tǒng)資源。稍后在制作鏡像時(shí),會(huì)詳細(xì)介紹AppC Spec規(guī)定的鏡像目錄結(jié)構(gòu)。這里只先指出一點(diǎn),AppC的鏡像沒有支持像Docker那樣的分層結(jié)構(gòu),這種設(shè)計(jì)簡(jiǎn)化了容器運(yùn)行時(shí)的一些操作,但帶來(lái)的弊端也是很明顯的:無(wú)法復(fù)用鏡像相同的部分。因此在磁盤空間的利用上造成了浪費(fèi),也增加了容器鏡像在網(wǎng)絡(luò)傳輸成本。

除了目錄的結(jié)構(gòu),鏡像還需要一個(gè)描述鏡像內(nèi)容的文件,稱為“鏡像屬性清單文件(Image Manifest)”,其中定義的內(nèi)容包括:鏡像的作者信息、容器暴露的端口、暴露的掛載點(diǎn)、所需的系統(tǒng)資源(CPU/內(nèi)存)等。此外,AppC Spec的約定的屬性清單中,還會(huì)包含許多編排調(diào)度所需的信息,例如容器運(yùn)行所依賴的其他容器、容器的標(biāo)簽。

在這方面來(lái)說(shuō),AppC鏡像的信息量遠(yuǎn)遠(yuǎn)多于Docker鏡像。相當(dāng)于囊括了Docker鏡像本身、Compose編排配置以及一部分Docker運(yùn)行參數(shù)的內(nèi)容。

此外,AppC規(guī)范也約定的鏡像ID和簽名的生成方法,關(guān)于鏡像ID和簽名的作用和在Rkt文章上篇中已經(jīng)介紹過(guò),稍后還會(huì)詳細(xì)介紹鏡像簽名的生成方法。

2.鏡像的分發(fā)協(xié)議

分發(fā)協(xié)議主要是約定鏡像下載使用的協(xié)議類型和URL的樣式。AppC的鏡像URL采用類似Docker的domain.com/image-name這樣的格式,但其實(shí)際處理方式有些不同。此外,在沒有指定域名時(shí),Docker會(huì)默認(rèn)在官方的DockerHub尋找鏡像,AppC的鏡像沒有所謂“官方源”,因此也沒有這樣的規(guī)則。

Rkt/AppC目前支持以下幾種URL格式:

  • <域名>/<鏡像名>

  • <本地文件路徑>

  • https://<完整網(wǎng)絡(luò)路徑>

  • http://<完整網(wǎng)絡(luò)路徑>

  • docker://<與Docker一樣的鏡像URL>

第一種方式是AppC推薦的鏡像分發(fā)URL,這種方式有點(diǎn)像Docker Repository,但實(shí)際上只是HTTPS協(xié)議的簡(jiǎn)寫方式。AppC會(huì)根據(jù)指導(dǎo)的域名和路徑依照約定的方式轉(zhuǎn)換為完整URL地址,然后下載指定的鏡像。

第二種方式相當(dāng)于導(dǎo)入本地鏡像。值得一提的是,即便使用本地鏡像,AppC同樣要求鏡像有簽名認(rèn)證,關(guān)于簽名文件的細(xì)節(jié)在后面的內(nèi)容里會(huì)詳細(xì)討論。

第三種和第四種方式都是直接通過(guò)完整URL獲取鏡像,規(guī)范中并不推薦直接這樣使用裸的HTTPS的URL,因?yàn)檫@種命名過(guò)于隨意的鏡像地址不利于鏡像的管理和統(tǒng)一,特別是HTTP協(xié)議的URL更只應(yīng)該在內(nèi)網(wǎng)的環(huán)境中出現(xiàn)。

第五種方式不是AppC規(guī)范支持的協(xié)議類型,目前只是Rkt支持這種協(xié)議(本質(zhì)上還是HTTP或HTTPS)。兼容Docker鏡像的URL,只需要在前面加上docker://即可,下載后會(huì)自動(dòng)轉(zhuǎn)換為AppC鏡像格式。由于Docker的鏡像倉(cāng)庫(kù)不支持簽名認(rèn)證,使用這種URL時(shí),用戶需要顯示的加上參數(shù)--insecure-skip-verify允許使用未認(rèn)證的鏡像來(lái)源。

3.容器的編排結(jié)構(gòu)

AppC規(guī)范中的容器編排和集群描述方式與Kubernetes十分相似,采用“容器組屬性清單文件(Pod Manifest)”描述。其中沿用了Kubernetes中諸如Pods、labels等用于在集群中進(jìn)行調(diào)度策略的規(guī)劃和管理的概念。

Pods直譯便是“豆莢”,它指的是由一系列相互關(guān)聯(lián)的容器組成的,能夠?qū)ν馓峁┆?dú)立服務(wù)功能的容器集合。例如將用于數(shù)據(jù)收集功能的容器、用于緩存服務(wù)的容器以及用于搜索服務(wù)的容器組合在一起,作為一個(gè)Pod提供完整的數(shù)據(jù)查詢服務(wù)暴露給外部用戶。Pod可以作為容器參與集群調(diào)度的單獨(dú)集合提供給集群管理器,在例如Kubernetes這樣的集群管理模型中,Pod實(shí)際上就是進(jìn)行服務(wù)跨節(jié)點(diǎn)調(diào)度的最小單位。

labels用于標(biāo)示具有同一類特性的容器,為容器的過(guò)濾和選擇提供了十分靈活的策略。許多的集群管理器都能夠在調(diào)度時(shí)利用選擇指定標(biāo)簽對(duì)Pods進(jìn)行篩選。

考慮到CoreOS公司與谷歌共同合作的背景(已經(jīng)推出了Tectonic CaaS平臺(tái)),這樣的設(shè)計(jì)為Kubernetes未來(lái)與符合AppC規(guī)范的容器進(jìn)行深度集成提供了良好的技術(shù)基礎(chǔ)。

4.容器的執(zhí)行器

執(zhí)行器,也就像是Rkt這樣的容器工具。這個(gè)部分規(guī)范了設(shè)計(jì)符合AppC Spec的容器執(zhí)行器所需要遵循的原則和應(yīng)該具備的功能。

例如,必須為每個(gè)容器提供唯一的UUID;在容器的運(yùn)行上下文中必須至少提供一個(gè)本地Loopback網(wǎng)卡,以及0個(gè)至多個(gè)其他TCP/IP網(wǎng)卡;應(yīng)該將容器中程序打印到Stdout和Stderr的日志進(jìn)行收集和展示等細(xì)節(jié)。

其中還詳細(xì)約定了,對(duì)于鏡像屬性清單中的諸多屬性,執(zhí)行器應(yīng)當(dāng)如何進(jìn)行處理。這些內(nèi)容對(duì)大部分的使用者而言都只能作為參考,還是需要以具體實(shí)現(xiàn)的容器產(chǎn)品文檔為準(zhǔn)。

鏡像工具

在AppC的項(xiàng)目中,除了一紙洋洋灑灑的規(guī)范文書以外,還提供了不少AppC鏡像相關(guān)的示范工具。不像Docker這種一個(gè)命令集成所有功能的玩法,這些工具中的每個(gè)只是關(guān)注于容器的某個(gè)方面功能。例如通用類型鏡像的制作、打包、格式轉(zhuǎn)換以及特定類型鏡像的制作等。

目前已有的工具主要包括:

  • Actool - 用于鏡像的構(gòu)建和驗(yàn)證

  • Docker2Aci - 用于將Docker導(dǎo)出的鏡像轉(zhuǎn)換為AppC鏡像

  • Goaci - 用于Golang語(yǔ)言的項(xiàng)目一鍵打包和構(gòu)建鏡像的工具

  • Acbuild - 通過(guò)指令的方式構(gòu)建鏡像

其中,ActoolAcbuild都是用于鏡像構(gòu)建的工具,它們的區(qū)別類似于通過(guò)docker commit和Dockerfile兩種方式構(gòu)建鏡像。需要指出的是,前不久才剛剛建立的Acbuild項(xiàng)目,現(xiàn)在還只是一個(gè)計(jì)劃,沒有發(fā)布任何實(shí)際可用的版本,其目的是替代之前的另一個(gè)項(xiàng)目baci。后者已經(jīng)無(wú)法使用并且不再繼續(xù)更新。

Goaci的作用是獲取指定路徑的項(xiàng)目,進(jìn)行自動(dòng)編譯,然后把編譯后的可執(zhí)行程序制作成一個(gè)鏡像,所有的這些操作只需要一條命令就可以完成:goaci <項(xiàng)目路徑>,項(xiàng)目路徑支持所有go get命令所支持的代碼托管網(wǎng)站,包括BitBucket、GitHub、Google Code和Launchpad等。不過(guò),它只能用于使用Golang語(yǔ)言并托管在上述網(wǎng)站中的開源項(xiàng)目。不具有普遍的適用性。

下面將重點(diǎn)介紹ActoolDocker2Aci這兩個(gè)工具。為了方便非CoreOS系統(tǒng)用戶嘗鮮,也會(huì)介紹在這些工具在其他64位Linux發(fā)行版的安裝方法。

鏡像的制作

與鏡像制作相關(guān)的工具是Actool,這個(gè)軟件已經(jīng)預(yù)裝在CoreOS系統(tǒng)較新的版本上了,可以通過(guò)actool --help命令驗(yàn)證并獲得Actool的版本。其他64位Linux的用戶可以通過(guò)下面的命令安裝它:

wget https://github.com/AppC/spec/releases/download/v0.5.2/AppC-v0.5.2.tar.gz
tar zxf AppC-v0.5.2.tar.gz
sudo mv AppC-v0.5.2/actool /usr/local/bin/

說(shuō)到構(gòu)建鏡像,前面已經(jīng)提到,新的命令式構(gòu)建鏡像的工具Acbuild目前還沒有發(fā)布任何可用版本。因此當(dāng)下的情況是,構(gòu)建AppC鏡像還只能手工創(chuàng)建鏡像屬性清單文件,拷貝容器中所需的文件,然后直接打包生成鏡像。索性,這樣創(chuàng)建鏡像除了失去諸如“基礎(chǔ)設(shè)施即代碼”的好處以外,并沒有多少值得非議的地方,構(gòu)建流程本身并不復(fù)雜。

下面來(lái)制作一個(gè)十分樸素的AppC容器鏡像,這個(gè)鏡像中只包含一個(gè)可執(zhí)行文件。

首先新建一個(gè)用于制作鏡像的工作目錄,例如AppC-image

>mkdir AppC-image

接下來(lái),為了讓這個(gè)例子足夠簡(jiǎn)單,我們需要一個(gè)能夠不依賴任何外部動(dòng)態(tài)庫(kù)或運(yùn)行時(shí)環(huán)境,能夠單獨(dú)運(yùn)行的程序。我們寫一個(gè)C語(yǔ)言的“Hello World”吧。新建一個(gè)叫hello.c的文件,內(nèi)容如下:

#include <stdio.h>
int main(int argc, char* argv[])
{
    printf("Hello AppC\n"); //隨便輸出點(diǎn)什么東西
    return 0;
}

然后,需要一個(gè)C語(yǔ)言編譯器,有些Linux系統(tǒng)已經(jīng)自帶了這個(gè)東西,用gcc --version命令可以驗(yàn)證。如果沒有安裝,那么...大家看著辦吧,比如在Ubuntu系統(tǒng)下面可以通過(guò)apt-get來(lái)獲?。?/p>

sudo apt-get install gcc

CoreOS系統(tǒng)會(huì)稍微麻煩一點(diǎn),需要借助一個(gè)額外的容器來(lái)完成。提示一下,Docker有一個(gè)官方的C/C++語(yǔ)言運(yùn)行環(huán)境鏡像,就叫gcc??梢?code>docker pull gcc或者rkt --insecure-skip-verify fetch docker://gcc來(lái)獲取它,然后啟動(dòng)一個(gè)容器,注意需要映射一個(gè)Volumn到主機(jī)上,方便編譯完成后將生成的可執(zhí)行程序拷貝出來(lái)。

編譯的命令如下,其中的--static參數(shù)是必須的,否則編譯出來(lái)的程序在執(zhí)行時(shí)會(huì)需要依賴外部的動(dòng)態(tài)庫(kù):

gcc --static -o hello hello.c

在剛剛工作目錄里面新建一個(gè)叫rootfs的目錄,將編譯生成的hello可執(zhí)行文件拷貝進(jìn)去。這個(gè)rootfs目錄中的內(nèi)容就是以后容器里所包含的文件內(nèi)容了,因此建議在其中再建立一些標(biāo)準(zhǔn)的目錄結(jié)構(gòu),例如/bin目錄,將可執(zhí)行程序放到這個(gè)目錄里面。

mkdir -p AppC-image/rootfs/bin
cp hello AppC-image/rootfs/bin/

現(xiàn)在鏡像的目錄結(jié)構(gòu)已經(jīng)成型了。下面就可以開始創(chuàng)建鏡像的屬性清單文件了,在工作目錄中新建一個(gè)名為manifest的文件,內(nèi)容如下:

{
    "acKind": "ImageManifest",
    "acVersion": "0.5.2",
    "name": "my-app",
    "labels": [
        {"name": "os", "value": "linux"},
        {"name": "arch", "value": "amd64"}
    ],
    "app": {
        "exec": [
            "/bin/hello"
        ],
        "user": "0",
        "group": "0"
    }
}

此時(shí),工作目錄里的文件結(jié)構(gòu)應(yīng)該是這樣的:

AppC-image
├── manifest
└── rootfs
    └── bin
        └── hello

最后就可以用actool命令構(gòu)建鏡像了:

actool build AppC-image hello.aci

鏡像的驗(yàn)證

容器鏡像的來(lái)源無(wú)非有兩種:本地的或者遠(yuǎn)程的。

因此對(duì)鏡像的驗(yàn)證也就包含兩部分內(nèi)容。

  • 檢驗(yàn)本地的文件是否符合AppC規(guī)范的鏡像

  • 檢驗(yàn)遠(yuǎn)程的URL是否是有效的AppC鏡像地址

對(duì)于前一種情況,前面說(shuō)過(guò),容器鏡像其實(shí)就是符合一定標(biāo)準(zhǔn)結(jié)構(gòu)的打包文件。

$ file hello.aci
hello.aci: gzip compressed data

在AppC規(guī)范中,鏡像文件的后綴名應(yīng)該是.aci,但具有這個(gè)后綴名的打包文件未必就是正確的鏡像。因此需要一個(gè)方法來(lái)驗(yàn)證鏡像文件的正確性,相應(yīng)的命令是actool validate。

直接執(zhí)行這個(gè)命令時(shí),actool只會(huì)通過(guò)命令的返回值表示驗(yàn)證的結(jié)果,返回0表示驗(yàn)證通過(guò):

$ actool validate hello.aci
$ echo $?
0

可以加上-debug參數(shù)讓actool直接將結(jié)果打印在控制臺(tái)上:

$ actool -debug validate hello.aci
hello.aci: valid app container image

對(duì)于后一種情況,URL的驗(yàn)證,同樣可以通過(guò)actool工具完成,相應(yīng)的命令是actool discover。

這個(gè)命令會(huì)返回鏡像的實(shí)際下載地址:

$ actool discover coreos.com/etcd
ACI: https://github.com/coreos/etcd/releases/download/latest/etcd
-latest-linux-amd64.aci, ASC: https://github.com/coreos/etcd
/releases/download/latest/etcd-latest-linux-amd64.aci.asc
Keys: https://coreos.com/dist/pubkeys/aci-pubkeys.gpg

試一下在Rkt里面用過(guò)的Docker鏡像地址,會(huì)發(fā)現(xiàn)這個(gè)地址是無(wú)效的。

$ actool discover docker://ubuntu
error fetching docker://ubuntu: Get https://docker?ac-discovery=1: 
dial tcp: lookup docker: no such host

這也證實(shí)了在前面說(shuō)的,docker://這種協(xié)議只是Rkt額外支持的鏡像獲取方式,并不是AppC的規(guī)范中的標(biāo)準(zhǔn)協(xié)議。

鏡像的轉(zhuǎn)換

AppC的規(guī)范制定者們顯然很清楚,哪些輪子該重造,哪些輪子是可以直接復(fù)用的。在Docker的各種鏡像已然是鋪天蓋地的當(dāng)下,一個(gè)新的容器工具想要最快積累鏡像數(shù)量,最好的辦法就是兼容Docker鏡像或者將Docker的鏡像進(jìn)行轉(zhuǎn)換。

其實(shí)對(duì)于鏡像兼容這個(gè)問題,新標(biāo)準(zhǔn)們有各自不同的做法,紅帽的Nulecule選擇了支持Dockerfile格式,只需要把已有的鏡像代碼加上一些額外的配置文件,重新構(gòu)建一次就可以。而AppC做過(guò)同樣的嘗試,(之前有個(gè)baci項(xiàng)目就是干這個(gè)的,不過(guò)已經(jīng)沒有更新了),效果上有些不倫不類,因此索性更干脆,提供個(gè)工具允許將任何的Docker鏡像導(dǎo)出后直接轉(zhuǎn)換成自己的鏡像格式。

下面就來(lái)說(shuō)說(shuō)從Docker到AppC鏡像的轉(zhuǎn)換,相應(yīng)的工具是Docker2Aci

這個(gè)工具不論是在Ubuntu或者CoreOS上都沒有預(yù)裝,因此需要單獨(dú)安裝。這個(gè)工具還沒有正式發(fā)布,因此官方也沒有提供編譯好的二進(jìn)制包,要獲得它只能從源代碼編譯。值得慶幸的是,Golang語(yǔ)言的編譯方式還是比較友好的,如果本地已經(jīng)安裝了Golang語(yǔ)言的開發(fā)環(huán)境,可以直接通過(guò)go get github.com/AppC/docker2aci命令完成整個(gè)下載和編譯的過(guò)程。

考慮到大多數(shù)用戶都是沒有Golang開發(fā)環(huán)境的,另一個(gè)比較簡(jiǎn)單的辦法是:通過(guò)容器。因?yàn)?,Docker官方已經(jīng)提供了一個(gè)用于Golang開發(fā)的容器鏡像,名字就叫golang。用下面一條命令就可以搞定編譯。

sudo docker run -v $(pwd):/pkg -i -t golang:1.4 /bin/bash -c "go 
get github.com/AppC/docker2aci; cp \$GOPATH/bin/docker2aci /pkg/"

編譯好的docker2aci二進(jìn)制文件會(huì)被拷貝到當(dāng)前目錄,將它放到系統(tǒng)變量PATH所指的的任意目錄中即可,比如:

sudo mv docker2aci /usr/local/bin/

執(zhí)行docker2aci --version命令可以打印出軟件的使用幫助,證明已經(jīng)成功安裝。

$ docker2aci
Usage of docker2aci:
docker2aci [--debug] [--nosquash] IMAGE
  Where IMAGE is
    [--image=IMAGE_NAME[:TAG]] FILEPATH
  or
    docker://[REGISTRYURL/]IMAGE_NAME[:TAG]
Flags:
  -debug=false: Enables debug messages
  -image="": When converting a local file, it selects a particular image to convert. Format: IMAGE_NAME[:TAG]
  -nosquash=false: Don't squash layers and output every layer as ACI

將一個(gè)Docker鏡像導(dǎo)出,然后可以通過(guò)docker2aci命令轉(zhuǎn)換成AppC鏡像。

$ docker pull ubuntu
$ docker save -o ubuntu.docker ubuntu
$ ./docker2aci ubuntu.docker
... ...
Generated ACI(s):
ubuntu-latest.aci

轉(zhuǎn)換后的鏡像會(huì)保存在當(dāng)前目錄,并自動(dòng)用“<鏡像>-<標(biāo)簽>”的格式命名。

此外,比較實(shí)用的是,docker2aci同樣支持docker://協(xié)議的URL直接獲取網(wǎng)上的鏡像。

$ docker2aci docker://busybox
... ...
Generated ACI(s):
busybox-latest.aci

鏡像的簽名

這個(gè)時(shí)候,如果直接用Rkt運(yùn)行剛剛創(chuàng)建的hello.aci鏡像,會(huì)發(fā)現(xiàn)Rkt提示由于找不到有效的簽名文件,因此拒絕運(yùn)行這個(gè)鏡像。

$ sudo rkt run hello.aci
error opening signature file: open /home/core/hello.aci.asc: no such file or directory

鏡像的簽名,是AppC引入的一種鏡像來(lái)源驗(yàn)證機(jī)制,本質(zhì)上是利用非對(duì)稱加密的標(biāo)準(zhǔn)數(shù)字簽名。通過(guò)將鏡像提供者的私鑰和鏡像文件本身加密生產(chǎn)一組簽名字符串,通過(guò)發(fā)布者提供的公鑰就能夠解開這串字符并得到與鏡像匹配的信息,這樣就能驗(yàn)證鏡像是否是真的來(lái)自特定的作者或來(lái)源。

AppC的簽名算法是標(biāo)準(zhǔn)是RSA,采用的是開源的GPG實(shí)現(xiàn),關(guān)于GPG的詳細(xì)介紹參考這篇文章。

首先準(zhǔn)備一個(gè)密鑰配置文件,命名為gpg-batch,內(nèi)容如下:

%echo Generating a default key
Key-Type: RSA 
Key-Length: 2048
Subkey-Type: RSA 
Subkey-Length: 2048
Name-Real: 你的英文名字
Name-Email: 你的郵箱地址
Name-Comment: ACI signing key
Expire-Date: 0
Passphrase: 簽名時(shí)的密碼
%pubring rkt.pub
%secring rkt.sec
%commit
%echo done

然后用下面的命令生成一個(gè)密鑰對(duì):

gpg --batch --gen-key gpg-batch

執(zhí)行完成后,在目錄中會(huì)多出rkt.secrkt.pub兩個(gè)文件,這就是私鑰和公鑰了。

然后就可以使用這對(duì)密鑰給鏡像簽名了:

gpg --no-default-keyring --armor --secret-keyring ./rkt.sec 
--keyring ./rkt.pub --output hello.aci.asc --detach-sig hello.aci

在提示輸入密碼時(shí),輸入在gpg-batch中設(shè)置的密碼。然后就獲得了hello.aci鏡像的簽名文件hello.aci.asc。

再次嘗試運(yùn)行容器:

$ sudo rkt run hello.aci
openpgp: signature made by unknown entity

這次提示的錯(cuò)誤是,簽名文件雖然找到了,但是這個(gè)簽名的來(lái)源并沒有在信任列表中。為了將簽名添加到信任里面里面,首先要用rkt.secrkt.pub這兩個(gè)二進(jìn)制的密鑰文件導(dǎo)出為一個(gè)文本的公鑰文件。

gpg --no-default-keyring --armor --secret-keyring ./rkt.sec 
--keyring ./rkt.pub --export 在gpg-batch中的郵箱 > pubkeys.gpg

然后將這個(gè)文本文件中的公鑰添加到Rkt的信任列表中。

$ sudo rkt trust --root pubkeys.gpg
Prefix: ""
Key: "pubkeys.gpg"
GPG key fingerprint is: 37E2 6071 5382 5868 5A0D  1356 98A9 5E24 6E19 7AED
    Subkey fingerprint: 46AF 81E4 77D4 BFCA DFCE  73C6 3D94 79C2 2611 F243
    Kelsey Hightower (ACI signing key) 
Are you sure you want to trust this key (yes/no)? yes
Trusting "pubkeys.gpg" for prefix "".
Added root key at "/etc/rkt/trustedkeys/root.d/37e26071538258685a0d135698a95e246e197aed"

這次運(yùn)行容器,就可以看到容器中的Hello程序已經(jīng)正確的執(zhí)行了。

$ sudo rkt run hello.aci
rkt: signature verified:
  Kelsey Hightower (ACI signing key) <kelsey.hightower@coreos.com>
Hello AppC

鏡像的倉(cāng)庫(kù)

最后簡(jiǎn)單的介紹一下AppC的鏡像倉(cāng)庫(kù)(Image Repository)。

AppC規(guī)范定義了獲取鏡像的URL,其形式大致是域名/鏡像路徑:版本,例如CoreOS提供的包含Etcd的鏡像可以通過(guò)命令rkt fetch coreos.com/etcd:v2.0.9來(lái)獲取。

這里只說(shuō)兩個(gè)比較有意思的地方。

首先,AppC是沒有所謂“官方鏡像倉(cāng)庫(kù)”的,所以URL中的域名部分始終會(huì)存在。由CoreOS公司提供的鏡像被放在coreos.com域名下的普通倉(cāng)庫(kù)中。這一點(diǎn)也符合AppC標(biāo)準(zhǔn)開放化的初衷。

其次,AppC會(huì)對(duì)用戶的URL嘗試通過(guò)兩種方式解析。換句話說(shuō),鏡像倉(cāng)庫(kù)的實(shí)現(xiàn)方式可以有兩種。第一種幾乎不需要額外的配置工作,將鏡像依照一定的命名規(guī)則放在域名的相應(yīng)路徑下即可,例如coreos.com/etcd:v2.0.9,如果使用第一種方式建倉(cāng)庫(kù),相應(yīng)的鏡像就應(yīng)該保存在https://coreos.com/etcd-v2.0.9-linux-amd64.aci(當(dāng)然,CoreOS的鏡像實(shí)際上是用的第二種方式,所以這個(gè)路徑不存在)。第二種方式更加靈活,但需要額外的程序來(lái)處理鏡像地址的映射,具體過(guò)程,不再詳述。

此外,前面介紹過(guò),對(duì)于內(nèi)網(wǎng)環(huán)境,還可以直接使用HTTP路徑獲取鏡像。舉個(gè)栗子,把之前制作好的鏡像文件hello.aci和簽名文件hello.aci.asc放到一個(gè)目錄里面,然后在這個(gè)目錄中啟動(dòng)一個(gè)簡(jiǎn)易的HTTP服務(wù):

$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...

在任意另一個(gè)主機(jī)上就可以直接使用HTTP全路徑下載鏡像了。

$ sudo rkt fetch http://<服務(wù)器IP>:8000/hello.aci
... ...
Downloading ACI: [        ] 1.26 KB/358 KB
sha512-f7a2feff02a07ed7c604c14133b7aede

這種簡(jiǎn)單粗暴到無(wú)以復(fù)加的方式,對(duì)于懶人們也許算得上是一種福利,然而不論是從安全性還是鏡像版本的可管理性上看來(lái),其能力都相當(dāng)弱。這從一個(gè)側(cè)面說(shuō)明,一些為開發(fā)者們提供的便利通道,如果沒有規(guī)范的約束,可能帶來(lái)很大的隱患。在實(shí)際運(yùn)用時(shí),建議遵循AppC的URL解析規(guī)范設(shè)計(jì)倉(cāng)庫(kù)為上策。

到此,關(guān)于“CoreOS Rkt容器鏡像怎么制作”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

當(dāng)前名稱:CoreOSRkt容器鏡像怎么制作
標(biāo)題網(wǎng)址:http://bm7419.com/article36/jdissg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、網(wǎng)站營(yíng)銷外貿(mào)建站、關(guān)鍵詞優(yōu)化、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)