Docker 面面觀

1. 簡介

  • 關(guān)注點(diǎn)分離(SOC)
    • 開發(fā)人員只需關(guān)心容器中運(yùn)行的應(yīng)用程序, 運(yùn)維人員只需關(guān)心如何管理容器.
    • 保持開發(fā)環(huán)境和部署的生產(chǎn)環(huán)境的一致性.
  • Docker 在虛擬化的容器執(zhí)行環(huán)境中增加了一個(gè)應(yīng)用程序部署引擎.
    • Docker 容器只能運(yùn)行在與底層宿主機(jī)相同或相似的OS 上.
  • Docker 鼓勵(lì)采用面向服務(wù)的架構(gòu)和微服務(wù)構(gòu)架.
    • Docker 推薦在單個(gè)容器中只運(yùn)行一個(gè)應(yīng)用程序或進(jìn)程.
  • Docker是C/S架構(gòu).
  • 使用Registry來保存用戶構(gòu)建的鏡像。
    • Registry 分為公有和私有。
  • 鏡像是Docker 生命周期中的構(gòu)建或打包階段.
    • 相當(dāng)于容器的”源代碼”, 體積小易于傳播.
  • 容器則是啟動(dòng)或執(zhí)行階段。
    • 容器的組成:一個(gè)鏡像格式; 一系列標(biāo)準(zhǔn)的操作; 一個(gè)執(zhí)行環(huán)境.
  • 不需要擔(dān)心管理狀態(tài)的持久性.
    • 容器的生命周期比較短,并且重建管理狀態(tài)的代價(jià)通常比傳統(tǒng)的狀態(tài)修復(fù)低.
  • 使用Linux 的namesapce 特性, 來隔離文件系統(tǒng), 進(jìn)程和網(wǎng)絡(luò).
  • copy-on-write模式使得能夠快速修改程序.

2. batteries included but removable

  • **Docker ships its own additions to Docker as late-bound, composable, optional extensions. **
    • **late-bound. **
      • 在Docker 被編譯后仍然能夠加載Extension.
      • 由于Go 語言沒有動(dòng)態(tài)加載庫, 所以Extension需要out-of-process.
    • **Composable. **
      • 多個(gè)無關(guān)的Extensions 能夠同時(shí)被加載.
    • **Optional. **
      • 能夠使用其它廠商的實(shí)現(xiàn),來替換掉Docker 內(nèi)置默認(rèn)的extension.
  • Docker 的目標(biāo)是作為構(gòu)建應(yīng)用程序的平臺(tái).
  • Docker的困境:
    • 選擇1: 僅局限為container runtime, 然后讓生態(tài)給其提供附加功能.
    • 選擇2: 自己把附加功能實(shí)現(xiàn).
    • Docker的做法: 自己會(huì)提供附加功能和工具, 但是允許用戶替換為自己的實(shí)現(xiàn).

3. Volume

  • Docker 鏡像是由多個(gè)文件系統(tǒng)(只讀層)疊加而成.
    • 容器啟動(dòng)時(shí), 會(huì)加載只讀層并在其上自動(dòng)添加讀寫層.
    • 當(dāng)容器中修改文件時(shí), 將只讀層復(fù)制到讀寫層, 并隱藏只讀層.
    • 容器的修改, ?不會(huì)反應(yīng)到鏡像中.
    • Union File System(聯(lián)合文件系統(tǒng)): 只讀層和頂部的讀寫層的組合.
  • Volume 是目錄或文件.
    • 用以繞過默認(rèn)的聯(lián)合文件系統(tǒng), 而以正常的文件目錄形式存在于宿主機(jī)上.
    • 目的: 分離容器以及容器產(chǎn)生的數(shù)據(jù).

4. Container link

  - - - link <name/id>:alias
  1. Container擁有內(nèi)部網(wǎng)絡(luò)和IP地址.
  • -p可以綁定容器端口到host機(jī)上的特定/隨機(jī)端口.

  • 同時(shí)可以指定使用的協(xié)議(tcp/udp).

  • 使用link system鏈接.

    • 信息可以在source 和recipient 之間傳遞.
    • naming的重要性.
      • Docker依賴于命名來建立link.
      • 使用- - name選項(xiàng)來指定名稱.
      • 優(yōu)勢(shì):不需要在網(wǎng)絡(luò)中暴露source 容器.
  • 信息傳遞方式

    1. 環(huán)境變量.
    • 自動(dòng)在target 容器中創(chuàng)建環(huán)境變量, 并暴露source容器的所有環(huán)境變量.
      • 做法:
        • source容器dockerfile 中的ENV命令;
        • docker run命令的-e, —env, —env-file選項(xiàng)
    • 這些變量會(huì)被所有鏈接到source 容器的容器共享.
      • 如果有敏感信息, 會(huì)有泄漏的風(fēng)險(xiǎn).
    • 當(dāng)source 容器重啟后, 環(huán)境變量中存儲(chǔ)的IP 地址不會(huì)自動(dòng)更新.
      • 推薦使用/etc/hosts 來解析鏈接的容器的IP地址.
    • 更新/etc/hosts文件.
      • 對(duì)于target 容器, 會(huì)自動(dòng)創(chuàng)建兩個(gè)項(xiàng)目:
        • 使用容器ID作為host名稱的.
        • source 容器和IP的鏈接alias.
      • 當(dāng)source 容器重啟后, 文件內(nèi)的IP 會(huì)自動(dòng)更新.

