日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
從943MB到6.34kB,容器精簡(jiǎn)大挑戰(zhàn)

從943MB到6.34kB,容器精簡(jiǎn)大挑戰(zhàn)

作者:蟲(chóng)蟲(chóng)安全 2021-04-27 08:53:37

云計(jì)算 本文我們就學(xué)習(xí)容器精簡(jiǎn)的案例,通過(guò)一系列的騷操作,最終將鏡像的大小從943MB減小到了6.32k。

成都創(chuàng)新互聯(lián)公司2013年至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元沿灘做網(wǎng)站,已為上家服務(wù),為沿灘各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108

容器給我們的生活帶來(lái)了極大便利,人人都喜歡容器,然而容器也很耗空間,動(dòng)輒幾百兆,上G的鏡像是普遍現(xiàn)象。本文我們就學(xué)習(xí)容器精簡(jiǎn)的案例,通過(guò)一系列的騷操作,最終將鏡像的大小從943MB減小到了6.32k。

概述

容器是實(shí)踐中用來(lái)解決與操作軟件版本和包依賴相關(guān)的所有問(wèn)題的有效途徑。 人人都喜歡容器,但是用容器就得面對(duì)各式各樣龐大和雜亂的鏡像,如果空間有限,則很快就會(huì)被充滿,實(shí)際上可以通過(guò)一些有效的策略來(lái)減小鏡像大小。

基本步驟

一個(gè)Http應(yīng)用容器,可以通過(guò)指定端口提供web服務(wù)。

不進(jìn)行卷掛載。

原始方案

為了獲得基準(zhǔn)鏡像大小,我們用node.js創(chuàng)建一個(gè)簡(jiǎn)單只提供index.js訪問(wèn)的簡(jiǎn)單的服務(wù)器:

index.js代碼:

  
 
 
 
  1. const fs = require("fs"); 
  2. const http = require('http'); 
  3. const server = http.createServer((req, res) => { 
  4. res.writeHead(200, { 'content-type': 'text/html' }) 
  5. fs.createReadStream('index.html').pipe(res) 
  6. }) 
  7. server.listen(port, hostname, () => { 
  8. console.log(`Server: http://0.0.0.0:8080/`); 
  9. }); 

然后,將該文件內(nèi)置到一個(gè)鏡像中,鏡像基于Node官方基本鏡像。

  
 
 
 
  1. FROM node:14 
  2. COPY . . 
  3. CMD ["node", "index.js"] 

編譯

  
 
 
 
  1. docker build -t cchttp:01 ./ 

鏡像大小為943MB

精簡(jiǎn)基礎(chǔ)鏡像

鏡像精簡(jiǎn)最常用,最簡(jiǎn)單,最明顯的策略之一就是使用較小的基礎(chǔ)圖像。Node鏡像中slim 變體(基于debian,但預(yù)安裝的依賴項(xiàng)較少)和基于Alpine Linux的alpine變體 。

這兩個(gè)基礎(chǔ)鏡像分別為node:14-slim 和 node:14-alpine ,其鏡像大小分別減少到167MB 和 116MB 分別。

Docker由于鏡像是分層疊加的,node.js需要依賴很多層的鏡像,除了精簡(jiǎn)解決方案目前還沒(méi)有其他變小的方法。

更換語(yǔ)言

為了進(jìn)一步優(yōu)化,需要使用運(yùn)行時(shí)依賴項(xiàng)更少的編譯語(yǔ)言。而這時(shí)候肯定會(huì)首先想到的是一個(gè)靜態(tài)編譯語(yǔ)言Golang,這是個(gè)常見(jiàn)而且不錯(cuò)的選擇。在Golang中一個(gè)基本的Web服務(wù)代碼如下:

