[1] 外行人都能看的懂的Docker簡介

在這裏插入圖片描述
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發佈到任何流行的Linux機器或Windows 機器上,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何接口。

1. Docker解決了什麼問題?

在軟件開發中,環境配置往往是比較麻煩的。同一套代碼,要想在其他機器上運行,往往需要安裝並配置程序運行所需的各種依賴,稍有不慎,安裝錯了版本還可能不兼容,導致各種各樣的問題。

以運行一個常規的Java web程序爲例,目標機器必須安裝JDK、Tomcat、MySQL,並配置相應的環境變量。同時版本還需要對應上,比如Java代碼中用到了lambda表達式,則安裝JDK版本如果小於8則肯定不能讓項目跑起來,安裝的JDK版本高了,也有可能導致各種不兼容。整個過程麻煩不說,還有可能跑不起來。

開發人員常聽到的一句話是“你的程序有問題,跑不起來”,而你這時的第一反應就是“(胡說,默唸)是你的環境有問題,在我電腦上可以跑!” 。所以,遇到這種情況,千萬不要對其他開發說“你的代碼有問題” ,而是說“我的運行環境可能跟你的運行環境不一樣,導致你的代碼在我電腦上運行不了” 。這樣的話對方的第一反應則是“我的代碼運行需要依賴xxx,你看看是不是沒安裝或者沒配置對啊,扒拉扒拉”。

既然代碼能打包運行,那環境可不可以打包呢?能打包的話,豈不是不需要重複配置運行環境了,也從根本上避免了因爲環境問題導致代碼運行不了的問題。Docker的出現,便是爲了解決這個問題。開發人員可以將代碼的運行環境通過Docker進行打包,然後完整的把環境及代碼搬到其他機器上去跑。

2. 虛擬機?

上面說的Docker能幹的事,虛擬機也可以幹啊?爲什麼還用Docker,Docker的優勢在哪裏?
先貼上虛擬機的概念:

虛擬機(Virtual Machine)指通過軟件模擬的具有完整硬件系統功能的、運行在一個完全隔離環境中的完整計算機系統。在實體計算機中能夠完成的工作在虛擬機中都能夠實現。在計算機中創建虛擬機時,需要將實體機的部分硬盤和內存容量作爲虛擬機的硬盤和內存容量。每個虛擬機都有獨立的CMOS、硬盤和操作系統,可以像使用實體機一樣對虛擬機進行操作。

流行的虛擬機軟件有VMware(VMWare ACE)、Virtual Box和Virtual PC,它們都能在系統上虛擬出多個計算機。用過虛擬機的小夥伴肯定知道,開一個虛擬機將會佔用大量系統資源,8G運存的電腦分分鐘佔用率超90%。由此可見,虛擬機對資源的佔用是多麼的巨大。

虛擬機有以下顯而易見的缺點:

  • 啓動慢,畢竟要啓動一個完整的操作系統,並且很多硬件功能還是軟件模擬的。
  • 資源佔用多,至少幾百兆的內存才能使虛擬機運行,且非常佔用cpu和硬盤資源。
  • 冗餘,一些系統級的操作無法跳過,比如登陸。

由此可見,想要用虛擬機把一整套代碼運行環境進行打包的代價太大了。比如我想要爲一個10M大小的Java程序打包運行環境,那就必須把幾百M甚至幾G的操作系統包含進來,且在程序運行時所佔用的資源遠遠高於原來的程序所佔用的資源。

3.容器技術

由於虛擬機存在這些缺點,Linux 發展出了另一種虛擬化技術:Linux 容器(Linux Containers,縮寫爲 LXC)。

Linux 容器不是模擬一個完整的操作系統,而是對進程進行隔離。或者說,在正常進程的外面套了一個保護層。對於容器裏面的進程來說,它接觸到的各種資源都是虛擬的,從而實現與底層系統的隔離。因 此,容器虛擬化也被稱爲“操作系統級虛擬化”,容器技術可以將軟件需要的環境配置都打包到一個隔離的容器中。 讓多個獨立的容器高效且輕量的運行在同一臺宿主機上。而Docker就是爲了實現這一切而生的。

3.1 容器和虛擬機比較

啓動一個容器相當於啓動一個進程,而啓動一個虛擬機相當於啓動一套運行在虛擬硬件上的操作系統。
在這裏插入圖片描述

3.2 Docker

Docker 屬於 Linux 容器的一種封裝,提供簡單易用的容器使用接口。它是目前最流行的 Linux 容器解決方案。

Docker 將應用程序與該程序的依賴,打包在一個文件裏面。運行這個文件,就會生成一個虛擬容器。程序在這個虛擬容器裏運行,就好像在真實的物理機上運行一樣。有了 Docker,就不用擔心環境問題。

總體來說,Docker 的接口相當簡單,用戶可以方便地創建和使用容器,把自己的應用放入容器。容器還可以進行版本管理、複製、分享、修改,就像管理普通的代碼一樣。

4. Docker架構

Docker的運行架構是C/S架構,即客戶端-服務器架構,Docker容器運行在服務器端,docker xxx命令運行在客戶端。Docker提供了一個命令行工具和一整套RESTful API,兩者可以運行在同一臺主機上,也可以運行在不同主機上。即本地Docker客戶端可以連接本地的Docker服務器,也可以遠程連接其他主機的Docker服務器。

Docker客戶端職責:

  • 接收用戶輸入
  • 根據用戶輸入向服務器發送請求
  • 回顯服務器的返回結果

Docker服務器職責:

  • 接收客戶端請求
  • 根據接收到的請求處理
  • 返回結果

Docker簡化版架構如下圖所示:
在這裏插入圖片描述

5.Docker中的幾個概念

想必大家在看Docker相關介紹時都不能跳出容器、倉庫、鏡像這三個關鍵詞。下面就來介紹一下這三個關鍵詞。

5.1 鏡像(Image)

鏡像是一個靜態保存在磁盤裏的文件。前面我們說的將程序運行環境打包,即把所有依賴打包成一個鏡像。可以把鏡像看作一個已經編譯好但未運行的程序。

5.2 容器(Container)

容器(Container)是基於鏡像創建的運行實例,一個容器中可以運行一個或多個應用程序。鏡像與容器的關係可以類比爲Java中的類和對象的關係。一個鏡像可以創建出多個實例。容器本質上也是存儲在磁盤上的一個文件,稱爲容器文件,容器的停止並不會導致容器文件的刪除。

通過一個鏡像創建出一個容器,則會存在兩個文件,一個是鏡像文件,一個是容器文件。

可以把一個容器看作:一個精簡版的Linux系統 + 多個運行在該系統上的應用程序

5.3 倉庫(repository)

倉庫,即集中存放鏡像(Image)文件的倉庫。

倉庫又分爲公有倉庫、私有倉庫兩種。

  • Docker公司提供的倉庫叫做Docker Hub,用戶可以在上面下載或分享鏡像。
  • 阿里雲、網易雲在國內有提供公有的倉庫,相比於Docker Hub訪問速度更快。

當用戶創建好了自己的鏡像後,可以把鏡像保存到遠程公有或私有倉庫。這樣,在其他機器上就可以通過docker pull命令拿到鏡像了。

6. Docker安裝

Docker的安裝,可以參考其他文章,在這裏就不詳細的寫了,在這裏直接推薦一個教程。需要注意的是,安裝完後需要配置鏡像加速,否則從倉庫pull鏡像這一過程將巨慢,本人推薦使用阿里雲鏡像加速。

安裝完之後,可以通過docker info命令查看是否安裝成功。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章