容器技術(shù)的發(fā)展可以分為兩個(gè)階段,第一個(gè)階段聚焦在IaaS層,僅僅把容器當(dāng)做更輕量級虛擬機(jī)來使用,解決了應(yīng)用運(yùn)行時(shí)進(jìn)程級資源隔離的問題;隨著Docker的出現(xiàn),容器虛擬化才有了統(tǒng)一的平臺,由此容器技術(shù)發(fā)展到了第二個(gè)階段,開始聚焦在PaaS層,以應(yīng)用為中心,統(tǒng)一應(yīng)用分發(fā)標(biāo)準(zhǔn),實(shí)現(xiàn)DevOps。 本篇將針對操作系統(tǒng)、主機(jī)配置、容器鏡像、容器運(yùn)行時(shí)、Docker Daemon參數(shù)、Docker Daemon權(quán)限六大方面分享一些docker的運(yùn)維經(jīng)驗(yàn); 操作系統(tǒng)1.支持的操作系統(tǒng)類型目前Docker官方支持的操作系統(tǒng)包含桌面版、服務(wù)器版、云提供商以及容器操作系統(tǒng),具體如下: 2.操作系統(tǒng)的選擇標(biāo)準(zhǔn)有關(guān)操作系統(tǒng)的選擇不能一概而論。首先,企業(yè)本身也有對操作系統(tǒng)的規(guī)定;其次,應(yīng)用的不同也要求的操作系統(tǒng)不同;基于以上兩點(diǎn),若沒有其他要求,相對而言采用容器操作系統(tǒng)有很大的優(yōu)勢。 
容器操作系統(tǒng)相對于其他操作系統(tǒng)的優(yōu)勢有以下幾點(diǎn): 精簡安全:容器操作系統(tǒng)只包含運(yùn)行容器所需的必要軟件和必要的管理工具,相比傳統(tǒng)的操作系統(tǒng)而言會(huì)精簡很多;所有應(yīng)用通過容器的方式運(yùn)行,從而使操作系統(tǒng)和應(yīng)用軟件隔離開來,極大降低了出現(xiàn)安全漏洞的概率; 升級回滾:系統(tǒng)采用可回滾的雙分區(qū)模式,活動(dòng)的分區(qū)通過只讀方式掛載,另外一個(gè)分區(qū)用來自動(dòng)更新, 通過切換系統(tǒng)分區(qū)即可實(shí)現(xiàn)快速升級,升級出現(xiàn)問題時(shí),可以快速切換回原來的分區(qū)保證系統(tǒng)可用; 集群模式:在系統(tǒng)安裝的時(shí)候便可自動(dòng)加入內(nèi)置的ETCD集群中,每個(gè)系統(tǒng)都可以通過本機(jī)的ETCD讀取或發(fā)布配置信息和狀態(tài)數(shù)據(jù),通過選舉形式在服務(wù)器之中選舉Leader來同步數(shù)據(jù),并以此確保集群之內(nèi)信息始終可用;
主機(jī)配置從安全性、穩(wěn)定性、可靠性來講,如何合理規(guī)劃Docker運(yùn)行環(huán)境非常重要,也是Docker運(yùn)維的基礎(chǔ)條件,下面會(huì)從容器分區(qū)、系統(tǒng)內(nèi)核、Docker版本、Docker Daemon訪問控制及日志審計(jì)來講講怎么規(guī)劃: 單獨(dú)為容器劃分一個(gè)分區(qū)作為容器的存儲(chǔ)空間:所有容器的數(shù)據(jù)、元數(shù)據(jù)默認(rèn)都存儲(chǔ)在/var/lib/docker下(當(dāng)然可以修改docker容器默認(rèn)的存儲(chǔ)路徑),很容易造成爭搶磁盤空間,導(dǎo)致系統(tǒng)崩潰,推薦在內(nèi)部存儲(chǔ)中單獨(dú)劃分一個(gè)分區(qū)掛載到該目錄上,同樣的方法也可以使用外部存儲(chǔ); 使用比較新且穩(wěn)定的Linux內(nèi)核:官方推薦Linux內(nèi)核版本為3.10 ,但是有些功能模塊要求的內(nèi)核版本更高,如支持MacVlan網(wǎng)絡(luò)模塊就需要內(nèi)核版本為3.9 ,這個(gè)時(shí)候就得權(quán)衡一下Linux內(nèi)核版本的選擇,推薦采用該功能模塊推薦的內(nèi)核版本; 使用比較新且穩(wěn)定的Docker版本:官方推薦的Docker版本為1.9.1 ,但從實(shí)施和運(yùn)維經(jīng)驗(yàn)來看,推薦選擇比較穩(wěn)定的1.12.1版本; 只允許可信任的用戶來控制Docker Daemon:Docker Daemon控制需要root特權(quán),推薦將可信任的用戶加入到一個(gè)組中,并將整個(gè)組授予root特權(quán); 增加Docker Daemon及其相關(guān)文件、目錄的日志審計(jì):Docker Daemon作為Docker的后臺守護(hù)進(jìn)程,對其訪問控制、行為操作做日志審計(jì)是非常有必要的,一旦出現(xiàn)問題,很方便進(jìn)行定位,推薦增加Docker文件(docker、daemon.json、docker.service、docker.sock)和目錄(/var/lib/docker、/etc/docker、/usr/bin)的日志審計(jì);
容器鏡像鏡像是容器運(yùn)行的基礎(chǔ),所以鏡像的安全至關(guān)重要,包括基礎(chǔ)鏡像的安全、軟件包的漏洞、暴露的端口、SSH服務(wù)、非root用戶等; 使用可信任的鏡像來創(chuàng)建容器:Docker官方或非官方的鏡像有很多漏洞,若使用它們來運(yùn)行容器,很容易被攻擊,建議使用Docker官方認(rèn)證過的鏡像,或是自己構(gòu)建的鏡像(建議采用Alpine作為基礎(chǔ)鏡像),并通過漏洞掃描工具(如Clair);也可以使用容器安全產(chǎn)品,類似AppSafe之類,可以全方位的保障鏡像和容器運(yùn)行時(shí)的安全; 在容器里面盡量不要安裝不必要的軟件:不必要的軟件會(huì)占用磁盤的空間,也會(huì)增加系統(tǒng)的安全威脅;有些容器云公司也會(huì)提供鏡像瘦身的服務(wù),如有容云等; 創(chuàng)建一個(gè)非root用戶的容器:容器擁有root權(quán)限,很容易讓人通過容器的root權(quán)限攻擊所在的宿主機(jī),可以在制作鏡像的時(shí)候指定用戶,如:RUN useradd -d /home/username -m -s /bin/bash username; 開啟Docker的Content Trust選項(xiàng):Content Trust會(huì)將數(shù)據(jù)通過數(shù)字簽名發(fā)送到遠(yuǎn)程的Docker Registries或是從遠(yuǎn)程的Docker Registries接收數(shù)據(jù),用來保證鏡像在build, create, pull, push, run過程中沒有被篡改,開啟命令:export DOCKER_CONTENT_TRUST=1;
容器運(yùn)行時(shí)參數(shù)容器運(yùn)行時(shí)的一些參數(shù)設(shè)置,在整個(gè)容器運(yùn)行過程中非常重要,設(shè)置不好會(huì)嚴(yán)重影響容器的安全性、性能,下面就講講容器運(yùn)行時(shí)需要考慮設(shè)置的一些比較重要的參數(shù)。 為容器創(chuàng)建一個(gè)AppArmor Profile文件:AppArmor Profile文件里面包含了各種威脅的安全策略,通過它可以保護(hù)宿主機(jī)系統(tǒng)和應(yīng)用程序的各種威脅,設(shè)置參數(shù)如:docker run –interactive –tty –security-opt=”apparmor:PROFILENAME” centos /bin/bash。 開啟SELinux Security選項(xiàng):SELinux提供了強(qiáng)制訪問控制,增強(qiáng)了自主訪問模型,可以通過SELinux為系統(tǒng)增加一層額外的安全層,設(shè)置參數(shù)如:docker run –interactive –tty –security-opt label=level:TopSecret centos /bin/bash。 為容器限制Linux內(nèi)核的Capabilities能力:Linux把原來和超級用戶相關(guān)的高級權(quán)限劃分成為不同的單元,稱為Capability,這樣就可以獨(dú)立對特定的Capability進(jìn)行開啟或禁止,來增加容器的安全,設(shè)置參數(shù)如:docker run –interactive –tty –cap-drop=all –cap-add={“NET_ADMIN”,”SYS_ADMIN”} centos:latest /bin/bash。以只讀的模式掛載容器的root文件系統(tǒng),設(shè)置參數(shù)如:docker run –interactive –tty –read-only –volume /centdata centos /bin/bash 設(shè)置容器在失敗的時(shí)候嘗試重啟的次數(shù):若不設(shè)置的話,重啟則會(huì)不斷的嘗試重啟,參數(shù)如:docker run –detach –restart=on-failure:5 nginx。 不要掛載宿主機(jī)上敏感的目錄到容器上,或是以只讀的方式掛載:如宿主機(jī)上這些目錄:/、/boot、/dev、/etc、/lib、/proc、/sys、/usr; 在容器里面最好不要運(yùn)行ssh服務(wù):使用docker exec 或 docker attach來查看容器實(shí)例; 容器運(yùn)行時(shí)不要映射privileged的端口:處于安全考慮,privileged的TCP/IP端口約束在1024以下,一般的用戶是不能使用這個(gè)端口;
Docker Daemon參數(shù)Docker Daemon為Docker的守護(hù)進(jìn)程,大致可以分為Docker Server、Engine和Job三部分。Docker Daemon可以認(rèn)為是通過Docker Server模塊接受Docker Client的請求,并在Engine中處理請求,然后根據(jù)請求類型,創(chuàng)建出指定的Job并運(yùn)行。 以下為Docker Daemon的架構(gòu)示意圖: 
從上圖不難看出Docker Daemon的核心地位,所以它的配置也尤為重要,下文會(huì)從安全、性能方面入手,下面具體講講該怎么配置Docker Daemon參數(shù): 限制容器之間網(wǎng)絡(luò)通信:在同一臺主機(jī)上若不限制容器之間通信,容器之間就會(huì)暴露些隱私的信息,所以推薦關(guān)閉,設(shè)置參數(shù)如:docker daemon –icc=false; 日志級別設(shè)置為info:這樣除了debug信息外,可以捕獲所有的信息,設(shè)置參數(shù)如: docker daemon –log-level=”info”; 允許Docker Daemon修改iptables:這樣可以自動(dòng)避開錯(cuò)誤的網(wǎng)絡(luò)配置導(dǎo)致的容器和外部的訪問問題,設(shè)置參數(shù)如:docker daemon –iptables=true; 使用安全模式訪問鏡像倉庫:Docker Daemon支持安全模式(默認(rèn))和非安全模式(–insecure-registry)訪問鏡像倉庫,推薦鏡像倉庫配置CA證書,Docker Daemon配置安全訪問模式,采用TLS安全傳輸協(xié)議; 推薦使用Overlayfs作為Docker的存儲(chǔ)驅(qū)動(dòng):Docker支持很多種儲(chǔ)存驅(qū)動(dòng),CentOS默認(rèn)的Docker存儲(chǔ)驅(qū)動(dòng)為devicemapper,Ubuntu默認(rèn)的Docker存儲(chǔ)驅(qū)動(dòng)為aufs,那Docker儲(chǔ)存驅(qū)動(dòng)該怎么選擇呢,可以參考下圖的對比分析:

