1. 必要基础知识
容器技术除了的docker之外,还有coreOS的rkt、google的gvisor、以及docker开源的containerd、redhat
的podman、阿里的pouch等。
为了保证容器生态的标准性和健康可持续发展,包括Linux 基金会、Docker、微软、红帽、谷歌和IBM等公司在2015年6月共同成立了一个叫open container(OCI)的组织,其目的就是制定开放的、标准的容器规范。
目前OCI一共发布了两个规范,分别是runtime spec和image format spec,有了这两个规范,不同的容器公司开发的容器只要兼容这两个规范,就可以保证容器的可移植性和相互可操作性。
2. buildkit
https://github.com/moby/buildkit
2.1 简介
从Docker公司的开源出来的⼀个镜像构建⼯具包,⽀持OCI标准的镜像构建。
主要由两个部分组成:
(1)buildkitd(服务端):⽬前⽀持runc和containerd作为镜像构建环境,默认是runc,可以更换为containerd。
(2)buildctl(客户端):负责解析Dockerfile⽂件,并向服务端buildkitd发出构建请求,由buildkitd调用runc或者containerd来完成镜像构建。
2.2 部署buildkitd
2.2.1 下载软件包
[root@container-imagebuild ~]# cd /usr/local/src/
[root@container-imagebuild src]# wget https://github.com/moby/buildkit/releases/download/v0.11.6/buildkit-v0.11.6.linux-amd64.tar.gz
[root@container-imagebuild src]# ls
buildkit-v0.11.6.linux-amd64.tar.gz
2.2.2 解压并配置
[root@container-imagebuild src]# tar xf buildkit-v0.11.6.linux-amd64.tar.gz
[root@container-imagebuild src]# ls
bin buildkit-v0.11.6.linux-amd64.tar.gz
[root@container-imagebuild src]# mv bin/* /usr/local/bin/
[root@container-imagebuild src]# buildctl -v
buildctl github.com/moby/buildkit v0.11.6 2951a28cd7085eb18979b1f710678623d94ed578
# 生成scoket文件
[root@container-imagebuild src]# cat /lib/systemd/system/buildkit.socket
[Unit]
Description=BuildKit
Documentation=https://github.com/moby/buildkit
[Socket]
ListenStream=%t/buildkit/buildkitd.sock
[Install]
WantedBy=sockets.target
# 生成systemd文件
[root@container-imagebuild src]# cat /lib/systemd/system/buildkitd.service
[Unit]
Description=BuildKit
Requires=buildkit.socket
After=buildkit.socketDocumentation=https://github.com/moby/buildkit
[Service]
ExecStart=/usr/local/bin/buildkitd --oci-worker=false --containerd-worker=true
[Install]
WantedBy=multi-user.target
# 启动
[root@container-imagebuild src]# systemctl daemon-reload
[root@container-imagebuild src]# systemctl enable buildkitd
Created symlink from /etc/systemd/system/multi-user.target.wants/buildkitd.service to /usr/lib/systemd/system/buildkitd.service.
[root@container-imagebuild src]# systemctl start buildkitd
[root@container-imagebuild src]# ll /run/buildkit/buildkitd.sock
srw-rw---- 1 root root 0 6月 19 17:55 /run/buildkit/buildkitd.sock
2.3 构建镜像
注意:下面所有关于镜像上传下载的操作,都是建立在harbor配置好https(商业证书)+域名访问的基础上
2.3.1 nerdctl命令自动补全
[root@container-imagebuild ~]# vim /etc/profile
……省略部分内容
source <(nerdctl completion bash)
[root@container-imagebuild ~]# source /etc/profile
2.3.2 配置containerd镜像加速
2.3.2.1 修改config.toml配置文件
[root@container-imagebuild ~]# vim /etc/containerd/config.toml
……省略部分内容
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d" # 新增镜像地址配置文件配置
2.3.2.2 创建相应目录
[root@container-imagebuild ~]# mkdir /etc/containerd/certs.d/docker.io -pv
2.3.2.3 配置镜像加速
[root@container-imagebuild ~]# cat > /etc/containerd/certs.d/docker.io/hosts.toml << EOF
server = "https://docker.io"
[host."https://xxxxxxxx.mirror.aliyuncs.com"]
capabilities = ["pull", "resolve"]
EOF
2.3.2.4 重启containerd生效配置
[root@container-imagebuild ~]# systemctl restart containerd
2.3.2.5 下载镜像并上传
[root@container-imagebuild ~]# nerdctl pull centos:centos7.9.2009
[root@container-imagebuild ubuntu]# nerdctl tag centos:centos7.9.2009 tsk8s.top/myserver/centos:centos7.9.2009
[root@container-imagebuild ubuntu]# nerdctl login tsk8s.top
[root@container-imagebuild ubuntu]# nerdctl push tsk8s.top/myserver/centos:centos7.9.2009
2.3.3 基于Ubuntu构建nginx镜像
2.3.3.1 编辑dockerfile
[root@container-imagebuild ~]# mkdir -p /opt/dockerfile/ubuntu
[root@container-imagebuild ~]# cd /opt/dockerfile/ubuntu
[root@container-imagebuild ubuntu]# cat Dockerfile
FROM ubuntu:22.04
ADD sources.list /etc/apt/sources.list
ADD nginx-1.22.0.tar.gz /usr/local/src/
ADD nginx.conf /apps/nginx/conf/
ADD frontend.tar.gz /apps/nginx/html/
RUN apt update && apt install -y iproute2 ntpdate tcpdump telnet traceroute nfs-kernel-server nfs-common lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet traceroute gcc openssh-server lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet traceroute iotop unzip zip make && \
cd /usr/local/src/nginx-1.22.0 && \
./configure --prefix=/apps/nginx && \
make && \
make install && \
ln -sv /apps/nginx/sbin/nginx /usr/bin && \
groupadd -g 2088 nginx && \
useradd -g nginx -s /usr/sbin/nologin -u 2088 nginx && \
chown -R nginx.nginx /apps/nginx
EXPOSE 80 443
#ENTRYPOINT ["nginx"]
CMD ["nginx","-g","daemon off;"]
2.3.3.2 准备相关文件
[root@container-imagebuild ubuntu]# ll
总用量 1108
-rw-r--r-- 1 root root 280 5月 7 18:42 build-command.sh
-rw-r--r-- 1 root root 906 6月 20 13:44 Dockerfile
-rw-r--r-- 1 root root 38751 8月 5 2022 frontend.tar.gz
drwxr-xr-x 3 root root 38 5月 7 19:14 html
-rw-r--r-- 1 root root 1073322 5月 24 2022 nginx-1.22.0.tar.gz
-rw-r--r-- 1 root root 2812 10月 3 2020 nginx.conf
-rw-r--r-- 1 root root 1139 8月 5 2022 sources.list
2.3.3.3 构建镜像
[root@container-imagebuild ubuntu]# cat build-command.sh
#!/bin/bash
#docker build -t harbor.magedu.net/myserver/nginx:v1 .
#docker push harbor.magedu.net/myserver/nginx:v1
/usr/local/bin/nerdctl build -t tsk8s.top/myserver/nginx-base:1.22.0 .
/usr/local/bin/nerdctl push tsk8s.top/myserver/nginx-base:1.22.0
[root@container-imagebuild ubuntu]# sh build-command.sh
3. 基于⾃定义镜像创建测试容器
3.1 创建容器
[root@container-imagebuild ubuntu]# nerdctl run -d -p 80:80 tsk8s.top/myserver/nginx-base:1.22.0