為什麼需要Docker?

收藏待读

為什麼需要Docker

前言

只有光頭才能變強。

文本已收錄至我的GitHub倉庫,歡迎Star: https://github.com/ZhongFuCheng3y/3y

估計大家也可能聽過Docker這項技術(在論壇上、招聘技能上、交流群上等等),要是不了解Docker,都不好意思在 網上衝浪 的時候吹牛逼了。

所以這幾天學了一下Docker,總結了Docker 入門 的相關知識,分享給大家(好讓我們一起吹牛逼)。

為什麼需要Docker?

I need a doctor,call me a doctor. I need a doctor, doctor, to bring me back to life .

一、為什麼需要Docker

官方介紹(中文版): http://www.docker-cn.com/what-docker#/developers

Docker 是世界領先的軟件容器平台。

開發人員利用 Docker 可以消除協作編碼時「在我的機器上可正常工作」的問題。

運維人員利用 Docker 可以在隔離容器中並行運行和管理應用,獲得更好的計算密度。

企業利用 Docker 可以構建敏捷的軟件交付管道,以更快的速度、更高的安全性和可靠的信譽為 Linux 和 Windows Server 應用發佈新功能。

1.1環境(切換/配置)麻煩

一般我們寫程序的,能接觸到好幾個 環境

  • 自己寫代碼的環境叫做開發環境。
  • 給測試去跑的環境叫做測試環境。
  • 測試完可以對外使用的叫做生產環境。

其實我們在學習編程中,很多時間都浪費在「環境」上:

  • 如果我現在重裝了系統,我想要跑我的 war/jar 包,我得去安裝一下JDK、Tomcat、MySQL等配置各種的環境變量才能跑起來。
  • 開開心心地跟着博主給出的步驟去寫Demo,但總是有Bug。(這裡我將 版本/依賴 也歸納在環境的範疇裡邊)。
  • 好不容易在測試環境下跑起來了,在生產環境就各種出錯!
  • 跟着教學視頻做分佈式/集群的項目,跑一堆的虛擬機,每個虛擬機都要安裝對應的環境。

所以就有個笑話《千萬不要跟程序員說,你的代碼有bug》:

  • 他的第一反應是你的 環境有問題 ,第二就是你是傻逼不會用吧。
  • 你要跟他這麼說:「這個程序運行的怎麼運行的跟預期不一樣,是我操作有問題嗎?」。
  • 這貨就會第一反應「我擦,這是不是出bug了?」

1.2應用之間需要隔離

比如我寫了兩個應用(網站),這兩個應用部署在同一台服務器上,那可能會出現什麼問題?

  • 如果一個應用出現了問題,導致CPU佔100%。那另一個應用也會受到關聯,跟着一起涼涼了。
  • 這兩個應用是完全不同技術棧的應用,比如一個 PHP ,一個 .NET 。這兩個應用 各種的依賴軟件 都安裝在同一個服務器上,可能就會造成 各種衝突/無法兼容 ,這可能調試就非常麻煩了。

二、Docker是如何解決上述的問題的

2.1解決環境(切換/配置)

不知道大家有沒有裝過系統,比如說裝Linux虛擬機,重裝Windows系統,都是需要 鏡像 的。

為什麼需要Docker?

有了這個鏡像,我們就可以 運行 這個鏡像,來進行安裝系統的操作(此處省略N個下一步),於是我們的系統就裝好了。一般來說,我們去官方渠道下載的鏡像,都是 純凈 的。比如去官方下載Windows鏡像,裝完後之後桌面只有一個回收站。

但有過了解裝系統的同學可能就會知道,有的鏡像裝完可能還有360這些軟件,但系統的的確確是 變了 。簡單來說,就是這些鏡像 添加 了其他的東西(比如360軟件、騰訊、千千靜聽等等軟件)。

Docker也是這種思路,可以將我們的想要的環境 構建 (打包)成一個鏡像,然後我們可以 推送 (發佈)到網上去。想要用這個環

境的時候,在網上 拉取 一份就好了。

