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

 

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

 

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

 

操做系統docker

 

一、支持的操做系統類型json

 

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

  • 桌面版:Mac、Windows;安全

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

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

  • 容器操做系統:RancherOS、CoreOS、Atomic、Photon;網絡

 

二、操做系統的選擇標準app

 

有關操做系統的選擇不能一律而論。首先,企業自己也有對操做系統的規定;其次,應用的不一樣也要求的操做系統不一樣;基於以上兩點,若沒有其餘要求,相對而言採用容器操做系統有很大的優點。

 

容器操做系統相對於其餘操做系統的優點有如下幾點:

 

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

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

  • 集羣模式:在系統安裝的時候即可自動加入內置的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

相關文章
相關標籤/搜索