軟體開發最大的麻煩事之一,就是環境配置。特別是萬惡的windows,經常出現一些奇怪的問題。 特別是新人入職,要裝一大堆環境,就比如我們團隊,後端是Go,要裝啥環境我不太清楚。前端的話,需要裝php,redis,node,nginx,mysql 這5個。 一個一個下載安裝?還得注意版本問題 太煩了。
這時候可以寫一份docker配置,新人入職,按文件一路走下來,順風順水的話1個小時就能裝完跑專案了。
多舒服(@ο@) 哇~ ( ⊙ o ⊙ )啊!
下面是一些關於 docker
的介紹
一、解決的問題
由於不同的機器有不同的作業系統,以及不同的庫和元件,在將一個應用部署到多臺機器上需要進行大量的環境配置操作。
Docker
主要解決環境配置問題,它是一種虛擬化技術,對程式進行隔離,被隔離的程式獨立於宿主作業系統和其它隔離的程式,我們稱之為容器。使用 Docker
可以不修改應用程式程式碼,不需要開發人員學習特定環境下的技術,就能夠將現有的應用程式部署在其他機器中。應用執行在容器裡,容器可以很輕易地copy。
二、與虛擬機器的比較
虛擬機器也是一種虛擬化技術,它與 Docker
最大的區別在於它是通過模擬硬體,並在硬體上安裝作業系統來實現。
啟動速度
啟動虛擬機器需要先啟動虛擬機器的作業系統,再啟動應用,這個過程非常慢;
而啟動 Docker
相當於啟動宿主作業系統上的一個程式。就跟你開啟吃飯的傢伙一樣快速。
佔用資源
虛擬機器是一個完整的作業系統,需要佔用大量的磁碟、記憶體和 CPU,一臺機器只能開啟幾十個的虛擬機器。
而 Docker
只是一個程式,只需要將應用以及相關的元件打包,在執行時佔用很少的資源,一臺機器可以開啟成千上萬個 Docker
。
三、優勢
除了啟動速度快以及佔用資源少之外,Docker
具有以下優勢:
更容易遷移
開發過程中一個常見的問題是環境一致性問題。由於開發環境、測試環境、生產環境不一致,導致有些 bug 並未在開發過程中被發現。而 Docker
的映象提供了除核心外完整的執行時環境,確保了應用執行環境一致性,從而不會再出現 「這段程式碼在我機器上沒問題啊」 這類問題。
更容易維護
對開發和運維(DevOps)人員來說,最希望的就是一次建立或配置,可以在任意地方正常執行。 使用分層技術和映象,使得應用可以更容易複用重複部分。複用程度越高,維護工作也越容易。
更容易擴充套件
可以使用基礎映象進一步擴充套件得到新的映象,並且官方和開源社群提供了大量的映象,通過擴充套件這些映象可以非常容易得到我們想要的映象。
四、使用場景
持續整合
持續整合指的是頻繁地將程式碼整合到主幹上,這樣能夠更快地發現錯誤。
Docker
具有輕量級以及隔離性的特點,在將程式碼整合到一個 Docker
中不會對其它 Docker
產生影響。
使用 Docker 可以通過定製應用映象來實現持續整合、持續交付、部署。開發人員可以通過 Dockerfile
來進行映象構建,並結合 持續整合系統進行整合測試,而運維人員則可以直接在生產環境中快速部署該映象,甚至結合 持續部署系統進行自動部署。
而且使用 Dockerfile
使映象構建透明化,不僅僅開發團隊可以理解應用執行環境,也方便運維團隊理解應用執行所需條件,幫助更好的生產環境中部署該映象。
提供可伸縮的雲服務
根據應用的負載情況,可以很容易地增加或者減少 Docker
。
搭建微服務架構
Docker
輕量級的特點使得它很適合用於部署、維護、組合微服務。
五、映象與容器
映象是一種靜態的結構,可以看成物件導向裡面的類,而容器是映象的一個例項。
映象包含著容器執行時所需要的程式碼以及其它元件,它是一種分層結構,每一層都是隻讀的(read-only layers)。構建映象時,會一層一層構建,前一層是後一層的基礎。映象的這種分層儲存結構很適合映象的複用以及定製。
構建容器時,通過在映象的基礎上新增一個可寫層(writable layer),用來儲存著容器執行過程中的修改。