有了Docker,我們在搭環境的時候,跟以前的方式就不一樣了。

  • 之前 :在開發環境構建出了一個war包,想跑到Linux下運行。我們得先在Linux下載好Java、Tomcat、MySQL,配置好對應的環境變量,將war包丟到Tomcat的webapps文件夾下,才能跑起來。
  • 現在 :在Linux下直接拉取一份鏡像(各種環境都配好了),將鏡像運行起來,把war包丟進去就好了。

為什麼需要Docker?

將Docker的鏡像運行起來就是一兩秒的事情而已,十分方便的。

2.2解決應用之間隔離

說到這裡,就得提出一個大家可能不認識的概念:LXC(Linux Containers)—>Linux容器。

2.2.1Linux容器

在Linux內核中,提供了 cgroups 功能,來達成資源的區隔化。它同時也提供了名稱空間( namespace )區隔化的功能, 使應用程序看到的操作系統環境被區隔成獨立區間 ,包括進程樹,網絡,用戶id,以及掛載的文件系統。

簡單來說就是:LXC是一個為Linux內核包含特徵的 用戶接口 。通過強大的API和簡單的工具,它可以讓Linux用戶輕鬆的創建和託管系統或者應用程序容器。

2.2.2回到Docker

我們在翻看Docker的官方文檔的時候,也很容易看見cgroup和namespace這兩個名詞:

為什麼需要Docker?

來源維基百科:

Early versions of Docker used LXC as the container execution driver, though LXC was made optional in v0.9 and support was dropped in Docker v1.10.

lxc是 早期版本 docker的一個基礎組件,docker 主要用到了它對 Cgroup 和 Namespace 兩個內核特性的控制。新的Docker版本已經 移除了 對LXC的support。

2.2.3Docker在Windows和Mac

上面說了,Docker底層用的Linux的cgroup和namespace這兩項技術來實現 應用隔離 ,那Windows和Mac用戶能用Docker嗎?

  • 之前 ,Windows和Mac使用Docker實際上就是跑了一層Linux虛擬機。
    • 比如在Windows下安裝的是 Docker Toolbox ,它需要 Oracle Virtual Box 來跑Docker
  • 現在 ,Windows和Mac都已經原生支持Docker了。但需要一些 安裝的條件 ,詳情可以查看官網
    • 比如Windows: Docker for Windows requires 64bit Windows 10 Pro and Microsoft Hyper-V

參考資料:

三、虛擬機和Docker

說到應用隔離和鏡像,我就想起了 虛擬機 。今年下半年(此處省略…..),文體兩開花(此處省略…..),要是我寫文章寫得不好,我是需要向XX謝罪的。

估計大家都用過虛擬機,虛擬機也能實現對應用的隔離,安裝 特定的 鏡像也能跑出我們想要的環境。虛擬機已經發展了很久了,為什麼我們還需要Docker呢?

這部分內容在官網也有相關的介紹:

為什麼需要Docker?

一句話總結:Docker容器比虛擬機 輕量 多了!

最後

Docker可以幹嘛?

  • 將一整套環境打包封裝成鏡像, 無需重複配置環境 ,解決環境帶來的種種問題。
  • Docker容器間是進程隔離的,誰也不會影響誰。

其實這篇文章主要是講為什麼我們需要Docker( 在學習一項技術之前,必須要知道這項技術是用來幹嘛的 ),Docker的一些概念和命令我還沒介紹(留到下一篇啦)。如果還沒看過 【生活現場】從搬家到容器技術docker應用場景解析 ,可以先去看看~

我在學習Docker的時候也找到了不少的資源,想要獲取Docker入門資源的同學可在公眾號下回復「Docker」

樂於分享和輸出 乾貨 的Java技術公眾號: Java3y 。關注即可領取海量的視頻資源!

為什麼需要Docker?

覺得我的文章寫得不錯,不妨點一下

原文 : 博客園精華區

相關閱讀

免责声明:本文内容来源于博客園-原創精華區,已注明原文出处和链接,文章观点不代表立场,如若侵犯到您的权益,或涉不实谣言,敬请向我们提出检举。