91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何精簡Docker鏡像

發布時間:2021-12-13 17:32:11 來源:億速云 閱讀:214 作者:iii 欄目:云計算

本篇內容主要講解“如何精簡Docker鏡像”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何精簡Docker鏡像”吧!

介紹

查看 docker hub 中的一些鏡像,我們有時能看到很多極小的鏡像,比如:

REPOSITORY              TAG        VIRTUAL SIZE    LICENSE
---------------         ------     ------------    -------
busybox                 latest     2.43 MB         GPLv2
progrium/busybox        latest     4.785 MB        GPLv2
alpine                  3.1        5.025 MB        GPLv2

這么小的鏡像是怎么做出來的呢?話接上文,接下來就介紹一些精簡 Docker 鏡像的終極手段!

精簡步驟

步驟 5: 使用最精簡的 base image

方法:使用 scratch 或者 busybox 作為基礎鏡像。

關于 scratch:

  • 一個空鏡像,只能用于構建鏡像,通過 FROM scratch

  • 在構建一些基礎鏡像,比如 debianbusybox,非常有用

  • 用于構建超少鏡像,比如構建一個包含所有庫的二進制文件

關于 busybox

  • 只有 1~5M 的大小

  • 包含了常用的 UNIX 工具

  • 非常方便構建小鏡像

這些超小的基礎鏡像,結合能生成靜態原生 ELF 文件的編譯語言,比如C/C++,比如 Go,特別方便構建超小的鏡像。

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

redis 同樣使用 C語言 開發,看來也有很大的優化空間,下面這個實驗,讓我們介紹具體的操作方法。

步驟 6: 提取動態鏈接的 .so 文件

實驗上下文:

$ cat /etc/os-release

NAME="Ubuntu"
VERSION="14.04.2 LTS, Trusty Tahr"
$ uname -a
Linux localhost 3.13.0-46-generic #77-Ubuntu SMP
Mon Mar 2 18:23:39 UTC 2015
x86_64 x86_64 x86_64 GNU/Linux

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

$ ldd  redis-3.0.0/src/redis-server
    linux-vdso.so.1 =>  (0x00007fffde365000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f307d5aa000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f307d38c000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f307cfc6000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f307d8b9000)

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

$ tar ztvf rootfs.tar.gz
4485167  2015-04-21 22:54  usr/local/bin/redis-server
1071552  2015-02-25 16:56  lib/x86_64-linux-gnu/libm.so.6
 141574  2015-02-25 16:56  lib/x86_64-linux-gnu/libpthread.so.0
1840928  2015-02-25 16:56  lib/x86_64-linux-gnu/libc.so.6
 149120  2015-02-25 16:56  lib64/ld-linux-x86-64.so.2

再制作成 Dockerfile:

FROM scratch
ADD  rootfs.tar.gz  /
COPY redis.conf     /etc/redis/redis.conf
EXPOSE 6379
CMD ["redis-server"]

執行構建:

$ docker build  -t redis-05  .

查看大小:

| Lab |         | Base       | PL    | .red[*] |  Size (MB) |    Memo               |
|:---:|:--------|:-----------|:-----:|:---:|---------------:|:--------------------------------|
|  01 |  redis  |  `ubuntu`  |   C   | dyn |   347.3        |    base ubuntu        |
|  02 |  redis  |  `debian`  |   C   | dyn |   305.7        |    base debian        |
|  03 |  redis  |  `debian`  |   C   | dyn |   151.4        |    cmd chaining       |
|  04 |  redis  |  `debian`  |   C   | dyn |   151.4        |    docker-squash      |
|  05 |  redis  |  `scratch` |   C   | dyn |    7.73        |    rootfs: .so        |

哇!顯著提高啦!

測試一下:

$ docker run -d --name redis-05 redis-05

$ redis-cli  -h  \
  $(docker inspect -f '{{.NetworkSettings.IPAddress}}' redis-05)

$ redis-benchmark  -h  \
  $(docker inspect -f '{{.NetworkSettings.IPAddress}}' redis-05)

總結一下:

  1. ldd 查出所需的 .so 文件

  2. 將所有依賴壓縮成 rootfs.tarrootfs.tar.gz,之后打進 scratch 基礎鏡像

步驟 7: 為 Go 應用構建精簡鏡像

Go 語言天生就方便用來構建精簡鏡像,得益于它能方便的打包成包含靜態鏈接的二進制文件。

打個比方,你有一個 4 MB 大小的包含靜態鏈接的 Go 二進制,并且將其打進 scratch 這樣的基礎鏡像,你得到的鏡像大小也只有區區的 4 MB。這可是包含同樣功能的 Ruby 程序的百分之一啊。

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

程序代碼:

package main // import "github.com/CenturyLinkLabs/hello"

import "fmt"

func main() {
    fmt.Println("Hello World")
}

Dockerfile:

FROM scratch
COPY hello /
ENTRYPOINT ["/hello"]

通過 golang-builder 打包成鏡像:

docker run --rm \
    -v $(pwd):/src \
    -v /var/run/docker.sock:/var/run/docker.sock \
    centurylink/golang-builder

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

$ docker images
REPOSITORY   TAG      IMAGE ID       CREATED          VIRTUAL SIZE
hello        latest   1a42948d3224   24 seconds ago   1.59 MB

到此,相信大家對“如何精簡Docker鏡像”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

马鞍山市| 芷江| 富源县| 汉沽区| 龙南县| 茶陵县| 五指山市| 阳春市| 扶风县| 洞头县| 汾西县| 凤庆县| 云林县| 濮阳市| 云龙县| 苗栗市| 鄂州市| 涟源市| 岑巩县| 石屏县| 岳普湖县| 台中县| 长治市| 林甸县| 沈丘县| 兴国县| 罗江县| 武平县| 美姑县| 固镇县| 镇巴县| 九江县| 安阳县| 贵溪市| 介休市| 左云县| 星子县| 额敏县| 宁武县| 马公市| 横峰县|