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

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

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

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

非常好我支持^.^

(0) 0%

不好我反對

(0) 0%

      發(fā)表評論

      用戶評論
      評價:好評中評差評

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

      ?