久久国产乱子伦精品免费M,亚洲一区二区三区91,欧美国产在线视频,国产精品视频久久

七步制作精簡鏡像

目錄

  • 介紹
  • 鏡像層(Layers)
  • 制作步驟
    • lab-1:初始化構(gòu)建 Redis 鏡像
    • lab-2:優(yōu)化基礎(chǔ)鏡像
    • lab-3:串聯(lián) Dockerfile 指令
    • lab-4:壓縮你的鏡像
    • lab-5:使用最精簡的 base image
    • lab-6:提取動(dòng)態(tài)鏈接的 .so 文件
    • lab-7:為 Go 應(yīng)用構(gòu)建精簡鏡像
  • 總結(jié)
  • 參考

七步制作精簡鏡像

介紹

前段時(shí)間網(wǎng)易蜂巢曾經(jīng)推出蜂巢?Logo?T恤,用的正是 Docker 鏡像制作,最神奇的是,它最終的鏡像大小只有?585?字節(jié)。

七步制作精簡鏡像

有些鏡像都不是我們自己來打包的(比如下載公共鏡像),那是否有一些通用的精簡 Docker 鏡像的手段呢?答案是肯定的,甚至有的鏡像可以精簡 98%。精簡鏡像大小的好處不言而喻,既節(jié)省了存儲(chǔ)空間,又能節(jié)省帶寬,加快傳輸?shù)取D呛茫酉聛砭驼?qǐng)跟隨我來學(xué)習(xí)怎么制作精簡 Docker 鏡像。

鏡像層(Layers)

在開始制作鏡像之前,首先了解下鏡像的原理,而這其中最重要的概念就是鏡像層(Layers)。鏡像層依賴于一系列的底層技術(shù),比如文件系統(tǒng)(filesystems)、寫時(shí)復(fù)制(copy-on-write)、聯(lián)合掛載(union mounts)等,幸運(yùn)的是你可以在很多地方學(xué)習(xí)到這些技術(shù),這里就不再贅述技術(shù)細(xì)節(jié)。

七步制作精簡鏡像

總的來說,你最需要記住這點(diǎn):

七步制作精簡鏡像

舉例來說:

七步制作精簡鏡像

以上 Dockerfile 干了幾件事:

  1. 基于一個(gè)官方的基礎(chǔ)鏡像 busybox(只有1M多)
  2. 創(chuàng)建一個(gè)文件夾(/tmp/foo)和一個(gè)文件(bar),該文件分配了100M大小
  3. 再把這個(gè)大文件刪除

實(shí)際上它最終什么也沒做,我們把它構(gòu)建成鏡像(構(gòu)建可以參考一期):

七步制作精簡鏡像

再讓我們來對(duì)比下原生的 busybox 鏡像大小和我們生成的鏡像大小:

七步制作精簡鏡像

出乎意料的是,卻生成了 106 MB 的鏡像。

多出了 100 M,這是為何?這點(diǎn)和 Git 類似(都用到了Copy-On-Write技術(shù)),我用 git 做了如下兩次提交(添加了又刪除),請(qǐng)問?A_VERY_LARGE_FILE?還在 git 倉庫中嗎?

七步制作精簡鏡像

答案是:在的,并且會(huì)占用倉庫的大小。Git 會(huì)保存每一次提交的文件版本,而 Dockerfile 中每一條指令都可能增加整體鏡像的大小,即使它最終什么事情都沒做。

制作步驟

了解了鏡像層知識(shí),有助于我們接下來制作精簡鏡像。這里開始,以最常用的開源緩存軟件?Redis?為例,從一步步試驗(yàn),來介紹如何制作更精簡的 Docker 鏡像。

lab-1:初始化構(gòu)建 Redis 鏡像

直接上?Dockerfile?:

七步制作精簡鏡像

結(jié)合注釋,讀起來并不困難,用到的都是常規(guī)的幾個(gè)命令,簡要介紹如下:

  • FROM:頂頭寫,指定一個(gè)基礎(chǔ)鏡像,此處基于?ubuntu:trusty
  • ENV:設(shè)置環(huán)境變量,這里設(shè)置了?VER?和?TARBALL?兩個(gè)環(huán)境變量
  • RUN:最常用的 Dockerfile 指令,用于運(yùn)行各種命令,這里調(diào)用了 8 次 RUN 指令
  • WORKDIR:指定工作目錄,相當(dāng)于指令?cd
  • CMD:指定鏡像默認(rèn)執(zhí)行的命令,此處默認(rèn)執(zhí)行 redis-server 命令來啟動(dòng) redis

