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.
- **late-bound. **
- 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
- 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 容器.
-
信息傳遞方式
- 環(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)更新.
- 對(duì)于target 容器, 會(huì)自動(dòng)創(chuàng)建兩個(gè)項(xià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
- 保證分布式應(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)步驟:
- 在dockerfile 中定義app環(huán)境.
- 在docker-compose.yml 中定義組成app的各個(gè)service.
- 運(yùn)行
docker-compose up
命令來啟動(dòng)運(yùn)行整個(gè)app.