web.go:

  
 
 
 
  1. package main 
  2. import ( 
  3. "fmt" 
  4. "log" 
  5. "net/http" 
  6. func main() { 
  7. fileServer := http.FileServer(http.Dir("./")) 
  8. http.Handle("/", fileServer) 
  9. fmt.Printf("Starting server at port 8080\n") 
  10. if err := http.ListenAndServe(":8080", nil); err != nil { 
  11. log.Fatal(err) 

然后用golang官方基礎(chǔ)鏡像,將其打包到鏡像:

  
 
 
 
  1. FROM golang:1.14 
  2. COPY . . 
  3. RUN go build -o server . 
  4. CMD ["./server"] 

基于golang的解決方案,鏡像大小818MB,還是很大。

通過(guò)分析發(fā)現(xiàn)是由于golang基本鏡像中安裝了很多依賴包,這些依賴包在構(gòu)建go軟件時(shí)很有用,但不是每個(gè)運(yùn)行時(shí)都需要的,所以可以從這兒著手優(yōu)化。

多階段構(gòu)建

Docker支持多階段構(gòu)建的機(jī)制,可以很輕松在具有所有必要依賴項(xiàng)的環(huán)境中構(gòu)建代碼,然后將生成的可執(zhí)行包直接打包到其他鏡像中使用。這樣就可以解決我們上一步遇到需要編譯時(shí)工具和包,但是運(yùn)行時(shí)不需要包,這樣可以極大地減少鏡像大小。

注意:Docker多階段構(gòu)建的機(jī)制是Docker 17.05引入的新特性,如果要使用該功能你需要將Docker版本升級(jí)到Docker 17.05及更高版本。

到多階段構(gòu)建dockerfile:

  
 
 
 
  1. ###編譯### 
  2. FROM golang:1.14-alpine AS builder 
  3. COPY . . 
  4. RUN go build -o server . 
  5. ###運(yùn)行### 
  6. FROM alpine:3.12 
  7. COPY --from=builder /go/server ./server 
  8. COPY index.html index.html 
  9. CMD ["./server"] 

  
 
 
 
  1. Docker images 

(⊙o⊙)哇,策略生效,這樣生成的鏡像只有13.2MB。

靜態(tài)編譯結(jié)合scratch基礎(chǔ)鏡像

13M的鏡像已經(jīng)很不錯(cuò)了,但是還有其他優(yōu)化的技巧。在docker世界中還有幾個(gè)基礎(chǔ)鏡像scratch ,那就是一個(gè)From 0 開(kāi)始的基礎(chǔ)鏡像,使用該鏡像沒(méi)有任何依賴,完全從0開(kāi)始,所以大小也就從0開(kāi)始。Linux 有個(gè)發(fā)行版LFS,其全稱是Linux From Scratch ,就是從零開(kāi)始自己動(dòng)手編譯出一個(gè)完整的OS。這個(gè)scratch基礎(chǔ)鏡像也是這個(gè)意思。

為了讓scratch基礎(chǔ)鏡像支持我們的web.go運(yùn)行,我們需要在編譯鏡像中添加靜態(tài)編譯的標(biāo)志,確保所有依賴都可以打包到運(yùn)行鏡像中:

  
 
 
 
  1. ### 編譯### 
  2. FROM golang:1.14 as builder 
  3. COPY . . 
  4. RUN go build -o server \ 
  5. -ldflags "-linkmode external -extldflags -static" \ 
  6. -a web.go 
  7. ###運(yùn)行### 
  8. FROM scratch 
  9. COPY --from=builder /go/server ./server 
  10. COPY index.html index.html 
  11. CMD ["./server"] 

上面構(gòu)建過(guò)程中,在代碼鏈接過(guò)程中模式設(shè)置為external,-static鏈接外部鏈接器。

優(yōu)化后,鏡像大小為8.65MB。

最終大殺器——匯編語(yǔ)言

用Golang語(yǔ)言編寫(xiě)的程序,起碼也有大概M級(jí)別的大小,10MB鏡像應(yīng)該已經(jīng)到了可以精簡(jiǎn)的極限。但是還可以用其他技巧來(lái)大幅度精簡(jiǎn)大小,但是需要使用要給終極大殺器,那就是匯編語(yǔ)言,最終解決方案是使用一個(gè)匯編編寫(xiě)的全功能http服務(wù)器assmttpd,其源碼托管在GitHub(github/nemasu/asmttpd)。

我們還使用多階段編譯方法,在ubuntu基礎(chǔ)鏡像中先編譯其依賴項(xiàng),然后在Scratch基礎(chǔ)鏡像中打包并運(yùn)行。

  
 
 
 
  1. ###編譯### 
  2. FROM ubuntu:18.04 as builder 
  3. RUN apt update 
  4. RUN apt install -y make yasm as31 nasm binutils 
  5. COPY . . 
  6. RUN make release 
  7. ###運(yùn)行### 
  8. FROM scratch 
  9. COPY --from=builder /asmttpd /asmttpd 
  10. COPY /web_root/index.html /web_root/index.html 
  11. CMD ["/asmttpd", "/web_root", "8080"] 

產(chǎn)生的圖像大小僅為6.34kB:

然后用該鏡像運(yùn)行一個(gè)容器:

  
 
 
 
  1. docker run -it -p 10080:8080 cchttp:07 

用curl訪問(wèn)一下:

  
 
 
 
  1. curl -vv 127.0.0.1:10080 

總結(jié)

本文我們探索了容器精簡(jiǎn)的各種方法和嘗試。當(dāng)然由于容器的功能簡(jiǎn)單,這些策略可能不發(fā)直接在實(shí)踐中使用,但是可以作為容器調(diào)優(yōu)的思路參考。


名稱欄目:從943MB到6.34kB,容器精簡(jiǎn)大挑戰(zhàn)
網(wǎng)頁(yè)鏈接:http://www.5511xx.com/article/cdhcpeo.html