Docker技術淺談:私有化部署的優點以及在頂象內部的應用實踐

頂象全景式業務安全風控體系基於新一代風控體系構建,並採用Docker技術進行私有云和公有云部署。本文主要和你們分享下Docker容器技術和頂象風控系統私有化部署的優點以及Docker容器技術在頂象內部的應用實踐。算法

圖片描述

Docker容器技術概述

Docker是一個開源的容器引擎,Docke是以Docker容器爲資源分割和調度的基本單位,封裝軟件的運行時環境,用於快速構建、發佈、運行分佈式應用的平臺。docker

Docker容器本質上是宿主機上的進程,經過namespace實現資源隔離,經過cgroups實現資源限制,經過寫時複製(copy-on-write)實現高效的文件操做。容器是應用程序層的一個抽象,將代碼和依賴關係打包在一塊兒。 多個容器能夠在同一臺機器上運行,並與其餘容器共享操做系統內核,每一個容器在用戶空間中做爲孤立進程運行。安全

圖片描述
圖自官網網絡

Docker引擎包含Docker守護進程(Docker daemon,dockerd 命令)、REST API和Docker客戶端(docker 命令)。Docker採用 C/S架構,Docker客戶端與Docker守護進程通訊,Docker守護進程負責構建,運行和分發Docker容器。 Docker客戶端和守護進程能夠在同一個系統上運行,也能夠將Docker客戶端鏈接到遠程的Docker守護進程。 Docker客戶端和守護進程使用REST API經過UNIX套接字或網絡接口進行通訊。Docker容器基於開放標準,可運行在全部主要Linux發行版,Microsoft Windows以及包括虛擬機,裸機和雲上的任何基礎架構上。架構

技術優點

Docker可以將應用程序與基礎架構分離,從而能夠快速交付軟件。使用Docker,能夠像管理應用程序同樣管理基礎架構。宿主機不須要去關心某一個容器運行所須要的依賴,只要它能夠運行Docker,那麼它就能夠運行全部的Docker容器,容器將軟件與其周圍環境隔離開來,並有助於減小在同一基礎架構上運行不一樣軟件的團隊之間的衝突。app

Docker容器實現了應用環境的標準化,咱們能夠爲不一樣應用、及其不一樣的版本製做各自的鏡像,實現持續集成、應用的快速交付、應用快速更新與回滾。Docker的鏡像存儲採用分層的形式,不一樣的 Docker 容器共享一些基礎的文件系統層,同時再加上本身獨有的改動層,大大提升了存儲的效率,經過合理的鏡像構建方式,鏡像所需的存儲空間並不會隨着鏡像的數量而線性增加。在Docker的官方鏡像倉庫Docker Hub上,咱們能找到100,000+的鏡像,經鏡像倉庫的統一管理,咱們只須要pull其鏡像,而後經過run命令就能夠快速搭建起所需的環境、部署應用。而基於Docker提供的Dockerfile,咱們能夠在基礎鏡像上自由地構建本身所需的鏡像。分佈式

相較於以往的基於虛擬機部署,Docker容器更加輕量化並具有可移植性,而且不須要考慮外部的依賴問題,就像Java 「Write once,run anywhere」的特性同樣,JVM屏蔽了不一樣平臺的差別性,而Docker所提出的 「Build once,Run anywhere,Configure once,Run anything」體現了其更加便捷、部署成本更低的特性,不只可以有效屏蔽操做系統之間的差別,對於混合部署又可以屏蔽其餘應用可能出現的影響,間接保證了應用的高可用,提升了資源的利用率。工具

Docker容器編排與集羣管理

當Docker容器逐漸增多,應用的依賴關係變得複雜,依賴須要多個組件時,就可使用Docker容器的編排。編排是一個廣義的概念,它是指容器調度、集羣管理和可能其餘主機供應配置。爲此,Docker提供了容器集羣快速編排的Compose與Swarm工具。Compose是定義、運行多容器、多服務和Swarm集羣配置的應用編排程序(Define application stacks built using multiple containers, services, and swarm configurations.),使用YAML文件來配置應用程序的服務,而後經過命令建立並啓動配置中全部服務,實現快速部署。性能

