面試熱點:解析Docker

歡迎回看本文原始視頻

我們討論Docker,首先要想它為什麼會出現,在Docker來看,它最本質的需求是什麼?

向伺服器部署代碼非常困難。為什麼部署會是挑戰?其本質在於複雜多變的技術棧。比如我們下面列舉的各類技術。有這麼多複雜的技術棧,部署就一定會遇到挑戰。

一個有趣的現象是,我們深切感覺到,程序員要學的技術越來越多了,尤其是在創業公司的程序員,更需要讓自己變成一個多面手。如果一個程序員掌握的技術比較單一,那他很有可能在日後被淘汰。雖然我們並不認為專才沒有用,但現在已經不是一個只靠一門語言或者技術就可以在科技圈生存下來的時代了,而是需要程序員具有快速學習並且掌握多種現在工業界常用的語言和技術框架,這樣的人才更被倚重。

因此,很多程序員成為組合大師,就是用多種技術的變化,把它們組合起來,成為所需要的東西。這樣做的好處是什麼呢?好處是只需要關注最核心的代碼。但組合會帶來什麼問題呢?

為什麼複雜的技術棧對部署來說是挑戰?

根本原因是不同的技術之間的版本衝突和依賴。

我們舉最簡單的例子—Python。用Python之後就會選擇,是Python2還是Python3。開始發現有一些比較新的技術庫會支持Python3,但還有一些比較傳統的代碼集,它們就不能支持Python3,只支持Python2。這就使我們開發不同的程序,或者是相同的程序用不同的庫,會產生不同的問題。因此總結來看,我們向伺服器部署代碼非常困難。

那這種問題怎麼解決呢?最好的方法,是從生活中尋找答案。因此,要解決Docker這個問題,或者說解決部署的問題,我們就反過來看,在日常的生產與生活中,與部署代碼這種計算機問題,最接近的例子是什麼?答案是:貨運。

仔細想想貨運是什麼?是通過各種方法,比如汽車、火車、游輪、飛機等將各種貨物如石油、鋼琴、尿布、啤酒,運送到你的目的地。因此計算機轉接交付也是這樣,可以用各種各樣的方法,將你整個task、stack運送到目的地。大家不要總執著於創造需求,而是尋根找到一個現實中的需求,把它用更好的方式給滿足,就能夠出現新的轉機。

再往後看,我們如何來運送貨物呢?運輸在現實中是怎麼解決的?答案是:集裝箱。實際上運輸業在使用集裝箱後有一個很好的發展,因為集裝箱有統一的標準。想要運東西的人們,只要遵循集裝箱的標準,就能夠從貨運的細節中解放出來,貨運會更加方便。

那麼我們能從集裝箱里學到什麼呢?

就是Docker。再舉個例子,當我們部署一個jar文件的時候,很多人用java。我們需要什麼呢?不僅有jar文件,實際背後還有很多隱藏的需求,比如伺服器需要有一個java版本的解釋器,就是jvm,而且往往還需要一些相應的配置環境才能運行起來。這些東西在傳統的方法下是怎麼解決的呢?其實在Docker出現前有很多別的方法,比如虛擬機。

既然有虛擬機,那為什麼還會出現Docker呢?

為什麼不用虛擬機呢?答案是虛擬機太沉重。虛擬機把東西打包太多了,動輒上G,運行代價特別大,單機往往只能勉強撐十幾個,就已經很不錯。比如要搬家,是想把所有的東西全部都以一種極大的時間成本搬過去,還是想以一種相對小的時間成本只拿上重要物品?這是兩種不同的搬家模式,相比而言後面一種方法肯定是簡單的。

Docker的優點

相對於傳統方式,它能夠同時交付並且部署程序所運行的環境。

相對於虛擬機,它給出了基本的程序代碼去交付,也僅僅只打包必需的內容,從而減輕了負擔。

Docker的命令

第一個是docker images,列出你本地系統中所有存在的docker鏡像,看看哪些可以運行。找到一個能運行的之後,想運行版本號為12.10的ubuntu,並在運行以後,執行裡面的/bin/bash的進程,就能和它交互。當然,運行起來後可以看當前有哪些運行中的images或者containers。我們也可以在裡面做很多事情,比如運行完以後,在裡面刪文件、加文件、或者安裝幾個包,想看看運行之後發生了什麼變化,就可以用docker diff來看一些東西。如果本地產生了一些新的image,就可以通過commit的方式將當前運行的所有修改提交為一個新的image。之後可以把這個image推送到遠端的雲服務里,從而能很好地和大家共享,最終也可以通過pull的方法從遠端下載。

看似複雜,實際上仔細想想跟Git是一樣的,就是把image當成一個代碼。你可以看本地有什麼代碼,可以執行本地的代碼或修改它,也能夠看這個代碼跟別的代碼有什麼區別,同時把代碼本地commit一下,也能夠push到遠方、pull到本地。大家可以拿Git的方式來思考這個問題。

Docker運行時內部刪除的文件,如何恢復?

比如運行Docker以後,不小心把裡面的bin文件目錄給全部刪掉了,這很危險嗎?其實根本不用管。只要重啟一下就可以了,為什麼呢?因為Docker的本質其實是盜夢空間。什麼是夢?什麼是現實?我們在Docker是一直生活在夢境的現實中。因此只要先醒到上一層空間,然後再睡回去,就又可以重建這個空間。

最後總結一下:

Docker的本質就是盜夢空間。

從生活尋找技術問題的答案。

參考資料:《Introduction to Docker》


想要熟練運用Docker實現工業級項目?

歡迎了解BitTiger項目直通車,全面解決背景薄弱、項目不足、沒有面試等問題。

BitTiger直通車特色

  • 三個月四個工業級別大項目,全面提升編程實力與簡歷背景
  • 矽谷一線IT公司導師、了解痛點的助教,全方位指導及答疑
  • 修改簡歷、模擬面試、職業諮詢,Career Service全程護航
  • 獨家面試題庫精講、上百小時基礎及面試視頻資源助力求職

了解課程詳情


推薦閱讀:

philippica: proxy lab從入門到放棄
鼓吹矽谷 Palo Alto 學區房便宜的,不是壞就是蠢
趣話安全啟動:迷思與啟示

TAG:Docker | 计算机科学 | 技术栈 |