4. - Dockerfile

4.1 指導(dǎo)原則:

  • ephemeral container.
    • 使用最小的set-up和配置來重建容器.
  • 避免安裝不必要的包.
  • 使用.dockerignore文件.
  • 一個(gè)container只運(yùn)行單一process. 易于水平擴(kuò)展和container復(fù)用.
    • 如果需要依賴,使用container link.
  • 最小化layer數(shù)目.
    • 在dockerfile 的可讀性和layer 數(shù)目之間做平衡.
  • 多行參數(shù),且每行以\結(jié)尾.

4.2 build cache

  • 在創(chuàng)建過程中,在沒有指定—no-cahe選項(xiàng)時(shí),會(huì)首先查看是否能重用cache.
  • 以cache 中以已創(chuàng)建的base image 為起始, 之后的命令只會(huì)處理子image與其的差別部分.
  • 在add/copy 指令中,存入image 的文件中的內(nèi)容會(huì)被檢查.
    • checksum 會(huì)被建立并用在cache lookup.
  • 其它指令,不會(huì)檢查容器中的文件來決定cache match. 而使用命令字符串來查找match.
  • 一旦cache 失效, 之后的command 會(huì)生成新的image.

4.3 Commands

  • From.盡可能以官方repo作為base image.
  • Run. apt-get update & install -y
  • CMD. 運(yùn)行image中的軟件.
  • Expose. 容器會(huì)監(jiān)聽的端口號(hào).
  • ENV.
    • 為了運(yùn)行新軟件,使用ENV Path來更新PATH環(huán)境變量
    • 需要容器化的環(huán)境變量.
    • 指定軟件的Version 信息.
  • ADD/COPY.
    • copy只支持從本地文件到容器的拷貝.
    • 而add支持解壓縮和遠(yuǎn)程URL, 非常適合于自動(dòng)解壓本地文件到容器.
    • 當(dāng)多個(gè)步驟需要多個(gè)file執(zhí)行時(shí),逐文件的copy會(huì)減少cache失效(僅當(dāng)單獨(dú)特定步驟的文件過時(shí)時(shí)).
    • 出于image尺寸考慮.使用add來獲取remote URL內(nèi)容應(yīng)避免.而使用curl/wget.
    • 除了需要使用自動(dòng)解壓縮能力外,優(yōu)先使用copy.
  • EntryPoint. 設(shè)置image的main命令.
  • Volume. 暴露數(shù)據(jù)庫的存儲(chǔ)區(qū)域, 配置存儲(chǔ), 和容器中創(chuàng)建的文件/目錄.
  • User. 改變no-root 用戶.

5. Orchestration

  1. 保證分布式應(yīng)用系統(tǒng)的可移植性(Portability).
  • 多個(gè)小App組成的松耦合的程序架構(gòu), 每個(gè)App都能獨(dú)立地變化.
  • 無縫的程序portability:
    • dev 在 dev-build-test 期間使用工具build/ship 程序.
    • 而IT 也能用相同的工具在跨環(huán)境和云的情形中run-manage-move 程序.
  • Docker Machine
    • “zero to Docker” in minutes.
    • [machine create]命令自動(dòng)在宿主機(jī)上創(chuàng)建和安裝docker.
  • Docker Swarm
    • 本地Docker Engines集群. schedule應(yīng)用容器的capability.與生態(tài)系統(tǒng)結(jié)合.
    • discovery token來discovery & agent registration.
  • Docker Compose
    • 針對(duì)多容器分布式系統(tǒng), 簡化 build&ship 操作.
    • 使用YAML文件定義子系統(tǒng)及相互關(guān)聯(lián)(link).
    • ?啟動(dòng)步驟:
      1. 在dockerfile 中定義app環(huán)境.
      • 在docker-compose.yml 中定義組成app的各個(gè)service.
      • 運(yùn)行docker-compose up命令來啟動(dòng)運(yùn)行整個(gè)app.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,606評(píng)論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,582評(píng)論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,540評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,028評(píng)論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,801評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,223評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,294評(píng)論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,442評(píng)論 0 289
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,976評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,800評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,996評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,543評(píng)論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,233評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,926評(píng)論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,702評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,991評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載自 http://blog.opskumu.com/docker.html 一、Docker 簡介 Docke...
    極客圈閱讀 10,520評(píng)論 0 120
  • 五、Docker 端口映射 無論如何,這些 ip 是基于本地系統(tǒng)的并且容器的端口非本地主機(jī)是訪問不到的。此外,除了...
    R_X閱讀 1,774評(píng)論 0 7
  • Docker學(xué)習(xí)總結(jié)之Run命令介紹 - vikings`s blog - 博客園http://www.cnblo...
    葡萄喃喃囈語閱讀 1,221評(píng)論 0 1
  • 一、Docker 簡介 Docker 兩個(gè)主要部件:Docker: 開源的容器虛擬化平臺(tái)Docker Hub: 用...
    R_X閱讀 4,403評(píng)論 0 27
  • 三觀是什么? 三觀就是世界觀、人生觀、價(jià)值觀。 簡單來說,世界觀就是你怎么看待世界的,即你對(duì)世界的理解;人生觀是人...
    蛙蛙123閱讀 368評(píng)論 0 0