真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何精簡(jiǎn)Docker鏡像

本篇內(nèi)容主要講解“如何精簡(jiǎn)Docker鏡像”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“如何精簡(jiǎn)Docker鏡像”吧!

政和網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,政和網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為政和成百上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的政和做網(wǎng)站的公司定做!

介紹

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

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

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

精簡(jiǎn)步驟

步驟 5: 使用最精簡(jiǎn)的 base image

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

關(guān)于 scratch:

  • 一個(gè)空鏡像,只能用于構(gòu)建鏡像,通過(guò) FROM scratch

  • 在構(gòu)建一些基礎(chǔ)鏡像,比如 debian 、 busybox,非常有用

  • 用于構(gòu)建超少鏡像,比如構(gòu)建一個(gè)包含所有庫(kù)的二進(jìn)制文件

關(guān)于 busybox

  • 只有 1~5M 的大小

  • 包含了常用的 UNIX 工具

  • 非常方便構(gòu)建小鏡像

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

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

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

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

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

$ 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:打印共享的依賴庫(kù)

$ 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"]

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

$ 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        |

哇!顯著提高啦!

測(cè)試一下:

$ 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)

總結(jié)一下:

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

  2. 將所有依賴壓縮成 rootfs.tarrootfs.tar.gz,之后打進(jìn) scratch 基礎(chǔ)鏡像

步驟 7: 為 Go 應(yīng)用構(gòu)建精簡(jiǎn)鏡像

Go 語(yǔ)言天生就方便用來(lái)構(gòu)建精簡(jiǎn)鏡像,得益于它能方便的打包成包含靜態(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è)例子

程序代碼:

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

import "fmt"

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

Dockerfile:

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

通過(guò) golang-builder 打包成鏡像:

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

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

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

到此,相信大家對(duì)“如何精簡(jiǎn)Docker鏡像”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!


文章名稱:如何精簡(jiǎn)Docker鏡像
文章鏈接:http://weahome.cn/article/gcijds.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部