首頁>Club>
9
回覆列表
  • 1 # 不會算命的貓老邪

    Docker最近很火。Docker實現了“集裝箱”——一種介於“軟體包”和“虛擬機器”之間的概念——並被寄予厚望,以期革新Internet服務以及其他大資料處理系統的開發、測試、和部署流程。

    為了使用Docker,需要了解不少工具及其設計思路;而這些工具的文件分佈在不同的網站。

    說是革新,其實是Google已經用了很多年的方式,只是最近才因為Docker開源專案而廣為人知。最近這將近十年的時間裡,各網際網路公司和高校都在奮力模仿Google的計算技術。瞭解這一模仿的過程,可以幫助我們深入理解分散式系統(包括現在常說的“大資料系統”)中若干重要問題。為此,本文以技術教程為主線,穿插了一些關於Hadoop和Mesos等“模仿”專案的介紹,簡要追溯它們勇敢而艱難的“邯鄲學步”的歷程。最後,本文會介紹Google最近公佈的“正確答案”——Hubernetes——Google核心技術Borg的開源版本。

    Docker

    Docker是一個軟體系統,實現了一種稱為“集裝箱”的概念。集裝箱類似Google機群管理系統Borg中的包(package)。

    通常我們說的“包”是軟體包——比如Ubuntu/Debian Linux裡常見的.deb檔案——安裝的時候,安裝程式會把被依賴的包也裝上。可是執行的時候呢?得根據具體情況配置,然後依次啟動互相依賴的多個程式。比如,啟動一個Web服務之前,要啟動Apache和MySQL;而且他們仨都得有合理的配置,確保它們能一起工作,來實現這個Web服務。

    但是Docker集裝箱以及Borg中的包更像虛擬機器。虛擬機器裡包括程式和配置,所以可以被執行——也就是執行其中的程式。因為程式是配置好的,所以虛擬機器可以被扔到各種環境上去執行——包括開發機、做演示用的膝上型電腦、用VirtualBox虛擬的機群、測試機群、預釋出環境和產品環境。近幾年隨著“雲計算”概念的普及,虛擬機器被廣泛使用,作為分散式計算的基礎排程單元。

    Docker作為一個軟體系統,可以用來建立“集裝箱映象”(container image)和執行這些映象。就像VirtualBox是一個軟體系統,可以用來建立和執行虛擬機器。但是集裝箱比虛擬機器“輕”——一個虛擬機器包括一組虛擬硬體、作業系統,用來執行使用者程式;而集裝箱裡沒有虛擬的硬體,也沒有作業系統,它用主機(host)的硬體和作業系統來執行程式。

    那麼在集裝箱裡跑程式和直接在主機上跑有什麼區別呢?一個區別是,集裝箱有一套網路埠空間(port space)。一個集裝箱裡的程序可以各自開埠,也可以連線對方的埠進行通訊。但是這些埠是集裝箱之外的程序看不到的。我們也可以讓集裝箱把某些內部埠號展示給外部,比如把集裝箱內的埠5000對映到外部的8080。這樣,當我們用主機上的程式(比如瀏覽器)訪問本機(主機)的8080埠時,實際上訪問的是集裝箱裡的5000埠。這項對外公開集裝箱內部埠的技術,稱為埠轉發(port forwarding),和虛擬機器的埠轉發概念一樣。另一個區別在於,集裝箱裡有虛擬的檔案系統。這樣我們可以把要執行的程式複製進集裝箱。也可以把主機上的某些目錄對映成集裝箱虛擬檔案系統的某些目錄。

    集裝箱這個想法已經在深刻地改變傳統分散式系統的開發、測試和部署的流程了。傳統的做法是,開發者寫一個Makefile(或者其他描述,比如CMakeList、POM等)來說明如何把原始碼編譯成二進位制檔案。隨後,開發人員會在開發機上配置並且執行二進位制檔案,來作測試。測試人員會在測試機群上配置和執行,來作驗證。而運維人員會在資料中心裡的預釋出環境和產品環境上配置和執行,這就是部署。因為開發機、測試機群、和產品環境裡機器的數量和質量都不同,所以配置往往很不同。加上每個新版本的軟體系統,配置方式難免有所差異,所以經常造成意外錯誤。以至於絕大部分團隊都選擇趁夜深人靜、使用者不活躍的時候,上線新版本,苦不堪言。

    而利用集裝箱概念的開發流程裡,開發者除了寫Makefile,還要寫一個Dockerfile,來描述如何把二進位制檔案安裝進一個集裝箱映象(container image),並且做好配置。而一個映象就像一臺配置好的虛擬機器,可以在機群上啟動多個例項(instance),而每個例項通常稱為一個集裝箱(container)。在自測的時候,開發者在開發機上執行一個或者多個集裝箱;在驗證時,測試人員在測試機群上執行集裝箱;在部署時,運維人員在產品環境執行集裝箱。因為執行的都是同樣地集裝箱,所以不容易出錯。

    這種流程更合理的劃分了開發者和其他角色的工作邊界,也大大簡化了測試和部署工作。

  • 2 # 黑白人

    docker並不是革命性的技術,是一種技術在合適的時候被推倒了這個位置,據我所知docker剛出來也沒有火,什麼敵不過其他虛擬化方案,直到近兩年微服務以及serverless等應用場景的出現,以及k8s等成熟的分散式解決方案的出現才最終成就了docker

  • 3 # 急速馬力快de原始碼控

    Docker稱不上革命性的技術,但可以稱得上是一個革命性的解決方案和工具。

    Docker基於Linux核心透過作業系統和虛擬容器呼叫CGroup, Namespace等系統介面完成資源的分配與相互隔離,依賴系統資源執行,使用的技術都是已有的。

    Docker出現之前,有現在還在用的VMWare虛擬機器,有Ghost,部分解決了伺服器安裝配置的瑣碎工作,但是沒有解決執行環境的問題。比如常見的環境不一致的問題:開發環境能執行,測試生產環境有bug?還有就是每次新伺服器、新環境搭建時無窮無盡的問題。

    那麼Docker出現後,整個環境被打包起來,也就是將所有安裝配置程式碼化自動化了,結合資源編排和雲服務,可以秒啟一個叢集化的web服務系統,如果沒有容器技術是做不到的。Docker是使用最普遍的容器技術,事實上的容器技術標準。

    推薦看一個Docker秒啟Web服務的影片:https://www.toutiao.com/i6801418770997838343/

  • 4 # Echa攻城獅

    其他框架,如OpenVZ和LXC,從20世紀20年代中期誕生。而其他類似容器的技術,如FreeBSD更進一步。而Docker在2013年釋出,與目前的大多數主流技術相比,是一個非常年輕的技術。

    解釋Docker的流行度

    所以,人們需要考慮這兩個因素。

    首先,這就是為什麼容器在過去幾年中一直被證明對各種規模的企業具有吸引力的原因:

    容器的啟動和停止速度比虛擬機器快得多。

    容器更易於移植,因為無論何種型別的作業系統託管它們,容器主機環境都是非常一致的。

    容器應用程式易於擴充套件,因為容器可以從環境中快速新增或減少。

    容器可以輕鬆將複雜的單片應用程式分解成更小的模組化微服務。

    Docker出現在正確的時間。到2013年,虛擬機器終於成為一種過時的技術。組織正在尋找一種更精簡,更方便的部署應用程式,Docker恰好符合要求。當OpenVZ和LXC出現在20世紀20年代中期時,傳統的虛擬化技術還沒有完成,所以這些容器框架不太吸引人。

    Docker與DevOps革命相吻合。DevOps在2010年流行起來,強調了軟體交付中的敏捷性,靈活性和可擴充套件性。Docker容器恰好提供了一個很好的構建塊,用於根據DevOps規定建立軟體交付管道和部署應用程式。

    Linux的比較

    在許多方面,Docker的不可預測的成功反映了20世紀90年代Linux核心的成功。

    正如專家所指出的那樣,Linux作為一個默默無聞的軟體專案進入了世界,這是一個芬蘭學生執行的一個模糊的軟體專案,沒有資金或先進的裝置。Linux最終成功地取得了巨大的成功,而像GNU和BSD這樣的核心專案更為突出,更多的資金,但其專業化的核心專案受到限制。

    Docker和LXC之類的替代品之間的區別可能不如Linux和GNU Hurd那樣顯著。儘管如此,Linux和Docker的崛起在相當短的時間內從默默無聞的專案到具有巨大商業價值的專案,這二者十分相似。

    結論

    專家認為時間可以解釋為什麼Docker容器變得如此受歡迎。Docker容器解決了過去五年來許多組織尋求解決的軟體交付和部署問題。雖然早期的容器框架提供了類似的解決方案,但人們對它們的興趣有限,因為他們解決的問題在首次亮相時,當時人們的需求並不緊迫。

    一般來說,專家認為與Docker的時間相比,Linux的成功與否更為關鍵。Linux的成功很大程度上是由於其他核心專案(尤其是GNU)的混亂,因為Linux早期採用了創新的,分散的開發策略。但是時運肯定幫助Linux獲得了成功,就像Docker一樣。

  • 5 # 數智風

    說docker是革命性技術談不上,但是docker在軟體研發到測試到釋出,相比物理機、虛擬化都有非常大的優勢。讓大家覺的它是革命性技術。其實docker只是在軟體研發比較有優勢。

    軟體研發的挑戰

    為什麼要講軟體研發挑戰呢?因為docker在軟體研發上市最具優勢的。

    一個計算機軟體從客戶的需求到程式設計師手下的程式碼到可執行版本的誕生,會經歷需求調研、架構設計、程式編碼、各種測試。在這過程中,程式設計師會碰到幾個主要的挑戰:

    ④、頻繁測試(需要頻繁部署測試環境:含系統、開發所需環境,比如java;);

    ⑤、執行環境和開發環境有差別導致很多問題;

    從上面挑戰可以看出:軟體研發跟軟體程式碼不相關,又不得不做的是開發環境的部署,而且這裡一直都需要用到它,一直持續到軟體正式上線。

    而docker非常適合這個需求,它利用linux的namespce技術將 程式碼執行需要的開發環境、網路、程序、資料儲存打包在一起。和其他的docker或者系統程序完全隔離,互相之間不受影響,非常優越性。下面我們就來看看它的優越性:

    docker的優越性

    前面我們已經簡要說了下docker的大概的技術和優越性。這裡詳細展開講解一下:

    1、持續一致性

    這個是docker的核心優勢,它打包了開發所需要的開發環境,而且這個開發環境一直保持不變。這個持續一致性,對於軟體研發來說是非常重要的。

    因為軟體研發編寫的程式碼需要很多依賴的包和庫檔案。而且版本不同也存在很多差別。所以,docker保持了這個一致性,減少了研發人員很多麻煩,大大提高效率。

    2、效能卓越

    docker 將開發環境、網路、程序、資料儲存等系統執行需要的資源的都打包在一起。具備了和虛擬機器一樣的特性。但相比虛擬機器它不存在虛擬層、也不存在虛擬硬體。執行效率方面,docker打包的程序可以直接呼叫cpu來執行,所以docker的效能相比虛擬機器快很多。

    3、很好的隔離性

    前面說到docker打包了開發需要的資源形成一個容器。這個容器內部和外部天生具有很好的隔離性。容器內的程序和容器外的程序是不會互相關聯通訊的,而且它佔有的計算資源cpu+記憶體+儲存都是可以限定,不會互相競爭而導致物理主機崩潰。但相比虛擬化的隔離性還是差了一點點(因為不同容器還在同一系統下執行)。但不影響使用。

    4、高安全性

    高安全性也得益於它的隔離性。因為無論容器內的程序也好、資料也好都是獨立的。外部無法獲得。容器之間需要網路通訊,必須使用docker hub。而docker hub是類似於交換機的網路堆疊,是可以配置互相訪問的埠。確保交換的安全。

    5、高相容性

    docker 因為它是一個打包封裝的容器,原本執行與linux系統內。如今雲計算快速發展。docker 對雲計算計算相容性很高。

    雲計算的巨頭“亞馬遜”、“微軟”都是支援和相容docker的;

    虛擬化的領頭羊“vmware”也是支援相容docker的;

    開源的Openstack也是支援和相容docker的;

    國內的華為、阿里、騰訊雲都是支援相容的;

    如此高的相容性,為研發人員獲取docker提供了很高的便利性。

    結束語

    綜上所述,Docker 是在軟體研發到正式釋出具有很高優越性。同時它具備的這些特性也符合應用執行需要的基本特性。所以被人認為是革命性技術。

    其實它也有很多不足之處,比如:隔離性、安全性就比虛擬機器差。

  • 6 # 吃飽啦CEO

    國內的程式設計師崇洋媚外,否則中國很多技術跟理念比國外的高,特別是靠著一知半懂的啥原理技術上去的業界領導者,這些人其實也就是皮毛,不過中國的技術精神還是挺好的就是不自信崇洋媚外!docker真的不算太高階技術,只不過是把應用打包了一下

  • 中秋節和大豐收的關聯?
  • CEO助旭旭寶寶超狂人坐穩國服第一,觀眾質疑寶哥:“裝備行手法不行”,如何評價?