走進docker系列:開篇

本人docker初學者,邊學習邊總結,一方面加深本身的理解,另外一方面但願對其餘想深刻了解docker的同窗有所幫助。git

因爲本人缺少實戰經驗,錯誤在所不免,歡迎批評指正,謝謝。程序員

包含的內容

本系列主要介紹三個github上的項目: mobycontainerdrunc.github

因爲只介紹docker核心的東西,因此不會包含下面這些項目:chrome

  • compose:使用Python語言開發,將多個相關的容器配置在一塊兒,從而能夠同時建立、啓動、中止和監控它們。
  • machine:幫助安裝docker到指定位置,包括本地虛擬機、遠端雲主機等,同時還管理這些主機的信息,能夠很方便的操做安裝在不一樣主機上的這些docker。
  • kitematic:桌面版的docker客戶端(圖形界面),使用JavaScript基於electron開發。
  • toolbox:幫助安裝docker環境到Windows和Mac平臺,包括Docker引擎、Compose、 Machine和 Kitematic,固然docker引擎是安裝在虛擬機裏面的,本地只有客戶端,使用哪一個虛擬機依賴於平臺,toolbox會幫你搞定這一切。
  • distributionRegistry 2.0的實現,主要是管理和分發docker鏡像,Docker Hub背後的技術。
  • swarmkit:嵌入在docker裏面的容器編排系統,能夠簡單的把它和docker的關係理解成IE瀏覽器和Windows的關係,捆綁銷售。

面向讀者

本系列主要專一docker背後的技術和實現思路不介紹怎麼使用docker,不介紹代碼細節docker

  • 若是你是docker初學者,想了解怎麼使用docker,那麼本系列不適合你。
  • 若是你已經熟悉了基本的操做,想了解下高級點的參數,或者想了解背後到底發生了什麼,便於本身更好的使用docker,更好的解決碰到的問題,那麼本系列適合你。
  • 若是你是一名開發人員,想了解docker的代碼實現細節,但又不知道從何處下手,本系列也許會給你一些啓發。

docker版本

自從docker決定將swarm整合進來弄企業版以後,代碼一直在調整,docker的一些目錄和程序名稱也在發生變化,因此本系列的內容無法覆蓋全部docker版本,只能挑其中的一個。segmentfault

自v17.03開始,docker採用了新的發行方式,版本的發行週期變成了一個月一次,而且也分了企業版和社區版,在本系列中,將以v17.03社區版做爲參考,建議你們閱讀本系列時,手頭的docker版本不低於v17.03。api

docker完整的變動列表請參考這裏瀏覽器

docker和moby的關係

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相關的代碼

因爲如今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的信息:

注意:

  • 多是爲了方便對runc進行修改,docker將github.com/opencontainers/runc克隆到了github.com/docker/runc,在docker v17.03裏面,runc是從github.com/docker/runc.git拉的代碼,而後放在本地的opencontainers/runc目錄下,僞裝是opencontainers的runc,這個須要留意,別pull了錯誤的庫。
  • 上面顯示containerd的地址是https://github.com/docker/con...,這個沒有關係,github已經將這個地址重定向到了https://github.com/containerd...
相關文章
相關標籤/搜索