所用环境: containerd/ runc/ buildkit/ nerdctl

如果还没安装containerd和runc, 请自行安装
或者直接下载完整版的nerdctl, 会包含containerd和runc

docker同样适用, 并且不用安装工具链, nerdctl替换为docker即可

安装nerdctl

1.下载

如果是已有containerd,则下载纯净的nerdctl

1
wget https://github.com/containerd/nerdctl/releases/download/v1.3.1/nerdctl-1.3.1-linux-amd64.tar.gz`

2.解压

1
tar Cxzvvf /usr/local/bin nerdctl-1.3.1-linux-amd64.tar.gz

3.启动并测试

1
2
sudo systemctl enable --now containerd
sudo nerdctl -v

安装buildkit

1.下载并解压

1
2
wget https://github.com/moby/buildkit/releases/download/v0.11.6/buildkit-v0.11.6.linux-amd64.tar.gz
tar -C /usr/local/ -zxvf buildkit-v0.11.6.linux-amd64.tar.gz

2.编写 systemd unit 文件

实现自启动

1
sudo vim /etc/systemd/system/buildkit.service

写入如下内容

1
2
3
4
5
6
7
8
9
[Unit]
Description=BuildKit
Documentation=https://github.com/moby/buildkit

[Service]
ExecStart=/usr/local/bin/buildkitd --oci-worker=false --containerd-worker=true

[Install]
WantedBy=multi-user.target

3.启动

1
sudo systemctl enable --now buildkit.service

打包镜像测试

这里使用一个main.go小程序做测试, dockerfile如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 使用golang官方镜像作为基础镜像
FROM golang

# 将当前目录下的main.go复制到容器中的/app目录下
COPY main.go /app/

# 设置工作目录为/app
WORKDIR /app

# 编译main.go并将可执行文件命名为app
RUN go build -o app main.go

# 暴露容器的80端口
EXPOSE 80

# 运行可执行文件app
CMD ["./app"]

接着打包并运行镜像, 在dockerfile的同目录运行如下

1
2
3
4
sudo nerdctl pull golang
sudo nerdctl build -t my-go-app .
sudo nerdctl run -p 80:80 my-go-app
sudo nerdctl ps -a

就可以看到容器已经运行成功

上传镜像

登录docker.hub

1
docker login -u <username> -p <passwd>

然后打标签和上传即可

1
2
docker tag <username>/<reponame> <username>/<reponame>:v1.0
docker push <username>/<reponame>:v1.0

参考文章
https://www.kubernetes.org.cn/9126.html