本文的原文连接是:
https://blog.csdn.net/freewebsys/article/details/80177036
可以通过两中方式进行构建小镜像。
1,使用比较小的基础镜像如 alpine debian
2,将构建和运行镜像拆分,支持静态编译的可以使用空镜像运行。
以下是方法:
如果要使用 debian 可以选择小镜像版本45MB。如:
docker pull debian:stable-slim
或者使用 alpine 2MB:
docker pull alpine:latest
或者使用空镜像 0MB
FROM scratch
这个只适用go c++ 支持静态编译的语言。
之前写的golang 使用scratch 镜像运行:
https://blog.csdn.net/freewebsys/article/details/79224625
java可以使用 jdk进行编译,然后使用jre 跑起来,45MB。
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
参考视频:
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的文件,并启动了。超级小,也超级安全。沙盒了。
docker镜像小有很多好处,可以让,上线,重启增加新节点的时候,快速恢复。
减少了中断服务的时间,同时镜像仓库的存储占用的也少了。
优势多多,同时使用 AS 方法,在一个docker镜像里面,使用两个docker镜像。
一个docker进行构建,一个docker镜像是运行时镜像。
在使用 golang 的时候就只需要一个空镜像就可以了,这样超级高效。
后续开发的系统尽量都使用golang开发,在部署的时候使用空镜像。超级小。超级快。
再开发一个 ci/cd的工具,可以就写一个dockerfile就行了。
本文的原文连接是:
https://blog.csdn.net/freewebsys/article/details/80177036