成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從943MB到6.34kB,容器精簡大挑戰

云計算
本文我們就學習容器精簡的案例,通過一系列的騷操作,最終將鏡像的大小從943MB減小到了6.32k。

容器給我們的生活帶來了極大便利,人人都喜歡容器,然而容器也很耗空間,動輒幾百兆,上G的鏡像是普遍現象。本文我們就學習容器精簡的案例,通過一系列的騷操作,最終將鏡像的大小從943MB減小到了6.32k。

[[396110]]

概述

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

基本步驟

一個Http應用容器,可以通過指定端口提供web服務。

不進行卷掛載。

原始方案

為了獲得基準鏡像大小,我們用node.js創建一個簡單只提供index.js訪問的簡單的服務器:

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. }); 

然后,將該文件內置到一個鏡像中,鏡像基于Node官方基本鏡像。

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

編譯

  1. docker build -t cchttp:01 ./ 

鏡像大小為943MB

精簡基礎鏡像

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

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

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

更換語言

為了進一步優化,需要使用運行時依賴項更少的編譯語言。而這時候肯定會首先想到的是一個靜態編譯語言Golang,這是個常見而且不錯的選擇。在Golang中一個基本的Web服務代碼如下:

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官方基礎鏡像,將其打包到鏡像:

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

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

通過分析發現是由于golang基本鏡像中安裝了很多依賴包,這些依賴包在構建go軟件時很有用,但不是每個運行時都需要的,所以可以從這兒著手優化。

多階段構建

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

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

到多階段構建dockerfile:

  1. ###編譯### 
  2. FROM golang:1.14-alpine AS builder 
  3. COPY . . 
  4. RUN go build -o server . 
  5. ###運行### 
  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。

靜態編譯結合scratch基礎鏡像

13M的鏡像已經很不錯了,但是還有其他優化的技巧。在docker世界中還有幾個基礎鏡像scratch ,那就是一個From 0 開始的基礎鏡像,使用該鏡像沒有任何依賴,完全從0開始,所以大小也就從0開始。Linux 有個發行版LFS,其全稱是Linux From Scratch ,就是從零開始自己動手編譯出一個完整的OS。這個scratch基礎鏡像也是這個意思。

為了讓scratch基礎鏡像支持我們的web.go運行,我們需要在編譯鏡像中添加靜態編譯的標志,確保所有依賴都可以打包到運行鏡像中:

  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. ###運行### 
  8. FROM scratch 
  9. COPY --from=builder /go/server ./server 
  10. COPY index.html index.html 
  11. CMD ["./server"] 

上面構建過程中,在代碼鏈接過程中模式設置為external,-static鏈接外部鏈接器。

優化后,鏡像大小為8.65MB。

最終大殺器——匯編語言

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

我們還使用多階段編譯方法,在ubuntu基礎鏡像中先編譯其依賴項,然后在Scratch基礎鏡像中打包并運行。

  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. ###運行### 
  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"] 

產生的圖像大小僅為6.34kB:

然后用該鏡像運行一個容器:

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

用curl訪問一下:

  1. curl -vv 127.0.0.1:10080 

總結

本文我們探索了容器精簡的各種方法和嘗試。當然由于容器的功能簡單,這些策略可能不發直接在實踐中使用,但是可以作為容器調優的思路參考。

 

 

責任編輯:趙寧寧 來源: 今日頭條
相關推薦

2017-02-09 17:30:05

Android應用瘦身

2024-06-18 08:21:31

2022-12-20 16:10:31

2016-01-12 12:41:27

浪潮

2021-08-30 07:08:59

Docker鏡像服務器

2021-01-26 09:30:58

Docker運維命令

2025-03-17 00:00:00

OT系統安全運營技術

2018-04-11 16:52:44

2023-10-04 00:43:46

推導式Python

2013-09-13 09:11:33

云計算大數據臺風

2010-03-23 09:31:13

云計算

2015-06-12 10:03:05

QQ瀏覽器

2021-09-07 10:08:32

GitLab遠程辦公

2024-12-23 00:27:40

2025-02-20 09:27:46

2015-12-18 16:19:47

私有云從VMwareOpenStack

2024-11-11 17:16:44

2020-08-13 17:18:20

Kubernetes邊緣容器

2023-08-28 16:10:00

容器化DockerKubernetes

2012-03-08 21:41:10

App Store
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久91精品国产一区二区三区 | 日韩成人影院 | 污污免费网站 | 亚洲国产精品久久 | 亚洲国产一区在线 | 欧美日韩在线一区二区三区 | 亚洲精品美女 | 久久9热| 91精品国产色综合久久不卡蜜臀 | 国产成人精品av | 狠狠干在线 | 黄色在线免费观看 | 亚洲精品福利视频 | 国产精品1区2区 | 久久天堂 | 欧美国产一区二区 | 欧美性猛交一区二区三区精品 | 日韩精品一区二区三区 | 国产小视频在线 | 欧美久久精品一级黑人c片 91免费在线视频 | 伊人狠狠 | 中文亚洲视频 | 午夜免费精品视频 | 欧美成人激情 | 亭亭五月激情 | 色婷婷久久久亚洲一区二区三区 | 91久久久久久久久久久久久 | 精品真实国产乱文在线 | 亚洲国产精品久久久 | 久久久久亚洲精品 | 一区二区视频免费观看 | 中文精品视频 | 亚洲国产精品激情在线观看 | 夜夜久久 | 日本精品视频一区二区 | 国精久久 | 久久久精品一区 | 99精品观看 | 欧美男人亚洲天堂 | 免费影视在线观看 | 91视频大全 |