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 鼓勵采用面向服務(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)于容器的”源代碼”, 體積小易于傳播.
  • 容器則是啟動或執(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 語言沒有動態(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)用程序的平臺.
  • Docker的困境:
    • 選擇1: 僅局限為container runtime, 然后讓生態(tài)給其提供附加功能.
    • 選擇2: 自己把附加功能實(shí)現(xiàn).
    • Docker的做法: 自己會提供附加功能和工具, 但是允許用戶替換為自己的實(shí)現(xiàn).

3. Volume

  • Docker 鏡像是由多個(gè)文件系統(tǒng)(只讀層)疊加而成.
    • 容器啟動時(shí), 會加載只讀層并在其上自動添加讀寫層.
    • 當(dāng)容器中修改文件時(shí), 將只讀層復(fù)制到讀寫層, 并隱藏只讀層.
    • 容器的修改, ?不會反應(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)勢:不需要在網(wǎng)絡(luò)中暴露source 容器.
  • 信息傳遞方式

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

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

4.3 Commands

  • From.盡可能以官方repo作為base image.
  • Run. apt-get update & install -y
  • CMD. 運(yùn)行image中的軟件.
  • Expose. 容器會監(jiān)聽的端口號.
  • ENV.
    • 為了運(yùn)行新軟件,使用ENV Path來更新PATH環(huán)境變量
    • 需要容器化的環(huán)境變量.
    • 指定軟件的Version 信息.
  • ADD/COPY.
    • copy只支持從本地文件到容器的拷貝.
    • 而add支持解壓縮和遠(yuǎn)程URL, 非常適合于自動解壓本地文件到容器.
    • 當(dāng)多個(gè)步驟需要多個(gè)file執(zhí)行時(shí),逐文件的copy會減少cache失效(僅當(dāng)單獨(dú)特定步驟的文件過時(shí)時(shí)).
    • 出于image尺寸考慮.使用add來獲取remote URL內(nèi)容應(yīng)避免.而使用curl/wget.
    • 除了需要使用自動解壓縮能力外,優(yōu)先使用copy.
  • EntryPoint. 設(shè)置image的main命令.
  • Volume. 暴露數(shù)據(jù)庫的存儲區(qū)域, 配置存儲, 和容器中創(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]命令自動在宿主機(jī)上創(chuàng)建和安裝docker.
  • Docker Swarm
    • 本地Docker Engines集群. schedule應(yīng)用容器的capability.與生態(tài)系統(tǒng)結(jié)合.
    • discovery token來discovery & agent registration.
  • Docker Compose
    • 針對多容器分布式系統(tǒng), 簡化 build&ship 操作.
    • 使用YAML文件定義子系統(tǒng)及相互關(guān)聯(lián)(link).
    • ?啟動步驟:
      1. 在dockerfile 中定義app環(huán)境.
      • 在docker-compose.yml 中定義組成app的各個(gè)service.
      • 運(yùn)行docker-compose up命令來啟動運(yùn)行整個(gè)app.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容