新IT運維時代 | Docker運維之最佳實踐-上篇


 

容器技術的發展可以分為兩個階段,第一個階段聚焦在IaaS層,僅僅把容器當做更輕量級虛擬機來使用,解決了應用運行時進程級資源隔離的問題;隨着Docker的出現,容器虛擬化才有了統一的平台,由此容器技術發展到了第二個階段,開始聚焦在PaaS層,以應用為中心,統一應用分發標准,實現DevOps。

 

本篇將針對操作系統、主機配置、容器鏡像、容器運行時四大方面分享一些Docker的運維經驗。

 

操作系統

 

1、支持的操作系統類型

 

目前Docker官方支持的操作系統包含桌面版、服務器版、雲提供商以及容器操作系統,具體如下:

  • 桌面版:Mac、Windows;

  • 服務器版:Windows Server、Centos、Debian、Fedora、Oracle Linux、RHEL、SLES、Ubuntu;

  • 雲提供商:AWS、Azure、阿里雲等;

  • 容器操作系統:RancherOS、CoreOS、Atomic、Photon;

 

2、操作系統的選擇標准

 

有關操作系統的選擇不能一概而論。首先,企業本身也有對操作系統的規定;其次,應用的不同也要求的操作系統不同;基於以上兩點,若沒有其他要求,相對而言采用容器操作系統有很大的優勢。

 

容器操作系統相對於其他操作系統的優勢有以下幾點:

 

  • 精簡安全:容器操作系統只包含運行容器所需的必要軟件和必要的管理工具,相比傳統的操作系統而言會精簡很多;所有應用通過容器的方式運行,從而使操作系統和應用軟件隔離開來,極大降低了出現安全漏洞的概率;

  • 升級回滾:系統采用可回滾的雙分區模式,活動的分區通過只讀方式掛載,另外一個分區用來自動更新, 通過切換系統分區即可實現快速升級,升級出現問題時,可以快速切換回原來的分區保證系統可用;

  • 集群模式:在系統安裝的時候便可自動加入內置的ETCD集群中,每個系統都可以通過本機的ETCD讀取或發布配置信息和狀態數據,通過選舉形式在服務器之中選舉Leader來同步數據,並以此確保集群之內信息始終可用;

 

主機配置

 

從安全性、穩定性、可靠性來講,如何合理規划Docker運行環境非常重要,也是

Docker運維的基礎條件,下面會從容器分區、系統內核、Docker版本、Docker Daemon訪問控制及日志審計來講講怎么規划:

 

  • 單獨為容器划分一個分區作為容器的存儲空間:所有容器的數據、元數據默認都存儲在/var/lib/docker下(當然可以修改docker容器默認的存儲路徑),很容易造成爭搶磁盤空間,導致系統崩潰,推薦在內部存儲中單獨划分一個分區掛載到該目錄上,同樣的方法也可以使用外部存儲;

  • 使用比較新且穩定的Linux內核:官方推薦Linux內核版本為3.10+,但是有些功能模塊要求的內核版本更高,如支持MacVlan網絡模塊就需要內核版本為3.9+,這個時候就得權衡一下Linux內核版本的選擇,推薦采用該功能模塊推薦的內核版本;

  • 使用比較新且穩定的Docker版本:官方推薦的Docker版本為1.9.1+,但從實施和運維經驗來看,推薦選擇比較穩定的1.12.1版本;

  • 只允許可信任的用戶來控制Docker Daemon:Docker Daemon控制需要root特權,推薦將可信任的用戶加入到一個組中,並將整個組授予root特權;

  • 增加Docker Daemon及其相關文件、目錄的日志審計:Docker Daemon作為Docker的后台守護進程,對其訪問控制、行為操作做日志審計是非常有必要的,一旦出現問題,很方便進行定位,推薦增加Docker文件(docker、daemon.json、docker.service、docker.sock)和目錄(/var/lib/docker、/etc/docker、/usr/bin)的日志審計;

 

容器鏡像

 

鏡像是容器運行的基礎,所以說鏡像的安全非常重要,包括基礎鏡像的安全、軟件包的漏洞、暴露的端口、SSH服務、非root用戶等;

  • 使用可信任的鏡像來創建容器:Docker官方或非官方的鏡像有很多漏洞,若使用它們來運行容器,很容易被攻擊,建議使用Docker官方認證過的鏡像,或是自己構建的鏡像(建議采用Alpine作為基礎鏡像),並通過漏洞掃描工具(如Clair);

  • 在容器里面盡量不要安裝不必要的軟件:不必要的軟件會占用磁盤的空間,也會增加系統的安全威脅。

  • 創建一個非root用戶的容器:容器擁有root權限,很容易讓人通過容器的root權限攻擊所在的宿主機,可以在制作鏡像的時候指定用戶,如:RUN useradd -d/home/username -m -s /bin/bash username。

  • 開啟Docker的Content Trust選項:Content Trust會將數據通過數字簽名發送到遠程的Docker Registries或是從遠程的Docker Registries接收數據,用來保證鏡像在build, create, pull, push, run過程中沒有被篡改,開啟命令:export DOCKER_CONTENT_TRUST=1;

 

容器運行時參數

 

容器運行時的一些參數設置,在整個容器運行過程中非常重要,設置不好會嚴重影響容器的安全性、性能,下面就講講容器運行時需要考慮設置的一些比較重要的參數:

 

  • 為容器創建一個AppArmor Profile文件:AppArmor Profile文件里面包含了各種威脅的安全策略,通過它可以保護宿主機系統和應用程序的各種威脅,設置參數如:docker run --interactive --tty--security-opt="apparmor:PROFILENAME" centos /bin/bash。

  • 開啟SELinux Security選項:SELinux提供了強制訪問控制,增強了自主訪問模型,可以通過SELinux為系統增加一層額外的安全層,設置參數如:docker run --interactive --tty--security-opt label=level:TopSecret centos /bin/bash。

  • 為容器限制Linux內核的Capabilities能力:Linux把原來和超級用戶相關的高級權限划分成為不同的單元,稱為Capability,這樣就可以獨立對特定的Capability進行開啟或禁止,來增加容器的安全,設置參數如:

  • docker run --interactive --tty--cap-drop=all --cap-add={"NET_ADMIN","SYS_ADMIN"}centos:latest /bin/bash。以只讀的模式掛載容器的root文件系統,設置參數如:docker run --interactive --tty--read-only --volume /centdata centos /bin/bash

  • 設置容器在失敗的時候嘗試重啟的次數:若不設置的話,重啟則會不斷的嘗試重啟,參數如:docker run --detach--restart=on-failure:5 nginx。

  • 不要掛載宿主機上敏感的目錄到容器上,或是以只讀的方式掛載:

  • 如宿主機上這些目錄:/、/boot、/dev、/etc、/lib、/proc、/sys、/usr;

  • 在容器里面最好不要運行ssh服務:使用docker exec 或 docker attach來查看容器實例;

  • 容器運行時不要映射privileged的端口:處於安全考慮,privileged的TCP/IP端口約束在1024以下,一般的用戶是不能使用這個端口;

 

本篇的分享到此結束,下篇的分享將繼續針對Docker Daemon參數和權限兩個方面,敬請期待~

 

本文來源:http://www.youruncloud.com/blog/123.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM