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