前言
只有光頭才能變強。
文字已收錄至我的GitHub倉庫,歡迎Star:github.com/ZhongFuChen…
估計大家也可能聽過Docker這項技術(在論壇上、招聘技能上、交流群上等等),要是不瞭解Docker,都不好意思在網上衝浪的時候吹牛逼了。
所以這幾天學了一下Docker,總結了Docker入門的相關知識,分享給大家(好讓我們一起吹牛逼)。
I need a doctor,call me a doctor. I need a doctor, doctor, to bring me back to life .
一、為什麼需要Docker
官方介紹(中文版):www.docker-cn.com/what-docker…
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系統,都是需要映象的。
有了這個映象,我們就可以執行這個映象,來進行安裝系統的操作(此處省略N個下一步),於是我們的系統就裝好了。一般來說,我們去官方渠道下載的映象,都是純淨的。比如去官方下載Windows映象,裝完後之後桌面只有一個回收站。
但有過了解裝系統的同學可能就會知道,有的映象裝完可能還有360這些軟體,但系統的的確確是變了。簡單來說,就是這些映象新增了其他的東西(比如360軟體、騰訊、千千靜聽等等軟體)。
Docker也是這種思路,可以將我們的想要的環境構建(打包)成一個映象,然後我們可以推送(釋出)到網上去。想要用這個環 境的時候,在網上拉取一份就好了。
有了Docker,我們在搭環境的時候,跟以前的方式就不一樣了。
- 之前:在開發環境構建出了一個war包,想跑到Linux下執行。我們得先在Linux下載好Java、Tomcat、MySQL,配置好對應的環境變數,將war包丟到Tomcat的webapps資料夾下,才能跑起來。
- 現在:在Linux下直接拉取一份映象(各種環境都配好了),將映象執行起來,把war包丟進去就好了。
將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這兩個名詞:
來源維基百科:
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下安裝的是
- 現在,Windows和Mac都已經原生支援Docker了。但需要一些安裝的條件,詳情可以檢視官網
- 比如Windows:
Docker for Windows requires 64bit Windows 10 Pro and Microsoft Hyper-V
- 比如Windows:
參考資料:
- Windows 原生 Docker 正式商用
三、虛擬機器和Docker
說到應用隔離和映象,我就想起了虛擬機器。今年下半年(此處省略.....),文體兩開花(此處省略.....),要是我寫文章寫得不好,我是需要向XX謝罪的。
估計大家都用過虛擬機器,虛擬機器也能實現對應用的隔離,安裝特定的映象也能跑出我們想要的環境。虛擬機器已經發展了很久了,為什麼我們還需要Docker呢?
這部分內容在官網也有相關的介紹:
一句話總結:Docker容器比虛擬機器輕量多了!
最後
Docker可以幹嘛?
- 將一整套環境打包封裝成映象,無需重複配置環境,解決環境帶來的種種問題。
- Docker容器間是程式隔離的,誰也不會影響誰。
其實這篇文章主要是講為什麼我們需要Docker(在學習一項技術之前,必須要知道這項技術是用來幹嘛的),Docker的一些概念和命令我還沒介紹(留到下一篇啦)。如果還沒看過【生活現場】從搬家到容器技術docker應用場景解析,可以先去看看~
我在學習Docker的時候也找到了不少的資源,想要獲取Docker入門資源的同學可在公眾號下回復“Docker”
樂於分享和輸出乾貨的Java技術公眾號:Java3y。關注即可領取海量的視訊資源!
覺得我的文章寫得不錯,不妨點一下贊!