本人docker初學者,邊學習邊總結,一方面加深本身的理解,另外一方面但願對其餘想深刻了解docker的同窗有所幫助。git
因爲本人缺少實戰經驗,錯誤在所不免,歡迎批評指正,謝謝。程序員
本系列主要介紹三個github上的項目: moby、containerd、runc.github
因爲只介紹docker核心的東西,因此不會包含下面這些項目:chrome
本系列主要專一docker背後的技術和實現思路,不介紹怎麼使用docker,不介紹代碼細節。docker
自從docker決定將swarm整合進來弄企業版以後,代碼一直在調整,docker的一些目錄和程序名稱也在發生變化,因此本系列的內容無法覆蓋全部docker版本,只能挑其中的一個。segmentfault
自v17.03開始,docker採用了新的發行方式,版本的發行週期變成了一個月一次,而且也分了企業版和社區版,在本系列中,將以v17.03社區版做爲參考,建議你們閱讀本系列時,手頭的docker版本不低於v17.03。api
docker完整的變動列表請參考這裏。瀏覽器
2017-04-18,在DockerCon 2017上,docker公司正式宣佈成立moby項目,同時將github上的docker/docker項目重命名成了moby/moby,雖然會自動重定向,但代碼裏的相關引用不排除會有問題,須要留意。bash
這裏不評價此次變化,對普通使用者來講,不會發生任何變化,仍是熟悉的命令,熟悉的參數,對開發人員來講,代碼的位置變了,但代碼仍是那份代碼。網絡
之後moby會變成什麼樣,如今還不清楚,有可能和docker的關係會變成blink和chrome的關係同樣,靜觀其變,但願不要影響咱們學習。
注意:若沒有特別說明,本系列提到的docker源碼,都指的是moby的代碼
該系列的全部文章都會列在這裏,便於你們選擇閱讀。因爲本人時間安排發生變化,本系列中止更新,後面不肯定是否會繼續,很是抱歉。
在閱讀本系列以前,若是對Linux不是很熟的話,建議先閱讀本人的Linux程序員專欄,裏面包含了內存、CPU、文件系統、網絡、namespace、cgroup等方面的詳細內容,和docker相關的Linux知識還在更新中,敬請關注。
因爲如今docker依賴的containerd和runc是github上兩個單獨的項目,若是你須要分析docker的代碼,請確保containerd和runc的版本和docker的版本是一致的,檢查辦法以下:
#假設咱們已經將docker的源代碼clone到了/home/dev/repos/docker目錄下 dev@debian:~/repos/docker$ git branch * master #列出17.03相關的tag dev@debian:~/repos/docker$ git tag|grep 17.03 v17.03.0-ce v17.03.0-ce-rc1 v17.03.1-ce v17.03.1-ce-rc1 #取最新的v17.03.1-ce dev@debian:~/repos/docker$ git checkout -b v17.03.1-ce v17.03.1-ce Switched to a new branch 'v17.03.1-ce' dev@debian:~/repos/docker$ git branch master * v17.03.1-ce #查看docker所用的runc和containerd的commit id dev@debian:~/repos/docker$ egrep "RUNC_COMMIT|CONTAINERD_COMMIT" ./hack/dockerfile/binaries-commits # When updating RUNC_COMMIT, also update runc in vendor.conf accordingly RUNC_COMMIT=54296cf40ad8143b62dbcaa1d90e520a2136ddfe CONTAINERD_COMMIT=4ab9917febca54791c5f071a9d1f404867857fcc #查看runc和containerd的庫路徑 dev@debian:~/repos/docker$ egrep "runc.git|containerd.git" ./hack/dockerfile/install-binaries.sh git clone https://github.com/docker/runc.git "$GOPATH/src/github.com/opencontainers/runc" git clone https://github.com/docker/containerd.git "$GOPATH/src/github.com/docker/containerd"
根據上面的結果,先將runc和containerd克隆下來,而後checkout相應的commit id,這樣就能夠配合docker的代碼一塊兒看了。這裏是上面例子中找到的containerd和runc的信息:
注意: