本篇內(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 鏡像的終極手段!
方法:使用 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),讓我們介紹具體的操作方法。
實(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é)一下:
用 ldd
查出所需的 .so 文件
將所有依賴壓縮成 rootfs.tar
或 rootfs.tar.gz
,之后打進(jìn) scratch
基礎(chǔ)鏡像
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í)!