當應用被擴展到多臺宿主機,管理每一個宿主系統和抽象化底層平臺的複雜性變得更有挑戰。Swarm做爲容器集羣的管理工具,能夠很容易地部署跨主機的容器集羣服務,Compose自己不支持跨主機管理容器,由於它的實現中只能鏈接一個docker client。Swarm把多個主機的docker engine集羣抽象成一個虛擬的Docker主機。測試

在集羣中一個應用或者組件發現其運行環境以及其它應用或組件的信息經過服務發現實現,一般是key/value存儲,例如Consul、Etcd、ZooKeeper等。Docker1.12及以後的版本已內置SwarmKit,這是一個Swarm的升級項目,在SwarmKit中內置key/value存儲,經過構建Swarm集羣,在上面就能夠把任務負載到不一樣的機器上。Swarm集羣中,節點有兩種角色,manager和worker。manager節點經過實現Raft一致性算法來管理全局的集羣狀態,再配合Compose YML V3的語法能夠方便對全部應用的配置管理,高效實現跨主機的容器編排與集羣管理。

頂象風控系統的私有部署,除了考慮業務和用戶數據的安全問題,還考慮了基礎設施的依賴和隔離、快速部署交付、更新等,保證全部組件和服務均可快速的彈性擴容,既知足小範圍的測試與業務起步階段,也能夠動態擴容適應業務發展,實現高QPS的支撐。

Docker容器技術在頂象內部的應用

目前Docker容器技術已在頂象內部大規模推行,全部應用均經過Docker容器實現部署、交付與更新。在此列舉幾個簡單的實踐例子:

一、在一個Docker容器中,一般咱們只運行一個應用,當使用容器編排時,不一樣應用的啓動時間不一樣,同時耗費的時間又會與機器的性能有關,在docker-compose的YML文件中, depends_on, links等參數能夠控制服務的啓動順序,可是實際上並不知道容器內的應用是否完成啓動,當一個服務必需要依賴另外一個服務時就須要控制它們之間容器啓動的時間間隔,或者在啓動應用的命令中預留等待的時間,也能夠對兩個服務分別編排啓動。

二、Compose在鏡像的製做上也很方便,YML中提供了build參數用於指定Dockerfile的路徑,image參數指定鏡像的名稱,docker-compose提供了build、push、images等命令能夠爲全部的應用批量製做鏡像,或指定service名稱,爲單個服務製做鏡像。同時YML支持環境變量,經過Linux export命令設置環境變量能夠動態地調整參數,而docker-compose config命令則能夠檢查YML文件的正確性、預覽最終的文件內容。

三、Docker容器日誌輸出的是控制檯的日誌,保存在/var/lib/docker/containers下以容器ID命名的目錄中,在大多數狀況下,咱們只須要將必要的日誌內容輸出到文件中,再掛載到宿主機,對此能夠屏蔽一些輸出到控制檯的日誌以減少磁盤空間的佔用,同時docker run提供了參數 --log-opt 能夠用於控制日誌大小,在Compose中則有logging max-size相關參數。

四、Docker提供了bridge、host、overlay、container等網絡模式,在實際的使用中常常會有跨主機容器訪問通訊的場景,選擇不一樣的網絡模式、合理分配應用的部署能夠提升應用的性能。

五、經過Jenkins搭建持續集成環境,自動構建代碼,能夠快速把應用打包成鏡像並自動部署,將構建結果發送到Sonar, 展現單測覆蓋率,代碼基本bug檢測,並把失敗的構建以郵件方式通知相關的開發人員,對須要發佈的鏡像推送到鏡像倉庫。基於Docker私有倉庫,應用的發佈更新從倉庫中獲取鏡像分發,對不一樣版本的容器區別命名,保留舊版本容器方便及時回滾。

更多業務安全類的技術分享,請關注頂象官方博客:https://www.dingxiang-inc.com...

相關文章
相關標籤/搜索