原 docker(21):使用docker构建小的镜像

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

1,关于构建小镜像


可以通过两中方式进行构建小镜像。
1,使用比较小的基础镜像如 alpine debian
2,将构建和运行镜像拆分,支持静态编译的可以使用空镜像运行。
以下是方法:

2,选择小的基础镜像


如果要使用 debian 可以选择小镜像版本45MB。如:
docker pull debian:stable-slim

原 docker(21):使用docker构建小的镜像_第1张图片

或者使用 alpine 2MB:
docker pull alpine:latest
原 docker(21):使用docker构建小的镜像_第2张图片

或者使用空镜像 0MB
FROM scratch
这个只适用go c++ 支持静态编译的语言。
之前写的golang 使用scratch 镜像运行:
https://blog.csdn.net/freewebsys/article/details/79224625

java可以使用 jdk进行编译,然后使用jre 跑起来,45MB。

原 docker(21):使用docker构建小的镜像_第3张图片

FROM node:alpine
WORKDIR /app
COPY package.json /app/package.json
RUN npm install --production
COPY server.js /app/server.js
EXPOSE 8080
CMD npm start

3,一个dockerFile 完成编译运行环境拆分


参考视频:
http://v.youku.com/v_show/id_XMzU1NDEwMTMwNA==.html

还是golang的 环境举例。

服务端代码: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(":8080", nil)
}
FROM golang:alpine AS build-env
WORKDIR /app
ADD . /app
RUN cd /app && go build -o goapp
FROM alpine
WORKDIR /app
COPY --from=build-env /app/goapp /app
EXPOSE 8080
ENTRYPOINT /app/goapp
docker build -t demo:go-build .
Sending build context to Docker daemon  3.072kB
Step 1/9 : FROM golang:alpine AS build-env
 ---> 52d894fca6d4
Step 2/9 : WORKDIR /app
 ---> Using cache
 ---> 2735de659750
Step 3/9 : ADD . /app
 ---> 6f16d263a21b
Step 4/9 : RUN cd /app && go build -o goapp
 ---> Running in 70c43882cdd6
Removing intermediate container 70c43882cdd6
 ---> c6b6f1e9d803
Step 5/9 : FROM alpine
 ---> 3fd9065eaf02
Step 6/9 : WORKDIR /app
 ---> Using cache
 ---> 80a71c47cb22
Step 7/9 : COPY --from=build-env /app/goapp /app
 ---> 094e7555ea06
Step 8/9 : EXPOSE 8080
 ---> Running in 1df03e017c1c
Removing intermediate container 1df03e017c1c
 ---> 70db41239bff
Step 9/9 : ENTRYPOINT /app/goapp
 ---> Running in f03442df0ae5
Removing intermediate container f03442df0ae5
 ---> fb39677952ff
Successfully built fb39677952ff

运行:

docker run -p 8080:8080 -itd demo:go-build 

然后就可以从本机8080 端口访问了。这个镜像大小

demo go-build fb39677952ff About a minute ago 10.8MB

再使用scratch 再构建一个更小的镜像:

FROM golang:alpine AS build-env
WORKDIR /app
ADD . /app
ENV GOOS=linux GOARCH=amd64 CGO_ENABLED=0
RUN cd /app && go build -ldflags -s -a -installsuffix cgo webServer.go && ls -lh
FROM scratch
WORKDIR /app
COPY --from=build-env /app/webServer /
EXPOSE 8080
CMD ["/webServer"]
 docker build -t demo:go-build .
Sending build context to Docker daemon  3.072kB
Step 1/10 : FROM golang:alpine AS build-env
 ---> 52d894fca6d4
Step 2/10 : WORKDIR /app
 ---> Using cache
 ---> 195bce149201
Step 3/10 : ADD . /app
 ---> 957ca1a4e174
Step 4/10 : ENV GOOS=linux GOARCH=amd64 CGO_ENABLED=0
 ---> Running in af9fb5b34b49
Removing intermediate container af9fb5b34b49
 ---> 05cc614521a5
Step 5/10 : RUN cd /app && go build -ldflags -s -a -installsuffix cgo webServer.go && ls -lh
 ---> Running in ba92986d9e6e
total 4104
-rw-r--r--    1 root     root         275 May  3 04:34 Dockerfile
-rwxr-xr-x    1 root     root        4.0M May  3 04:34 webServer
-rw-r--r--    1 root     root         230 May  3 04:15 webServer.go
Removing intermediate container ba92986d9e6e
 ---> 259aaba77632
Step 6/10 : FROM scratch
 ---> 
Step 7/10 : WORKDIR /app
 ---> Using cache
 ---> 607a86dcc595
Step 8/10 : COPY --from=build-env /app/webServer /
 ---> Using cache
 ---> e64f68c62f3b
Step 9/10 : EXPOSE 8080
 ---> Using cache
 ---> ccf7aab86be0
Step 10/10 : CMD ["/webServer"]
 ---> Using cache
 ---> 461f6f98c969
Successfully built 461f6f98c969
Successfully tagged demo:go-build

其中 FROM scratch 是从空镜像开始构建,这个镜像不存在 hub.docker.io 上面。
就是个空镜像,也没有版本。其中启动不能使用 ENTRYPOINT ,只能使用CMD。

demo go-build 461f6f98c969 51 seconds ago 4.19MB

大小是 4.19 MB,发现更小了,这个镜像是个空,不能使用exec进去查看。
只是在 / 目录下面放了一个 webServer的文件,并启动了。超级小,也超级安全。沙盒了。

4,总结


docker镜像小有很多好处,可以让,上线,重启增加新节点的时候,快速恢复。
减少了中断服务的时间,同时镜像仓库的存储占用的也少了。
优势多多,同时使用 AS 方法,在一个docker镜像里面,使用两个docker镜像。
一个docker进行构建,一个docker镜像是运行时镜像。
在使用 golang 的时候就只需要一个空镜像就可以了,这样超级高效。
后续开发的系统尽量都使用golang开发,在部署的时候使用空镜像。超级小。超级快。
再开发一个 ci/cd的工具,可以就写一个dockerfile就行了。

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

你可能感兴趣的:(docker,alpine,scratch,golang,docker,kubernetes)