執(zhí)行構(gòu)建:

七步制作精簡鏡像

注:國內(nèi)網(wǎng)絡(luò),更新下載可能會(huì)較慢

查看大小:

七步制作精簡鏡像

動(dòng)輒就有 300多 M 的大小,不能忍,下面我們開始一步步優(yōu)化。

lab-2:優(yōu)化基礎(chǔ)鏡像

精簡1:選用更小的基礎(chǔ)鏡像。

常用的 Linux 系統(tǒng)鏡像一般有?ubuntucentosdebian,其中debian?更輕量,而且夠用,對(duì)比如下:

七步制作精簡鏡像

替換?debian:jessie?作為我們的基礎(chǔ)鏡像。

優(yōu)化 Dockerfile:

七步制作精簡鏡像

執(zhí)行構(gòu)建:

七步制作精簡鏡像

查看大小:

七步制作精簡鏡像

減少了42M,稍有成效,但并不明顯。細(xì)心的同學(xué)應(yīng)該發(fā)現(xiàn),只有 122 MB 的?debian?基礎(chǔ)鏡像,構(gòu)建后增加到了 305 MB,看來這里面肯定有優(yōu)化的空間,如何優(yōu)化就要用到我們開頭說到的?Image Layer?知識(shí)了。

lab-3:串聯(lián) Dockerfile 指令

精簡2:串聯(lián)你的 Dockerfile 指令(一般是?RUN?指令)。

Dockerfile 中的 RUN 指令通過?&&?和?/?支持將命令串聯(lián)在一起,有時(shí)能達(dá)到意想不到的精簡效果。

優(yōu)化 Dockerfile:

七步制作精簡鏡像

構(gòu)建:

七步制作精簡鏡像

查看大小:

七步制作精簡鏡像

哇!一下子減少了 50%,效果明顯啊!這是最常用的一個(gè)精簡手段了。

lab-4:壓縮你的鏡像

優(yōu)化3:試著用命令或工具壓縮你的鏡像。

docker 自帶的一些命令還能協(xié)助壓縮鏡像,比如?export?和?import

七步制作精簡鏡像

但麻煩的是需要先將容器運(yùn)行起來,而且這個(gè)過程中你會(huì)丟失鏡像原有的一些信息,比如:導(dǎo)出端口,環(huán)境變量,默認(rèn)指令。

所以一般通過命令行來精簡鏡像都是實(shí)驗(yàn)性的,那么這里再推薦一個(gè)小工具:docker-squash。用起來更簡單方便,并且不會(huì)丟失原有鏡像的自帶信息。

下載安裝:

https://github.com/jwilder/docker-squash#installation

壓縮操作:

七步制作精簡鏡像

注:該工具在 Mac 下并不好使,請(qǐng)?jiān)?Linux 下使用

對(duì)比大小:

七步制作精簡鏡像

好吧,從這里看起來并沒有太大作用,所以我只能說試著,而不要報(bào)太大期望。

lab-5:使用最精簡的 base image

七步制作精簡鏡像

使用?scratch?或者?busybox?作為基礎(chǔ)鏡像。

關(guān)于 scratch:

  • 一個(gè)空鏡像,只能用于構(gòu)建鏡像,通過?FROM scratch
  • 在構(gòu)建一些基礎(chǔ)鏡像,比如?debian?、?busybox,非常有用
  • 用于構(gòu)建超少鏡像,比如構(gòu)建一個(gè)包含所有庫的二進(jìn)制文件

關(guān)于?busybox

  • 只有 1~5M 的大小
  • 包含了常用的 UNIX 工具
  • 非常方便構(gòu)建小鏡像

這些超小的基礎(chǔ)鏡像,結(jié)合能生成靜態(tài)原生 ELF 文件的編譯語言,比如C/C++,比如 Go,特別方便構(gòu)建超小的鏡像。

cloudcomb-logo(C語言開發(fā)) 就是用到了該原理,才能構(gòu)建出 585 字節(jié)的鏡像。

redis?同樣使用 C語言 開發(fā),看來也有很大的優(yōu)化空間,下面這個(gè)實(shí)驗(yàn),讓我們介紹具體的操作方法。

