您好,歡迎來電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊(cè)]

您的位置:電子發(fā)燒友網(wǎng)>源碼下載>數(shù)值算法/人工智能>

Docker:微容器的優(yōu)勢與構(gòu)建教程

大小:0.5 MB 人氣: 2017-10-10 需要積分:1
說到Docker,可能大家都不陌生了,我們可以用Docker技術(shù)將應(yīng)用以及所有的依賴項(xiàng)打包到一個(gè)鏡像中,然后把這個(gè)鏡像部署到容器中運(yùn)行。這里就有一個(gè)問題,因?yàn)槲覀冊(cè)诖虬臅r(shí)候往往會(huì)把一些雜七雜八非必要的東西也打包進(jìn)去,所以最后構(gòu)建出來的鏡像就很龐大,直接導(dǎo)致我們的容器也變得很大。對(duì)于剛?cè)腴T的Docker新手來說,大家一開始基本都是用的Docker官方鏡像倉庫里提供的基礎(chǔ)鏡像,可惜的是,這些基礎(chǔ)鏡像通常都包含了很多我們用不著的文件,有的時(shí)候我們的鏡像明明可以建得很小,但是用這些基礎(chǔ)鏡像來構(gòu)建我們自己的鏡像的話,最后建下來文件體積都會(huì)變得超大。比方說,如果我們用官方的Node鏡像來建自己的應(yīng)用鏡像,那么構(gòu)建下來鏡像文件的體積肯定是在643MB以上,因?yàn)镈ocker官方的Node鏡像本來就有那么大。
  大家不信可以試試看。我用官方的Node鏡像建了一個(gè)Hello World的Node應(yīng)用鏡像,這個(gè)應(yīng)用夠簡單了吧,可是這么簡單的一個(gè)應(yīng)用,鏡像卻有644MB。
  這個(gè)size也太大了,我的應(yīng)用加上依賴項(xiàng)總共還不到1MB,Node.js的運(yùn)行時(shí)環(huán)境大概是20MB,剩下的620MB到底是什么鬼?!這種大小是無法接受的。那么問題來了,有沒有什么辦法可以讓鏡像文件小點(diǎn)呢?
  關(guān)于微容器
  答案是肯定的。這里我要向大家隆重推薦微容器,通過微容器我們就可以完美解決上面說的問題了。微容器只包含了運(yùn)行應(yīng)用必需的OS庫文件和開發(fā)語言依賴項(xiàng),還有就是應(yīng)用本身,其他的統(tǒng)統(tǒng)不包含。
  構(gòu)建微鏡像的時(shí)候,大家不用像以前一樣從那種大而全的基礎(chǔ)鏡像開始搭建,只要根據(jù)自己的需求,先從最基本的應(yīng)用開始,逐步添加依賴項(xiàng)就可以了。
  微容器的優(yōu)勢
  說了這么多,到底微容器有哪些優(yōu)勢呢?
  體積更小。微容器的體積都很小,從上面那個(gè)例子大家可以看到,我們不用改任何代碼,就能把鏡像體積縮小到普通鏡像的22分之一。
  部署更快,更簡便。因?yàn)殓R像體積大大減小了,從Docker Hub之類的Docker鏡像倉庫下載鏡像的速度就會(huì)快很多,我們就可以更快地部署鏡像到各臺(tái)主機(jī)上。
  安全性更高。微容器里包含的代碼和程序更少,攻擊面也就更窄,所以底層OS的安全性也就相應(yīng)地提升了。
  從優(yōu)點(diǎn)上看微容器跟Unikernels很像,但是微容器沒有Unikernels的那些短板,總體來說要優(yōu)于Unikernels。
  微容器構(gòu)建教程
  所有Docker鏡像都是以scratch鏡像為基礎(chǔ)創(chuàng)建的。scratch 鏡像是一個(gè)空的鏡像文件,雖然看起來好像沒什么用處,但特別適合用來創(chuàng)建超級(jí)小的鏡像。如果我們?cè)诰幾g的時(shí)候可以像Go或者C語言編譯那樣,把應(yīng)用編譯成沒有依賴項(xiàng)的靜態(tài)二進(jìn)制文件,那最后創(chuàng)建出來的鏡像體積就很完美了。比方說,我創(chuàng)建了一個(gè)treeder/static-go鏡像,其中包含了一個(gè)Go 的web應(yīng)用,整個(gè)鏡像包括應(yīng)用在內(nèi)總共才5MB。
  由此可見,通過scratch鏡像+應(yīng)用的二進(jìn)制文件的方式,我們就可以構(gòu)建出極小化的鏡像。
  不過Go語言畢竟還是比較小眾的,也不是所有人都會(huì)用,所以大家在創(chuàng)建鏡像的時(shí)候可能還是或多或少的要打包一些依賴項(xiàng),這個(gè)時(shí)候scratch鏡像就不能滿足需求了,推薦大家有這方面問題的都使用Alpine Linux。Alpine Linux是一個(gè)面向安全應(yīng)用的輕量級(jí)Linux發(fā)行版,是在musl libc和busybox的基礎(chǔ)上構(gòu)建的。多的話我也不說了,大家可以自己去找相關(guān)的文章來看,這里我想說的是,輕量才是王道,Alpine基礎(chǔ)鏡像的大小只有5MB:
  Alpine是一個(gè)很不錯(cuò)的操作系統(tǒng),在此基礎(chǔ)上我們?cè)賹⒏鞣N依賴項(xiàng)打包到系統(tǒng)中,就可以構(gòu)建一個(gè)完備的輕量級(jí)鏡像了。就以上面的Node應(yīng)用為例,因?yàn)槲覀冎恍枰玫絅ode,所以只要添加Node包就可以了。我們可以用下面的Dockerfile來構(gòu)建鏡像:
  FROM alpine
  RUN apk update && apk upgrade
  RUN apk add nodejs
  這樣創(chuàng)建出來的鏡像只包含Node以及一些必要的依賴項(xiàng)。怎么樣,夠簡潔吧?
  下面我們要往鏡像中添加代碼,操作也很簡單,多寫幾行Dockerfile指令就行了:
  FROM alpine
  RUN apk update && apk upgrade
  RUN apk add nodejs
  WORKDIR /app
  ADD 。 /app
  ENTRYPOINT [ “node”, “server.js” ]
  大概的原理就是這樣,大家可以自己去網(wǎng)上找更詳細(xì)的代碼示例。這樣做的好處是,我們最終得到的鏡像里只包含一個(gè)非常輕量的操作系統(tǒng)、必要的依賴項(xiàng)以及應(yīng)用的代碼,沒有任何多余的東西。
  不只是Node,其他開發(fā)語言的鏡像也可以依此類推。
  更多基礎(chǔ)鏡像
  除了上面說的微鏡像以外,還有更給力的?,F(xiàn)在在github上有很多輕量的基礎(chǔ)鏡像,基本上所有主流開發(fā)語言的基礎(chǔ)鏡像都有,大家可以戳下面這個(gè)鏈接,自己去github上下載合適的鏡像。
  https://github.com/iron-io/dockers
  這些鏡像都是經(jīng)過優(yōu)化的,文件體積很小,而且Github還會(huì)定期更新,大家可以直接用這些鏡像,效率要比我們自己創(chuàng)建鏡像好一些。還是以上面的Node應(yīng)用為例,如果用Iron.io上面的基礎(chǔ)鏡像,Dockerfile指令還可以更簡單一些:
  FROM iron/node
  WORKDIR /app
  ADD 。 /app
  ENTRYPOINT [ “node”, “server.js” ]
  另外說一下,Github上面的基礎(chǔ)鏡像都有兩個(gè)版本,一個(gè)用于應(yīng)用編譯,一個(gè)用于運(yùn)行應(yīng)用,用來做編譯的鏡像包含了很多編譯工具,體積要大很多,這個(gè)大家要注意一下。
  比方說,如果要編譯Node依賴項(xiàng),就要用iron/node:dev做基礎(chǔ)鏡像:
  docker run –rm -v “[Math Processing Error]PWD”:/app -w /app iron/node node server.js
  上面的方式也適用于其他語言,不過寫命令的時(shí)候要用各自的build/vendor/run命令。
  如果要對(duì)某種語言的某個(gè)特定版本創(chuàng)建鏡像的話,我們只要改一下上面命令里的tag就行了,比如說要?jiǎng)?chuàng)建node 4.1或者node 0.12的鏡像,就直接把鏡像名改成iron/node:4.1或者iron/node:0.12就行。Docker Hub上針對(duì)每一種語言的每個(gè)版本都有相應(yīng)的tag鏡像,比如說Node的各種鏡像就可以在這個(gè)鏈接下載到:https://hub.docker.com/r/iron/node/tags/。 其他語言的鏡像可以去iron-io/dockers倉庫下載。
  各種語言的鏡像構(gòu)建方法
  這個(gè)問題要復(fù)雜一些,大家可以戳下面這個(gè)鏈接,里面包含了大多數(shù)主流開發(fā)語言的微鏡像構(gòu)建方法。
  https://github.com/iron-io/dockerworker
  進(jìn)去以后大家可以查看各種開發(fā)語言對(duì)應(yīng)的README文檔,這里面的教程是很全面的,大家可以參照教程來編譯依賴項(xiàng)、測試應(yīng)用代碼、構(gòu)建微型Docker鏡像并測試鏡像。
  在提倡微服務(wù)架構(gòu)的今天,對(duì)應(yīng)用部署的要求越來越高,容器的大小直接影響到服務(wù)的部署和運(yùn)行。而容器從本質(zhì)上說只是鏡像的一個(gè)實(shí)例,所以歸根結(jié)底,應(yīng)用的性能和體驗(yàn)在很大程度上還是取決于鏡像的大小。希望大家讀完本文之后,都能獨(dú)立地創(chuàng)建出不含任何多余文件的Docker微鏡像,這個(gè)問題很重要,因?yàn)槲覀円坏╅_始在容器里運(yùn)行鏡像,就不可避免地會(huì)碰到文件體積問題,這個(gè)時(shí)候只有微容器才是最好的解決方案,希望大家從一開始就考慮到這個(gè)問題,并在今后的實(shí)戰(zhàn)中堅(jiān)持貫徹微容器的思想。
  Alpine是一個(gè)很不錯(cuò)的操作系統(tǒng),在此基礎(chǔ)上我們?cè)賹⒏鞣N依賴項(xiàng)打包到系統(tǒng)中,就可以構(gòu)建一個(gè)完備的輕量級(jí)鏡像了。就以上面的Node應(yīng)用為例,因?yàn)槲覀冎恍枰玫絅ode,所以只要添加Node包就可以了。我們可以用下面的Dockerfile來構(gòu)建鏡像:
  FROM alpine
  RUN apk update && apk upgrade
  RUN apk add nodejs
  這樣創(chuàng)建出來的鏡像只包含Node以及一些必要的依賴項(xiàng)。怎么樣,夠簡潔吧?
  下面我們要往鏡像中添加代碼,操作也很簡單,多寫幾行Dockerfile指令就行了:
  FROM alpine
  RUN apk update && apk upgrade
  RUN apk add nodejs
  WORKDIR /app
  ADD 。 /app
  ENTRYPOINT [ “node”, “server.js” ]
  大概的原理就是這樣,大家可以自己去網(wǎng)上找更詳細(xì)的代碼示例。這樣做的好處是,我們最終得到的鏡像里只包含一個(gè)非常輕量的操作系統(tǒng)、必要的依賴項(xiàng)以及應(yīng)用的代碼,沒有任何多余的東西。
  不只是Node,其他開發(fā)語言的鏡像也可以依此類推。
  更多基礎(chǔ)鏡像
  除了上面說的微鏡像以外,還有更給力的?,F(xiàn)在在github上有很多輕量的基礎(chǔ)鏡像,基本上所有主流開發(fā)語言的基礎(chǔ)鏡像都有,大家可以戳下面這個(gè)鏈接,自己去github上下載合適的鏡像。
  https://github.com/iron-io/dockers
  這些鏡像都是經(jīng)過優(yōu)化的,文件體積很小,而且Github還會(huì)定期更新,大家可以直接用這些鏡像,效率要比我們自己創(chuàng)建鏡像好一些。還是以上面的Node應(yīng)用為例,如果用Iron.io上面的基礎(chǔ)鏡像,Dockerfile指令還可以更簡單一些:
  FROM iron/node
  WORKDIR /app
  ADD 。 /app
  ENTRYPOINT [ “node”, “server.js” ]
  另外說一下,Github上面的基礎(chǔ)鏡像都有兩個(gè)版本,一個(gè)用于應(yīng)用編譯,一個(gè)用于運(yùn)行應(yīng)用,用來做編譯的鏡像包含了很多編譯工具,體積要大很多,這個(gè)大家要注意一下。
  比方說,如果要編譯Node依賴項(xiàng),就要用iron/node:dev做基礎(chǔ)鏡像:
  docker run –rm -v “[Math Processing Error]PWD”:/app -w /app iron/node node server.js
  上面的方式也適用于其他語言,不過寫命令的時(shí)候要用各自的build/vendor/run命令。
  如果要對(duì)某種語言的某個(gè)特定版本創(chuàng)建鏡像的話,我們只要改一下上面命令里的tag就行了,比如說要?jiǎng)?chuàng)建node 4.1或者node 0.12的鏡像,就直接把鏡像名改成iron/node:4.1或者iron/node:0.12就行。Docker Hub上針對(duì)每一種語言的每個(gè)版本都有相應(yīng)的tag鏡像,比如說Node的各種鏡像就可以在這個(gè)鏈接下載到:https://hub.docker.com/r/iron/node/tags/。 其他語言的鏡像可以去iron-io/dockers倉庫下載。
  各種語言的鏡像構(gòu)建方法
  這個(gè)問題要復(fù)雜一些,大家可以戳下面這個(gè)鏈接,里面包含了大多數(shù)主流開發(fā)語言的微鏡像構(gòu)建方法。
  https://github.com/iron-io/dockerworker
  進(jìn)去以后大家可以查看各種開發(fā)語言對(duì)應(yīng)的README文檔,這里面的教程是很全面的,大家可以參照教程來編譯依賴項(xiàng)、測試應(yīng)用代碼、構(gòu)建微型Docker鏡像并測試鏡像。
  在提倡微服務(wù)架構(gòu)的今天,對(duì)應(yīng)用部署的要求越來越高,容器的大小直接影響到服務(wù)的部署和運(yùn)行。而容器從本質(zhì)上說只是鏡像的一個(gè)實(shí)例,所以歸根結(jié)底,應(yīng)用的性能和體驗(yàn)在很大程度上還是取決于鏡像的大小。希望大家讀完本文之后,都能獨(dú)立地創(chuàng)建出不含任何多余文件的Docker微鏡像,這個(gè)問題很重要,因?yàn)槲覀円坏╅_始在容器里運(yùn)行鏡像,就不可避免地會(huì)碰到文件體積問題,這個(gè)時(shí)候只有微容器才是最好的解決方案,希望大家從一開始就考慮到這個(gè)問題,并在今后的實(shí)戰(zhàn)中堅(jiān)持貫徹微容器的思想。
?

非常好我支持^.^

(0) 0%

不好我反對(duì)

(0) 0%

      發(fā)表評(píng)論

      用戶評(píng)論
      評(píng)價(jià):好評(píng)中評(píng)差評(píng)

      發(fā)表評(píng)論,獲取積分! 請(qǐng)遵守相關(guān)規(guī)定!

      ?