docker 基礎(chǔ)(3) 隨筆

談到 Docker 我們不得不說以下三個(gè)技術(shù)

  • Linux namespace
  • CGroups
  • UnionFS

這些技術(shù)是 docker 實(shí)現(xiàn)了容器隔離和文件資源共享一些關(guān)鍵技術(shù)。只有理解這些技術(shù)我們才能夠真正

在從鏡像倉庫中 pull 一個(gè)鏡像(Image)時(shí)候,通常會(huì)列出 pull 很多鏡像而非只是 pull 我們想要的依賴鏡像惧浴。從這我們就很清楚這些鏡像是有依賴關(guān)系叛买。依賴關(guān)系目的是什么匹摇,就是為了資源共享槐脏,將一些可以功能獨(dú)立出來進(jìn)行共享喘垂,這是我們?cè)谠O(shè)計(jì)應(yīng)用废离、語言甚至系統(tǒng)都需要考慮關(guān)系侄泽。

任何程序運(yùn)行時(shí)都會(huì)有依賴,無論是開發(fā)語言層的依賴庫蜻韭,還是各種系統(tǒng) lib悼尾、操作系統(tǒng)等,不同的系統(tǒng)上這些庫可能是不一樣的肖方,或者有缺失的闺魏。為了讓容器運(yùn)行時(shí)一致,docker將依賴的操作系統(tǒng)俯画、各種 lib 依賴整合打包在一起(即鏡像)析桥,然后容器啟動(dòng)時(shí),作為的根目錄(根文件系統(tǒng)rootfs),使得容器進(jìn)程的各種依賴調(diào)用都在這個(gè)根目錄里泡仗,這樣就做到了環(huán)境的一致性

unionFS

聯(lián)合文件系統(tǒng)(Union File System):聯(lián)合文件系統(tǒng)可以把多個(gè)目錄(也叫分支)內(nèi)容聯(lián)合掛載(注意這里是掛載)到同一個(gè)目錄下埋虹,而目錄的物理位置是分開的。

寫時(shí)復(fù)制 (copy-on-write) 功能娩怎,寫時(shí)復(fù)制也叫隱式共享搔课,首先我們要明確寫時(shí)復(fù)制是一種技術(shù), UnionFS 可以把只讀可讀寫文件系統(tǒng)合并在一起截亦,虛擬上允許只讀文件系統(tǒng)的修改可以保存到可寫文件系統(tǒng)當(dāng)中爬泥。

AUFS

AUFS(Advanced multi-layered unification filesystem): AUFS 完全重寫了早期的 UnionFS 1.x,其主要目的是為了可靠性性能魁巩,并且引入了一些新的功能急灭,比如可寫分支的負(fù)載均衡。AUFS 的一些實(shí)現(xiàn)已經(jīng)被納入U(xiǎn)nionFS 2.x版本谷遂。

層的概念(Layers)

想到層葬馋,每一個(gè)鏡像其實(shí)都是通過一層一層鏡像(從基礎(chǔ))嵌套而來,所以是有先后順序肾扰,有順序數(shù)據(jù)結(jié)構(gòu)我們就自然會(huì)想到棾胨唬或者隊(duì)列這樣數(shù)據(jù)結(jié)構(gòu),他們都是按一定順序存儲(chǔ)數(shù)據(jù)結(jié)構(gòu)
(Tomcat(JDK8(kernel)))集晚。

每一個(gè) Docker image 都是由一系列的read-only layers組成窗悯。image layers的內(nèi)容都存儲(chǔ)在Docker hosts filesystem/var/lib/docker/aufs/diff目錄下。而/var/lib/docker/aufs/layers目錄則存儲(chǔ)著image layer如何堆棧這些layer的metadata偷拔。