lab-6:提取動(dòng)態(tài)鏈接的 .so 文件

實(shí)驗(yàn)上下文:

七步制作精簡鏡像

隆重推出 ldd:打印共享的依賴庫

七步制作精簡鏡像

將所有需要的 .so 文件打包:

七步制作精簡鏡像

再制作成 Dockerfile:

七步制作精簡鏡像

執(zhí)行構(gòu)建:

七步制作精簡鏡像

查看大小:

七步制作精簡鏡像

哇!顯著提高啦!

測試一下:

七步制作精簡鏡像

總結(jié)一下:

  1. 用?ldd?查出所需的 .so 文件
  2. 將所有依賴壓縮成?rootfs.tar?或?rootfs.tar.gz,之后打進(jìn)?scratch?基礎(chǔ)鏡像

lab-7:為 Go 應(yīng)用構(gòu)建精簡鏡像

Go 語言天生就方便用來構(gòu)建精簡鏡像,得益于它能方便的打包成包含靜態(tài)鏈接的二進(jìn)制文件。

打個(gè)比方,你有一個(gè) 4 MB 大小的包含靜態(tài)鏈接的 Go 二進(jìn)制,并且將其打進(jìn) scratch 這樣的基礎(chǔ)鏡像,你得到的鏡像大小也只有區(qū)區(qū)的 4 MB。這可是包含同樣功能的 Ruby 程序的百分之一啊。

這里再給大家介紹一個(gè)非常好用開源的 Go 編譯工具:golang-builder,并給大家實(shí)際演示一個(gè)例子

程序代碼:

七步制作精簡鏡像

Dockerfile:

七步制作精簡鏡像

通過 golang-builder 打包成鏡像:

七步制作精簡鏡像

查看鏡像大小(Mac下測試):

七步制作精簡鏡像

哇!這么省力,就能創(chuàng)建幾 M 大小的鏡像,Go 簡介就是為 Docker 鏡像量身定做的!

總結(jié)

我們介紹了鏡像層的知識(shí),并且通過實(shí)驗(yàn),介紹三種如何精簡鏡像的技巧。這里主要介紹了三種精簡方法:選用更精小的鏡像,串聯(lián) Dockerfile 運(yùn)行指令,以及試著壓縮你的鏡像。通過這幾個(gè)技巧,已經(jīng)可以將 300M 大小的鏡像壓縮到 150M,壓縮率50%到98%,效果還是不錯(cuò)。

  1. 優(yōu)化基礎(chǔ)鏡像
  2. 串接 Dockerfile 命令:
  3. 壓縮 Docker images
  4. 優(yōu)化程序依賴
  5. 選用更合適的開發(fā)語言
文章來自黃慶兵老師的網(wǎng)易蜂巢《玩轉(zhuǎn) Docker 鏡像》系列https://github.com/bingohuang/play-docker-images,原本分為上下兩篇,由Go生態(tài)整合成一篇便于閱讀,侵刪!
作者簡介:?黃慶兵,畢業(yè)于浙大,工作于網(wǎng)易,從事云計(jì)算、Docker和Go相關(guān)開發(fā)及布道工作;喜歡開源,樂于分享,勤于布道,折騰過開源小工具,制作過Docker課程,分享過 Gopher Meetup。我的 Github 賬號(hào):https://github.com/bingohuang,歡迎一起來?寫 Go 玩 Docker!

相關(guān)新聞

歷經(jīng)多年發(fā)展,已成為國內(nèi)好評(píng)如潮的Linux云計(jì)算運(yùn)維、SRE、Devops、網(wǎng)絡(luò)安全、云原生、Go、Python開發(fā)專業(yè)人才培訓(xùn)機(jī)構(gòu)!

    1. 主站蜘蛛池模板: 上饶市| 西乌珠穆沁旗| 庐江县| 毕节市| 光泽县| 南江县| 准格尔旗| 湘潭县| 准格尔旗| 九龙城区| 仙游县| 长子县| 安顺市| 连州市| 寻乌县| 巫山县| 张掖市| 科技| 大宁县| 汕尾市| 清镇市| 西宁市| 临洮县| 泾川县| 漾濞| 二连浩特市| 芒康县| 敦煌市| 汉寿县| 肥城市| 延边| 青川县| 平邑县| 平安县| 肥东县| 德阳市| 迁安市| 珲春市| 佛山市| 贺州市| 长沙市|