天天看點

Docker系列【1】——什麼是Docker?

Docker是什麼呢?在了解Docker之前,我們先來區厘清楚兩個概念,容器和虛拟機。

相信很多人都有使用過虛拟機,無論是Ubuntu還是其他一些Linux系統,每台虛拟機都必須安裝一個作業系統,并且配置設定給它一定的資源,當虛拟機被開啟時,預先配置設定給它的資源将被全部占用。每一台虛拟機都有完整的作業系統,必要的二進制和庫。

容器技術與虛拟機不同,容器是與主控端共享硬體資源和作業系統,可以實作資源的動态配置設定。容器以程序的形式在使用者的作業系統中運作。容器技術可以在資源受到隔離的程序中運作程式,通過容器我們可以輕松打包程式和配置,使其變成容易運作的建構塊,并且部署起來不受使用者作業系統環境的影響。

Docker系列【1】——什麼是Docker?

Docker屬于Linux容器的一種封裝,提供簡單易用的使用接口。

Linux容器不是模拟一個完整的作業系統,而是對程序進行隔離,相當于在正常的程序外面套了一個保護層,對于容器内部的程序來說,它接觸到的資源都是虛拟的,進而實作與底層系統的隔離。

Docker将應用程式與該程式的依賴,打包在一個檔案當中,運作這個檔案,就會形成一個虛拟容器。程式在這個容器中運作,就好像在真實的實體機運作一樣。使用Docker,我們可以友善地建立和使用容器,還可以把自己的程式打包成鏡像,快速部署而不需要重新配置環境。

Docker的優勢

讀到這裡,你可能對Docker在實際開發的作用還是不太了解,讓我們以實際的開發場景來讨論使用Docker的好處。在開發過程中,部署各種的環境是一件令人頭疼的事情,比如Nginx、MySQL、JRE等等,複雜的環境配置和版本更新使得程式員可能出現在本地上能跑通,但在别人電腦就運作不起來的尴尬情況,顯然這是環境問題;資源使用率也是一個值得考慮的問題,但應用程式越來越多,如果機器配置不夠高,運作虛拟機會非常地吃力;當項目需要遷移時,部署起來非常地不友善。

Docker在當中能解決什麼問題呢?

1.我們知道,一個程式要跑起來,需要這麼幾部分:代碼 + 運作環境 + 配置 + 依賴的服務。代碼當然就是同一份代碼,不同的環境都一樣,通常不會有問題,Docker image中包含了運作環境+配置,這對部署相當友好。Docker提供了鏡像檔案,也可以自己打包鏡像,将Nginx或JRE打包成一個個鏡像,隻需在本地拉取鏡像即可快速完成環境的部署,解決了依賴問題,再也不會出現“我的電腦明明可以運作”的情況。

2.機器的資源使用率提高,不需要再重新在虛拟一個作業系統而耗費許多的資源。Docker的啟動屬于秒級别,虛拟機需要幾分鐘去啟動。

3.與虛拟機相比,Docker隔離性更弱,屬于程序之間的隔離,虛拟機可實作系統級别的隔離

4.快速建立、删除:虛拟化建立是分鐘級别的,

Docker

容器建立是秒級别的,

Docker

的快速疊代性,決定了無論是開發、測試、部署都可以節約大量時間

5.傳遞、部署:虛拟機可以通過鏡像實作環境傳遞的一緻性,但鏡像分發無法體系化。

Docker

Dockerfile

中記錄了容器建構過程,可在叢集中實作快速分發和快速部署

下面這張表格可以清楚地看到容器相比傳統虛拟機的優勢所在:

特性 容器 虛拟機
啟動 秒級 分鐘級
硬碟使用 一般為MB 一般為GB
性能 接近原生 弱于
系統支援量 單機支援上千個容器 一般是幾十個

Docker的缺陷:

Docker用于部署那些無狀态的程式非常好用,比如Apache、Nginx等,但是如果把資料庫等一些需要持久化的資料部署在Docker當中,就會存在一些問題。容器中的資料不是持久化,如果容器删除了,這些資料也就沒了;由于容器之間互相隔離,是以主機上的其它程序不友善通路這些資料;對這些容器的I/O會經過存儲驅動,然後到達主機,引入了一層間接層,是以性能有所下降

寫在後面的話:

由于筆者也是在學習Docker的過程中,是以寫下文章幫助自己梳理Docker的知識點,如果有錯誤的地方歡迎指出。

參考文章:

這可能是最為詳細的Docker入門吐血總結

什麼是Docker, 為什麼這麼火