準(zhǔn)備一臺(tái)安裝了Docker 1.11.2ECS蒋院。在沒有拉取任何鏡像,啟動(dòng)任何容器的情況下莲绰,執(zhí)行ls /var/lib/docker/aufs/diff命令欺旧,發(fā)現(xiàn)目錄沒有存儲(chǔ)任何內(nèi)容。拉取Ubuntu:15.04鏡像蛤签,然后再次執(zhí)行ls /var/lib/docker/aufs/diff命令辞友。我們可以看到在docker pull的結(jié)果顯示ubuntu:15.04鏡像一共有 4 個(gè) layers,在執(zhí)行ls /var/lib/docker/aufs/diff命令的結(jié)果中也有四個(gè)對(duì)應(yīng)的存儲(chǔ)文件目錄震肮。這里有一點(diǎn)需要說明的是称龙,自從Docker 1.10之后,diff目錄下的存儲(chǔ)鏡像layer文件夾不再與鏡像ID相同戳晌。最后cat /var/lib/docker/aufs/layers/6bb19cb345da470e015ba3f1ca049a1c27d2c57ebc205ec165d2ad8a44e148ea命令列出來的是堆棧里位于6bb19cb345da470e015ba3f1ca049a1c27d2c57ebc205ec165d2ad8a44e148ea layer下方的layers鲫尊。

func NewDaemon(ctx context.Context, config *config.Config, pluginStore *plugin.Store) (daemon *Daemon, err error) {
    //...
    for operatingSystem, gd := range d.graphDrivers {
        layerStores[operatingSystem], err = layer.NewStoreFromOptions(layer.StoreOptions{
            Root:                      config.Root,
            MetadataStorePathTemplate: filepath.Join(config.Root, "image", "%s", "layerdb"),
            GraphDriver:               gd,
            GraphDriverOptions:        config.GraphOptions,
            IDMapping:                 idMapping,
            PluginGetter:              d.PluginStore,
            ExperimentalEnabled:       config.Experimental,
            OS:                        operatingSystem,
        })
    }
    //...
}

func NewStoreFromOptions(options StoreOptions) (Store, error) {
    driver, err := graphdriver.New(options.GraphDriver, options.PluginGetter, graphdriver.Options{
        Root:                options.Root,
        DriverOptions:       options.GraphDriverOptions,
        UIDMaps:             options.IDMapping.UIDs(),
        GIDMaps:             options.IDMapping.GIDs(),
        ExperimentalEnabled: options.ExperimentalEnabled,
    })
    //...
}

// New creates the driver and initializes it at the specified root.
func New(name string, pg plugingetter.PluginGetter, config Options) (Driver, error) {
    //...
    driversMap := scanPriorDrivers(config.Root)
    list := strings.Split(priority, ",")
    logrus.Debugf("[graphdriver] priority list: %v", list)
    for _, name := range list {
        if name == "vfs" {
            // don't use vfs even if there is state present.
            continue
        }
        if _, prior := driversMap[name]; prior {
            driver, err := getBuiltinDriver(name, config.Root, config.DriverOptions, config.UIDMaps, config.GIDMaps)
            //...
            return driver, nil
        }
    }
    //...
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市沦偎,隨后出現(xiàn)的幾起案子马昨,更是在濱河造成了極大的恐慌竞帽,老刑警劉巖扛施,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸿捧,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡疙渣,警方通過查閱死者的電腦和手機(jī)匙奴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妄荔,“玉大人泼菌,你說我怎么就攤上這事±沧猓” “怎么了哗伯?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)篷角。 經(jīng)常有香客問我焊刹,道長(zhǎng),這世上最難降的妖魔是什么恳蹲? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任虐块,我火速辦了婚禮,結(jié)果婚禮上嘉蕾,老公的妹妹穿的比我還像新娘贺奠。我一直安慰自己,他們只是感情好错忱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布儡率。 她就那樣靜靜地躺著,像睡著了一般以清。 火紅的嫁衣襯著肌膚如雪儿普。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天玖媚,我揣著相機(jī)與錄音箕肃,去河邊找鬼。 笑死今魔,一個(gè)胖子當(dāng)著我的面吹牛勺像,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播错森,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吟宦,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了涩维?” 一聲冷哼從身側(cè)響起殃姓,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤袁波,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蜗侈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體篷牌,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年踏幻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了枷颊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡该面,死狀恐怖夭苗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情隔缀,我是刑警寧澤题造,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站猾瘸,受9級(jí)特大地震影響界赔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜须妻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一仔蝌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荒吏,春花似錦敛惊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至儡湾,卻和暖如春特恬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背徐钠。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工癌刽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尝丐。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓显拜,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親爹袁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子远荠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355