摘要:相關工具本文將用到三個工具,分別是和。根據生成的的就是運行容器時需要的東西的集合。使用運行該有了后,就可以用來運行該容器了這里直接用的代替命令,如果你自己編譯了的,那么用命令也是一樣的。
上一篇介紹了image的格式,這里我們就來用一下hello-world這個image,看怎么輸出和docker run hello-world同樣的內容。
相關工具本文將用到三個工具,分別是skopeo、oci-image-tools和runc。
skopeo: 用來從Docker Hub上拉取image,并保存為OCI格式
oci-image-tools: 包含幾個用來操作本地image的工具
runc: 運行容器
runc可以用docker自帶的docker-runc命令替代,效果是一樣的,skopeo的安裝可以參考上一篇最后的介紹或者github上的主頁,oci-image-tools的安裝請參考github上的主頁。
獲取hello-world的image利用skopeo獲得hello-world的oci格式的image
dev@debian:~/images$ skopeo copy docker://hello-world oci:hello-world dev@debian:~/images$ tree hello-world/ hello-world/ ├── blobs │?? └── sha256 │?? ├── 0a2ad94772e366c2b7f2266ca46daa0c38efe08811cf1c1dee6558fcd7f2b54e │?? ├── 78445dd45222097f5f8d5a16e48dc19c4ca162dcdb80010ab6f1ccfc7e2c0fa3 │?? └── 998a60597add14861de504277c0d850e9181b1768011f51c7daaf694dfe975ef ├── oci-layout └── refs └── latest
然后我們看看hello-world這個image的文件系統都有些什么文件
#利用oci-image-tool unpack,將image解壓到hello-world-filesystem目錄 dev@debian:~/images$ mkdir hello-world-filesystem dev@debian:~/images$ oci-image-tool unpack --ref latest hello-world hello-world-filesystem dev@debian:~/images$ tree hello-world-filesystem/ hello-world-filesystem/ └── hello 0 directories, 1 file dev@debian:~/images$ file hello-world-filesystem/hello hello-world-filesystem/hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=4999eecfa472a2341b53954c0eca1e893f01305c, stripped
從上面的結果可以看出,hello-world這個image就只包含一個名字叫做hello的靜態鏈接的可執行文件。
根據image生成runtime的bundleruntime的bundle就是運行容器時需要的東西的集合。
dev@debian:~/images$ mkdir hello-world-bundle dev@debian:~/images$ oci-image-tool create --ref latest hello-world hello-world-bundle dev@debian:~/images$ tree hello-world-bundle hello-world-bundle ├── config.json └── rootfs └── hello 1 directory, 2 files
從這里生成的bundle可以看出,bundle里面就是一個配置文件加上rootfs,rootfs里面的東西就是image里面的文件系統部分,config.json是對容器的描述,比如rootfs的路徑,容器啟動后要運行什么命令等,后續介紹runtime標準的時候再詳細介紹。
使用runc運行該bundle有了bundle后,就可以用runc來運行該容器了
這里直接用docker的docker-runc代替runc命令,如果你自己編譯了opencontainer的runc,那么用runc命令也是一樣的。
dev@debian:~/images$ cd hello-world-bundle/ #oci-image-tool幫我們生成的config文件版本和runc需要的版本不一致, #所以這里先將它刪掉,然后用runc spec命令生成一個默認的config文件 dev@debian:~/images/hello-world-bundle$ rm config.json dev@debian:~/images/hello-world-bundle$ docker-runc spec #默認生成的config里面指定容器啟動的進程為sh, #我們需要將它換成我們的hello程序 #這里請用自己熟悉的編輯器修改config.json文件, #將里面的"args": ["sh"]改成"args": ["/hello"] dev@debian:~/images/hello-world-bundle$ vim config.json #然后用runc運行該容器,這里命令行里的hello是給容器取的名字, #可以是任意不和其它容器沖突的字符串 dev@debian:~/images/hello-world-bundle$ sudo docker-runc run hello Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://cloud.docker.com/ For more examples and ideas, visit: https://docs.docker.com/engine/userguide/結束語
該篇展示了如何不通過docker而運行hello-world容器,主要目的為了了解鏡像以及runc之間的關系,同時也觸發我們思考一個問題,既然我們可以繞過docker運行容器,那我們為什么還要用docker呢?
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26898.html
摘要:包含的內容本系列主要介紹三個上的項目由于只介紹核心的東西,所以不會包含下面這些項目使用語言開發,將多個相關的容器配置在一起,從而可以同時創建啟動停止和監控它們。由于本人時間安排發生變化,本系列停止更新,后面不確定是否會繼續,非常抱歉。 本人docker初學者,邊學習邊總結,一方面加深自己的理解,另一方面希望對其他想深入了解docker的同學有所幫助。 由于本人缺乏實戰經驗,錯誤在所難免...
摘要:進程啟動后,就會按照的標準準備好相關運行時環境,然后啟動進程。涉及到標準輸入輸出重定向,這里不細說這里是它們之間的交互流程流程對應的文字描述如下客戶端發送創建容器請求給,收到請求后,發現本地沒有相應的額,于是返回失敗。 在程序員的世界里,hello world是個很特殊的存在,當我們接觸一門新的語言、新的開發庫或者框架時,第一時間想了解的一般都是怎么實現一個hello world,然后...
摘要:包含的內容一個由可選和四部分組成。對于這兩種不同類型的文件格式,標準定義了兩個新的,分別是和。最新的標準里面并沒有涉及到,不過估計后續會加上。 上一篇介紹了hello-world的大概流程,那么hello-world的image里面到底包含了些什么呢?里面的格式是怎么樣的呢? image所包含的內容以及格式都是有標準的,由Open Containers Initiative(OCI)負...
摘要:首先來看看收到客戶端的啟動容器請求后,做了些什么。待上面的文件都準備好了之后,通過的方式給發送請求,通知啟動容器。主要功能是啟動并管理運行時的所有。包含容器中進程相關的一些屬性信息,后續在這個容器上執行命令時會用到這個文件。 在上一篇介紹過了docker create之后,這篇來看看docker start是怎么根據create之后的結果運行容器的。 啟動容器 在這里我們先啟動上一篇中...
閱讀 2402·2021-09-22 15:15
閱讀 647·2021-09-02 15:11
閱讀 1788·2021-08-30 09:48
閱讀 1889·2019-08-30 15:56
閱讀 1494·2019-08-30 15:52
閱讀 2048·2019-08-30 15:44
閱讀 438·2019-08-29 16:29
閱讀 1544·2019-08-29 11:06