1 概述:
1.1 buildkit是什么
BuildKit(https://github.com/moby/buildkit)是Docker官方社区推出的下一代镜像构建工具(独立运行于Docker),使用它可以更加快速、有效、安全地构建容器镜像。Docker v18.06版本开始集成该组件。BuildKit可用于多种导出格式(例如OCI)以及前端支持(Dockerfile),可以非root用户运行,并提供高效缓存、并行构建等功能。BuildKit支持的容器运行时包括containerd和runc。buildctl是buildkit的客户端工具。
1.2 环境
版本信息如下: a、操作系统:centos 7.6 b、buildkit版本:v.9.0 c、docker版本:18.06.0-ce d、go环境: v1.16 e、节点列表
IP地址 | 角色 |
---|
192.168.0.70 | registry |
2 部署registry
registry监听在443端口,使用自签证书。
2.1 准备自签证书
mkdir -p /home/registry/certs
cd /home/registry/certs
openssl req -x509 -sha256 -newkey rsa:4096 -keyout ca.key -out ca.crt -days 3560 -nodes -subj '/CN=LIUJUN Cert Authority'
openssl req -new -newkey rsa:4096 -keyout server.key -out server.csr -nodes -subj '/CN=192.168.0.70'
# 可以将registry的域名,IP写入SAN中。
cat > extfile.cnf << EOF
[ v3_req ]
extendedKeyUsage=serverAuth,clientAuth
subjectAltName = DNS:liujun.harbor.com,DNS:localhost,IP:192.168.0.70,IP:127.0.0.1
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
EOF
openssl x509 -req -sha256 -days 36500 \
-extfile extfile.cnf \
-extensions v3_req \
-in server.csr \
-CA ca.crt \
-CAkey ca.key \
-out server.crt \
-CAcreateserial
执行以上命令,生成证书完毕。
2.1 生成registry的配置文件
mkdir -p /home/registry/config
cat > /home/registry/config/config.yml << EOF
version: 0.1
log:
fields:
service: registry
storage:
delete:
enabled: true
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
EOF
2.1 docker run运行registry
docker run -d -e REGISTRY_HTTP_ADDR="0.0.0.0:443" -e REGISTRY_HTTP_TLS_CERTIFICATE="/certs/server.crt" -e REGISTRY_HTTP_TLS_KEY="/certs/server.key" -v /home/registry/certs:/certs -v /home/registry/config/config.yml:/etc/docker/registry/config.yml -p 443:443 registry:2.7.1
3 部署buildkit
3.1 克隆代码
cd /opt/
git clone https://github.com/moby/buildkit.git
3.2 编译buildctl(go版本至少1.15)
cd /opt/buildkit/cmd/buildctl
go build
cp buildctl /usr/bin/
3.3 准备buildkitd的配置文件
守护进程buildkitd的默认配置文件是/etc/buildkit/buildkitd.toml。 由于registry使用的是自签证书,因此配置为insecure = true,如此一来,buildkitd通过containerd推送镜像时不会出现校验registry证书的错误。
mkdir -p /etc/buildkit/
cat > /etc/buildkit/buildkitd.toml << EOF
debug = true
[registry."192.168.0.70"]
http = false
insecure = true
EOF
3.4 启动buildkitd
直接在goland中点击调试,方便确认/etc/buildkit/buildkitd.toml文件已经被进程读取。
4 使用buildctl构建镜像并推送至私有仓库
4.1准备源码文件和Dockerfile
mkdir -p /tmp/test/
# Dockerfile
cat > /tmp/test/Dockerfile << EOF
FROM golang:alpine AS builder
RUN mkdir /app
ADD . /app/
WORKDIR /app
ENV GO111MODULE=off
RUN go build -o hello .
FROM alpine
RUN mkdir /app
WORKDIR /app
COPY --from=builder /app/hello .
CMD ["./hello"]
EOF
# 源码文件
cat > /tmp/test/main.go << EOF
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Printf("Hello, %s!\n", runtime.GOARCH)
}
EOF
执行以上指令,准备两个文件如下图:
4.2 运行buildctl build命令
目标镜像是192.168.0.70/hello:v1。
buildctl build ... --output type=image,name=192.168.0.70/hello:v1,push=true \
--export-cache type=inline \
--frontend=dockerfile.v0 \
--local context=. \
--local dockerfile=.
运行过程打印信息如下图:
5 小结:
使用buildkit进行构建容器镜像,从命令行打印信息中可见CACHED等字眼,说明构建镜像的过程使用了缓存,缩短镜像构建的时间。
|