推薦為Docker Daemon配置TLS認(rèn)證:推薦指定Docker Daemon的監(jiān)聽IP、端口及unix socket,并配置TLS認(rèn)證,通過Docker Daemon的IP 端口訪問,設(shè)置參數(shù)如: ‘–tlsverify’ 、’–tlscacert’ 、’–tlscert’、’–tlskey’ ; 推薦為Docker Daemon開啟用戶空間支持: Docker Daemon支持Linux內(nèi)核的user namespace,為Docker宿主機(jī)提供了額外的安全,容器使用有root權(quán)限的用戶,則這個(gè)用戶亦擁有其宿主機(jī)的root權(quán)限,外部可以通過容器反向來操控宿主機(jī),設(shè)置參數(shù)如:docker daemon –userns-remap=default; 推薦為Docker Daemon配置默認(rèn)的CGroup:某個(gè)程序可能會(huì)出現(xiàn)占用主機(jī)上所有的資源,導(dǎo)致其他程序無法正常運(yùn)行,或者造成系統(tǒng)假死無法維護(hù),這時(shí)候用 cgroups 就可以很好地控制進(jìn)程的資源占用,設(shè)置參數(shù)如:docker daemon –cgroup-parent=/foobar; 推薦為Docker配置集中的遠(yuǎn)程日志收集系統(tǒng): Docker支持很多種日志驅(qū)動(dòng),配置集中的遠(yuǎn)程日志系統(tǒng)用來存儲(chǔ)Docker日志是非常有必要的,設(shè)置參數(shù)如:docker run –log-driver=syslog –log-opt syslog-address=tcp://ip; 推薦使用Docker Registry v2版本: v2版本在性能與安全性方面比v1都增強(qiáng)了很多,如安全性上的鏡像簽名,可設(shè)置參數(shù)如:docker daemon –disable-legacy-registry; Docker Daemon權(quán)限Docker Daemon相關(guān)文件和目錄的屬性及其權(quán)限關(guān)系到整個(gè)Docker運(yùn)行時(shí)的安全,從運(yùn)維角度來看,合理的規(guī)劃好屬性及其權(quán)限尤為重要,下面具體講講該怎么配置Docker Daemon權(quán)限。 1.設(shè)置Docker Daemon一些相關(guān)配置文件的屬性及其權(quán)限

2.設(shè)置Docker Daemon一些相關(guān)目錄的屬性及其權(quán)限
/etc/docker目錄保存的是容器認(rèn)證及key信息, 設(shè)置目錄的屬性為root:root,權(quán)限為755; /etc/docker/certs.d/目錄保存的是registry證書相關(guān)的文件,設(shè)置目錄的屬性為root:root,權(quán)限為444。
由CSDN主辦的中國云計(jì)算技術(shù)大會(huì)(CCTC 2017)將于5月18-19日在北京召開,Spark、Container、區(qū)塊鏈、大數(shù)據(jù)四大主題峰會(huì)震撼襲來,包括Mesosphere CTO Tobi Knaup,Rancher labs 創(chuàng)始人梁勝、Databricks 工程師 Spark commiter 范文臣等近60位技術(shù)大牛齊聚京城,為云計(jì)算、大數(shù)據(jù)以及人工智能領(lǐng)域開發(fā)者帶來一場技術(shù)的盛大Party?,F(xiàn)在報(bào)名,只需399元就可以聆聽近60場的頂級技術(shù)專家分享,還等什么,登陸官網(wǎng)(http://cctc.csdn.net/),趕快報(bào)名吧!
|