本文的原文连接是:
http://blog.csdn.net/freewebsys/article/details/79224625

1,关于scratch


特别有意思的一个镜像,是在使用 jaeger 的时候发现的,
发现 jaeger 的镜像特别小,很好奇,于是研究了下。
scratch 是一非常特别的镜像,这个镜像很有意思的是他是一个空镜像。
也就是说大小几乎是 0 。
但是不能单独跑起来,只能做基础镜像,然后把main 程序放上去。
说白就是是一个线程了,这样有个非常好的优势,镜像小,没有依赖。
地址:
/scratch/”>https://hub.docker.com//scratch/

开始还以为是 alpine 比较小呢,看了这个是更小了。
小意味着效率高呢,部署升级的效率超级高。

2,使用golang构建scratch镜像


服务端代码:webServer.go

package main

import (
    "io"
    "net/http"
)

func hello(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "Hello world!")
}

func main() {
    http.HandleFunc("/", hello)
    http.ListenAndServe(":8000", nil)
}

build 编译main 函数

docker run  --rm -it -v ${PWD}:/go golang:stretch env GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags -s -a -installsuffix cgo webServer.go

在当前文件夹要有 webServer.go 文件。

–rm 表示构建完成删除镜像。
-it 表示交互模式
-v ${PWD}:/go 加载卷
剩下是设置 linux 变量,-ldflags -s 使用裁剪模式。

docker file :

FROM scratch
ADD webServer /webServer
EXPOSE 8000
CMD ["/webServer"]

构建docker镜像:
docker build -t stretch-demo:latest .

启动:
docker run -itd -p 8000:8000 stretch-demo:latest

测试:
curl localhost:8000
Hello world!

3,镜像大小


stretch-demo latest db7fd3718d92 4.163 MB
镜像大小 4.1 mb
4.0M Feb 1 13:15 webServer
如果要不加入 -ldflags -s 就大一点了
5.9M Feb 1 13:14 webServer

一个是使用docker images 看的大小,一个使用的是 ls -lh 看的大小。
差不多都是 4 mb 。超级小呢。比alpine 还小。

4,总结


scratch 是一个空镜像,使用docker 把main 函数拉起来。
服务小,做升级,降级,版本管理的优势超级大。
非常好的。

本文的原文连接是:
http://blog.csdn.net/freewebsys/article/details/79224625

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