1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        什么是 Docker?看這一篇干貨文章就夠了!

        共 4528字,需瀏覽 10分鐘

         ·

        2020-08-23 21:48


        閱讀本文大概需要 10?分鐘。


        其實前兩天呢,我寫了一篇文章,關(guān)于原創(chuàng)丨更好的 Scrapy 項目部署和定時任務(wù)解決方案,這篇文章里就是用 Docker + Kubernetes 的內(nèi)容做的項目部署。

        然后意外的收獲了極低的閱讀量。

        但我覺得我寫的還不錯??!

        所以今天給大家找了一篇 Docker ,學(xué)習(xí)完了之后就可以點進上面的文章看實操啦 !

        今天也是貼心的崔慶才!

        容器技術(shù)的起源

        假設(shè)你們公司正在秘密研發(fā)下一個“今日頭條”APP,我們姑且稱為明日頭條,程序員自己從頭到尾搭建了一套環(huán)境開始寫代碼,寫完代碼后程序員要把代碼交給測試同學(xué)測試,這時測試同學(xué)開始從頭到尾搭建這套環(huán)境,測試過程中出現(xiàn)問題程序員也不用擔心,大可以一臉無辜的撒嬌,“明明在人家的環(huán)境上可以運行的”。

        測試同學(xué)測完后終于可以上線了,這時運維同學(xué)又要重新從頭到尾搭建這套環(huán)境,費了九牛二虎之力搭建好環(huán)境開始上線,糟糕,上線系統(tǒng)就崩潰了,這時心理素質(zhì)好的程序員又可以施展演技了,“明明在人家的環(huán)境上可以運行的”。

        從整個過程可以看到,不但我們重復(fù)搭建了三套環(huán)境還要迫使程序員轉(zhuǎn)行演員浪費表演才華,典型的浪費時間和效率,聰明的程序員是永遠不會滿足現(xiàn)狀的,因此又到了程序員改變世界的時候了,容器技術(shù)應(yīng)運而生。

        有的同學(xué)可能會說:“等等,先別改變世界,我們有虛擬機啊,VMware好用的飛起,先搭好一套虛擬機環(huán)境然后給測試和運維clone出來不就可以了嗎?”

        在沒有容器技術(shù)之前,這確實是一個好辦法,只不過這個辦法還沒有那么好。

        先科普一下,現(xiàn)在云計算其底層的基石就是虛擬機技術(shù),云計算廠商買回來一堆硬件搭建好數(shù)據(jù)中心后使用虛擬機技術(shù)就可以將硬件資源進行切分了,比如可以切分出100臺虛擬機,這樣就可以賣給很多用戶了。

        你可能會想這個辦法為什么不好呢?


        容器技術(shù) vs 虛擬機

        我們知道和一個單純的應(yīng)用程序相比,操作系統(tǒng)是一個很重而且很笨的程序,簡稱笨重,有多笨重呢?

        我們知道操作系統(tǒng)運行起來是需要占用很多資源的,大家對此肯定深有體會,剛裝好的系統(tǒng)還什么都沒有部署,單純的操作系統(tǒng)其磁盤占用至少幾十G起步,內(nèi)存要幾個G起步。

        假設(shè)我有一臺機器,16G內(nèi)存,需要部署三個應(yīng)用,那么使用虛擬機技術(shù)可以這樣劃分:

        在這臺機器上開啟三個虛擬機,每個虛擬機上部署一個應(yīng)用,其中VM1占用2G內(nèi)存,VM2占用1G內(nèi)存,VM3占用了4G內(nèi)存。

        我們可以看到虛擬本身就占據(jù)了總共7G內(nèi)存,因此我們沒有辦法劃分出更多虛擬機從而部署更多的應(yīng)用程序,可是我們部署的是應(yīng)用程序,要用的也是應(yīng)用程序而不是操作系統(tǒng)

        如果有一種技術(shù)可以讓我們避免把內(nèi)存浪費在“無用”的操作系統(tǒng)上豈不是太香?這是問題一,主要原因在于操作系統(tǒng)太重了。

        還有另一個問題,那就是啟動時間問題,我們知道操作系統(tǒng)重啟是非常慢的,因為操作系統(tǒng)要從頭到尾把該檢測的都檢測了該加載的都加載上,這個過程非常緩慢,動輒數(shù)分鐘,因此操作系統(tǒng)還是太笨了。

        那么有沒有一種技術(shù)可以讓我們獲得虛擬機的好處又能克服這些缺點從而一舉實現(xiàn)魚和熊掌的兼得呢?

        答案是肯定的,這就是容器技術(shù)。


        什么是容器

        容器一詞的英文是container,其實container還有集裝箱的意思,集裝箱絕對是商業(yè)史上了不起的一項發(fā)明,大大降低了海洋貿(mào)易運輸成本。讓我們來看看集裝箱的好處:

        • ?集裝箱之間相互隔離

        • ?長期反復(fù)使用

        • ?快速裝載和卸載

        • ?規(guī)格標準,在港口和船上都可以擺放

        回到軟件中的容器,其實容器和集裝箱在概念上是很相似的。

        現(xiàn)代軟件開發(fā)的一大目的就是隔離,應(yīng)用程序在運行時相互獨立互不干擾,這種隔離實現(xiàn)起來是很不容易的,其中一種解決方案就是上面提到的虛擬機技術(shù),通過將應(yīng)用程序部署在不同的虛擬機中從而實現(xiàn)隔離。

        但是虛擬機技術(shù)有上述提到的各種缺點,那么容器技術(shù)又怎么樣呢?

        與虛擬機通過操作系統(tǒng)實現(xiàn)隔離不同,容器技術(shù)只隔離應(yīng)用程序的運行時環(huán)境但容器之間可以共享同一個操作系統(tǒng),這里的運行時環(huán)境指的是程序運行依賴的各種庫以及配置。

        從圖中我們可以看到容器更加的輕量級且占用的資源更少,與操作系統(tǒng)動輒幾G的內(nèi)存占用相比,容器技術(shù)只需數(shù)M空間,因此我們可以在同樣規(guī)格的硬件上大量部署容器,這是虛擬機所不能比擬的,而且不同于操作系統(tǒng)數(shù)分鐘的啟動時間容器幾乎瞬時啟動,容器技術(shù)為打包服務(wù)棧提供了一種更加高效的方式,So cool。

        那么我們該怎么使用容器呢?這就要講到docker了。

        注意,容器是一種通用技術(shù),docker只是其中的一種實現(xiàn)。


        什么是docker

        docker是一個用Go語言實現(xiàn)的開源項目,可以讓我們方便的創(chuàng)建和使用容器,docker將程序以及程序所有的依賴都打包到docker container,這樣你的程序可以在任何環(huán)境都會有一致的表現(xiàn),這里程序運行的依賴也就是容器就好比集裝箱,容器所處的操作系統(tǒng)環(huán)境就好比貨船或港口,程序的表現(xiàn)只和集裝箱有關(guān)系(容器),和集裝箱放在哪個貨船或者哪個港口(操作系統(tǒng))沒有關(guān)系。

        因此我們可以看到docker可以屏蔽環(huán)境差異,也就是說,只要你的程序打包到了docker中,那么無論運行在什么環(huán)境下程序的行為都是一致的,程序員再也無法施展表演才華了,不會再有“在我的環(huán)境上可以運行”,真正實現(xiàn)“build once, run everywhere”。

        此外docker的另一個好處就是快速部署,這是當前互聯(lián)網(wǎng)公司最常見的一個應(yīng)用場景,一個原因在于容器啟動速度非??欤硪粋€原因在于只要確保一個容器中的程序正確運行,那么你就能確信無論在生產(chǎn)環(huán)境部署多少都能正確運行。


        如何使用docker

        docker中有這樣幾個概念:

        • dockerfile

        • image

        • container

        實際上你可以簡單的把image理解為可執(zhí)行程序,container就是運行起來的進程。

        那么寫程序需要源代碼,那么“寫”image就需要dockerfile,dockerfile就是image的源代碼,docker就是"編譯器"。

        因此我們只需要在dockerfile中指定需要哪些程序、依賴什么樣的配置,之后把dockerfile交給“編譯器”docker進行“編譯”,也就是docker build命令,生成的可執(zhí)行程序就是image,之后就可以運行這個image了,這就是docker run命令,image運行起來后就是docker container。

        具體的使用方法就不再這里贅述了,大家可以參考docker的官方文檔,那里有詳細的講解。


        docker是如何工作的

        實際上docker使用了常見的CS架構(gòu),也就是client-server模式,docker client負責處理用戶輸入的各種命令,比如docker build、docker run,真正工作的其實是server,也就是docker demon,值得注意的是,docker client和docker demon可以運行在同一臺機器上。

        接下來我們用幾個命令來講解一下docker的工作流程:


        1,docker build

        當我們寫完dockerfile交給docker“編譯”時使用這個命令,那么client在接收到請求后轉(zhuǎn)發(fā)給docker daemon,接著docker daemon根據(jù)dockerfile創(chuàng)建出“可執(zhí)行程序”image。


        2,docker run

        有了“可執(zhí)行程序”image后就可以運行程序了,接下來使用命令docker run,docker daemon接收到該命令后找到具體的image,然后加載到內(nèi)存開始執(zhí)行,image執(zhí)行起來就是所謂的container。


        3,docker pull

        其實docker build和docker run是兩個最核心的命令,會用這兩個命令基本上docker就可以用起來了,剩下的就是一些補充。

        那么docker pull是什么意思呢?

        我們之前說過,docker中image的概念就類似于“可執(zhí)行程序”,我們可以從哪里下載到別人寫好的應(yīng)用程序呢?很簡單,那就是APP Store,即應(yīng)用商店。與之類似,既然image也是一種“可執(zhí)行程序”,那么有沒有"Docker Image Store"呢?答案是肯定的,這就是Docker Hub,docker官方的“應(yīng)用商店”,你可以在這里下載到別人編寫好的image,這樣你就不用自己編寫dockerfile了。

        docker registry 可以用來存放各種image,公共的可以供任何人下載image的倉庫就是docker Hub。那么該怎么從Docker Hub中下載image呢,就是這里的docker pull命令了。

        因此,這個命令的實現(xiàn)也很簡單,那就是用戶通過docker client發(fā)送命令,docker daemon接收到命令后向docker registry發(fā)送image下載請求,下載后存放在本地,這樣我們就可以使用image了。

        最后,讓我們來看一下docker的底層實現(xiàn)。


        docker的底層實現(xiàn)

        docker基于Linux內(nèi)核提供這樣幾項功能實現(xiàn)的:

        • NameSpace

          我們知道Linux中的PID、IPC、網(wǎng)絡(luò)等資源是全局的,而NameSpace機制是一種資源隔離方案,在該機制下這些資源就不再是全局的了,而是屬于某個特定的NameSpace,各個NameSpace下的資源互不干擾,這就使得每個NameSpace看上去就像一個獨立的操作系統(tǒng)一樣,但是只有NameSpace是不夠。

        • Control groups

          雖然有了NameSpace技術(shù)可以實現(xiàn)資源隔離,但進程還是可以不受控的訪問系統(tǒng)資源,比如CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)等,為了控制容器中進程對資源的訪問,Docker采用control groups技術(shù)(也就是cgroup),有了cgroup就可以控制容器中進程對系統(tǒng)資源的消耗了,比如你可以限制某個容器使用內(nèi)存的上限、可以在哪些CPU上運行等等。

        有了這兩項技術(shù),容器看起來就真的像是獨立的操作系統(tǒng)了。


        總結(jié)

        docker是目前非常流行的技術(shù),很多公司都在生產(chǎn)環(huán)境中使用,但是docker依賴的底層技術(shù)實際上很早就已經(jīng)出現(xiàn)了,現(xiàn)在以docker的形式重新煥發(fā)活力,并且能很好的解決面臨的問題,希望本文能對大家理解docker有所幫助。


        片尾點題:尤其是我前段時間寫的原創(chuàng)丨更好的 Scrapy 項目部署和定時任務(wù)解決方案?啊,太好用了,太好用了,真的太好用了!真的不看看嘛?


        推薦閱讀

        1

        市面上好用的 Markdown 編輯器,我給你整理好了

        2

        原創(chuàng)丨更好的 Scrapy 項目部署和定時任務(wù)解決方案

        3

        對人生完全沒幫助的的沙雕小技巧

        4??

        史上最強 iPhone 越獄工具開源:功能永久有效!




        崔慶才

        靜覓博客博主,《Python3網(wǎng)絡(luò)爬蟲開發(fā)實戰(zhàn)》作者

        隱形字

        個人公眾號:進擊的Coder

        長按識別二維碼關(guān)注





        好文和朋友一起看~
        瀏覽 40
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            成人视频在线观看无码 | 91国偷自产中文字幕婷婷 | 亚洲精品综合 | 欧美成人一区二区三区片 | 国产精品久久久久久久久借妻 | 久操网在线视频 | 少妇被又大又粗又爽毛片久久黑人 | 91在线无码精品秘 蜜桃 | 看学生妹毛片 | 69操逼网站 |