buildkit介绍

buildkit是Docker公司开源的下一代镜像构建工具,支持OCI标准的镜像构建,可以通过Dockerfile制作容器镜像。

buildkit由两部分组成:

  • buildkitd(服务端):负责镜像构建,目前支持runc和containerd作为镜像构建环境,默认是runc。
  • buildkitctl(客户端):负责解析Dockerfile文件,并向服务端buildkitd发出构建请求。

相对于docker,buildkit具有以下优势:

  • 更高效:支持并行的多阶段构建、更好的缓存
  • 管理更安全:支持secret mount,无需root权限
  • 更易于扩展:使用自定义中间语言LLB,完全兼容Dockerfile,也可以支持第三方语言。后台支持runc和containerd

buildkit安装

项目托管地址:https://github.com/moby/buildkit

null

null

null

# wget https://github.com/moby/buildkit/releases/download/v0.12.2/buildkit-v0.12.2.linux-amd64.tar.gz
# tar xf buildkit-v0.12.2.linux-amd64.tar.gz
# mv bin/* /usr/bin/
# nerdctl version
Client:
 Version:       v1.5.0
 OS/Arch:       linux/amd64
 Git commit:    b33a58f288bc42351404a016e694190b897cd252
 buildctl:
  Version:      v0.12.2
  GitCommit:    567a99433ca23402d5e9b9f9124005d2e59b8861

Server:
 containerd:
  Version:      v1.7.5
  GitCommit:    fe457eb99ac0e27b3ce638175ef8e68a7d2bc373
 runc:
  Version:      1.1.9
  GitCommit:    v1.1.9-0-gccaecfcb
# vim /usr/lib/systemd/system/buildkit.socket
# cat /usr/lib/systemd/system/buildkit.socket
[Unit]
Description=BuildKit
Documentation=https://github.com/moby/buildkit

[Socket]
ListenStream=%t/buildkit/buildkitd.sock
SocketMode=0660

[Install]
WantedBy=sockets.target
# vim /usr/lib/systemd/system/buildkit.service
# cat /usr/lib/systemd/system/buildkit.service
[Unit]
Description=BuildKit
Requires=buildkit.socket
After=buildkit.socket
Documentation=https://github.com/moby/buildkit

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

[Install]
WantedBy=multi-user.target
# systemctl enable --now buildkit.service

容器镜像构建实践

构建应用发布基础镜像

[root@c1 ~]# mkdir imgtest

[root@c1 ~]# cd imgtest
[root@c1 imgtest]# vim Dockerfile
[root@c1 imgtest]# cat Dockerfile
FROM ubuntu:20.04

LABEL author=nextgo@126.com

RUN apt update && apt -y install 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 && apt clean
[root@c1 imgtest]# ls
Dockerfile  sources.list
[root@c1 imgtest]# nerdctl build -t www.kubemsb.com/library/ubuntu:20.04 .
[root@c1 imgtest]# nerdctl images
REPOSITORY                        TAG       IMAGE ID        CREATED           PLATFORM       SIZE         BLOB SIZE
www.kubemsb.com/library/nginx     latest    48a84a0728ca    2 hours ago       linux/amd64    188.9 MiB    67.2 MiB
www.kubemsb.com/library/ubuntu    20.04     04c09082926e    31 seconds ago    linux/amd64    420.4 MiB    151.3 MiB

上传已构建基础镜像到harbor容器镜像仓库

[root@c1 imgtest]# nerdctl push www.kubemsb.com/library/ubuntu:20.04 --insecure-registry

null

构建JDK容器镜像

[root@c1 jdktest]# mkdir /etc/buildkit
[root@c1 jdktest]# vim /etc/buildkit/buildkitd.toml
[root@c1 jdktest]# cat /etc/buildkit/buildkitd.toml
debug = true
[registry."www.kubemsb.com"]
  http = true
  insecure = true
[root@c1 jdktest]# mkdir /etc/nerdctl
[root@c1 jdktest]# vim /etc/nerdctl/nerdctl.toml
[root@c1 jdktest]# cat /etc/nerdctl/nerdctl.toml
debug = false
debug_full = true
insecure_registry = true
[root@c1 jdktest]# systemctl restart buildkit.service
[root@c1 jdktest]# systemctl status buildkit.service
[root@c1 ~]# mkdir jdktest
[root@c1 ~]# cd jdktest/
[root@c1 jdktest]# ls
Dockerfile  jdk-8u191-linux-x64.tar.gz
[root@c1 jdktest]# vim Dockerfile
[root@c1 jdktest]# cat Dockerfile
#jdk 8 base image
FROM www.kubemsb.com/library/ubuntu:20.04

LABEL author="nextgo@126.com"

ADD jdk-8u191-linux-x64.tar.gz /usr/local/src

RUN ln -s /usr/local/src/jdk1.8.0_191 /usr/local/jdk

ENV JAVA_HOME /usr/local/jdk
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/:$JRE_HOME/lib/
ENV PATH $PATH:$JAVA_HOME/bin


RUN echo "export JAVA_HOME=/usr/local/jdk" >>/etc/profile
RUN echo "export TOMCAT_HOME=/apps/tomcat" >>/etc/profile
RUN echo "export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$TOMCAT_HOME/bin:$PATH" >>/etc/profile
RUN echo "export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar" >> /etc/profile

RUN rm -f /etc/localtime && ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
[root@c1 jdktest]# nerdctl build -t www.kubemsb.com/library/ubuntu-jdk-base:8u191 .
输出内容:
DEBU[0000] Choosing the buildkit host "buildkit-default/buildkitd.sock", candidates=[buildkit-default/buildkitd.sock buildkit/buildkitd.sock] (in "/run/")
DEBU[0000] Choosing the buildkit host "buildkit/buildkitd.sock", candidates=[buildkit-default/buildkitd.sock buildkit/buildkitd.sock] (in "/run/")
DEBU[0000] Chosen buildkit host "unix:///run/buildkit/buildkitd.sock"
DEBU[0000] worker labels: map[org.mobyproject.buildkit.worker.containerd.namespace:buildkit org.mobyproject.buildkit.worker.containerd.uuid:ead82c8b-8d4a-4a5f-a73e-459613a411e3 org.mobyproject.buildkit.worker.executor:containerd org.mobyproject.buildkit.worker.hostname:c2 org.mobyproject.buildkit.worker.network:host org.mobyproject.buildkit.worker.selinux.enabled:false org.mobyproject.buildkit.worker.snapshotter:overlayfs]
DEBU[0000] running /usr/bin/buildctl [--addr=unix:///run/buildkit/buildkitd.sock build --progress=auto --frontend=dockerfile.v0 --local=context=. --output=type=docker,name=www.kubemsb.com/library/ubuntu-jdk-base:8u191 --local=dockerfile=/root/jdktest --opt=filename=Dockerfile]
[+] Building 21.4s (13/14)
[+] Building 21.5s (14/14) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                 0.0s
 => => transferring dockerfile: 799B                                                                                                                 0.0s
 => [internal] load metadata for www.kubemsb.com/library/ubuntu:20.04                                                                                0.0s
 => [auth] library/ubuntu:pull token for www.kubemsb.com                                                                                             0.0s
 => [internal] load .dockerignore                                                                                                                    0.0s
 => => transferring context: 2B                                                                                                                      0.0s
 => [internal] load build context                                                                                                                    0.9s
 => => transferring context: 191.79MB                                                                                                                0.9s
 => [1/8] FROM www.kubemsb.com/library/ubuntu:20.04@sha256:602a6080d8633018f6e11aec6f48ce5aa84eccfa09a14fe6479941632490d3b0                          0.0s
 => => resolve www.kubemsb.com/library/ubuntu:20.04@sha256:602a6080d8633018f6e11aec6f48ce5aa84eccfa09a14fe6479941632490d3b0                          0.0s
 => [2/8] ADD jdk-8u191-linux-x64.tar.gz /usr/local/src                                                                                              3.0s
 => [3/8] RUN ln -s /usr/local/src/jdk1.8.0_191 /usr/local/jdk                                                                                       0.2s
 => [4/8] RUN echo "export JAVA_HOME=/usr/local/jdk" >>/etc/profile                                                                                  0.1s
 => [5/8] RUN echo "export TOMCAT_HOME=/apps/tomcat" >>/etc/profile                                                                                  0.1s
 => [6/8] RUN echo "export PATH=/usr/local/jdk/bin:/usr/local/jdk/jre/bin:$TOMCAT_HOME/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:  0.1s
 => [7/8] RUN echo "export CLASSPATH=./usr/local/jdk/lib/:/usr/local/jdk/jre/lib/:/usr/local/jdk/lib:/usr/local/jdk/jre/lib:/usr/local/jdk/lib/tool  0.1s
 => [8/8] RUN rm -f /etc/localtime && ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime                                                       0.1s
 => exporting to docker image format                                                                                                                16.8s
 => => exporting layers                                                                                                                             10.5s
 => => exporting manifest sha256:779718759c4e0354683a5b86dfaf34fbed38f2289a7ebd01e86161676818365e                                                    0.0s
 => => exporting config sha256:1ddbcb001f9a2c1fee62db26a13ed432ab14296650bc488855c56bf5f1ba0fb7                                                      0.0s
 => => sending tarball                                                                                                                               6.3s
Loaded image: www.kubemsb.com/library/ubuntu-jdk-base:8u191
[root@c1 jdktest]# nerdctl images
DEBU[0000] raw image name="www.kubemsb.com/library/nginx:latest"
DEBU[0000] raw image name="www.kubemsb.com/library/ubuntu-jdk-base:8u191"
REPOSITORY                                 TAG       IMAGE ID        CREATED               PLATFORM       SIZE         BLOB SIZE
www.kubemsb.com/library/nginx              latest    48a84a0728ca    3 hours ago           linux/amd64    188.9 MiB    67.2 MiB
www.kubemsb.com/library/ubuntu-jdk-base    8u191     779718759c4e    About a minute ago    linux/amd64    802.3 MiB    335.3 MiB
[root@c1 jdktest]# nerdctl push www.kubemsb.com/library/ubuntu-jdk-base:8u191

null

基于jdk镜像构建tomcat镜像

[root@c1 ~]# mkdir tomcattest
[root@c1 ~]# cd tomcattest/
[root@c1 tomcattest]# wget https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.93/bin/apache-tomcat-8.5.93.tar.gz
[root@c1 tomcattest]# vim Dockerfile
[root@c1 tomcattest]# cat Dockerfile
#tomcat 8.5.93 base image
FROM www.kubemsb.com/library/ubuntu-jdk-base:8u191

LABEL author="nextgo@126.com"

RUN mkdir -pv /apps /data/tomcat/webapps /data/tomcat/logs

ADD apache-tomcat-8.5.93.tar.gz /apps/

RUN ln -sv /apps/apache-tomcat-8.5.93 /apps/tomcat

RUN useradd -u 2023 tomcat && chown -R tomcat.tomcat /apps /data/tomcat
[root@c1 tomcattest]# nerdctl build -t www.kubemsb.com/library/tomcat-base:8.5.93 .
输入内容:
DEBU[0000] Choosing the buildkit host "buildkit-default/buildkitd.sock", candidates=[buildkit-default/buildkitd.sock buildkit/buildkitd.sock] (in "/run/")
DEBU[0000] Choosing the buildkit host "buildkit/buildkitd.sock", candidates=[buildkit-default/buildkitd.sock buildkit/buildkitd.sock] (in "/run/")
DEBU[0000] Chosen buildkit host "unix:///run/buildkit/buildkitd.sock"
DEBU[0000] worker labels: map[org.mobyproject.buildkit.worker.containerd.namespace:buildkit org.mobyproject.buildkit.worker.containerd.uuid:ead82c8b-8d4a-4a5f-a73e-459613a411e3 org.mobyproject.buildkit.worker.executor:containerd org.mobyproject.buildkit.worker.hostname:c2 org.mobyproject.buildkit.worker.network:host org.mobyproject.buildkit.worker.selinux.enabled:false org.mobyproject.buildkit.worker.snapshotter:overlayfs]
DEBU[0000] running /usr/bin/buildctl [--addr=unix:///run/buildkit/buildkitd.sock build --progress=auto --frontend=dockerfile.v0 --local=context=. --output=type=docker,name=www.kubemsb.com/library/tomcat-base:8.5.93 --local=dockerfile=/root/tomcattest --opt=filename=Dockerfile]
[+] Building 7.8s (11/11)
[+] Building 7.9s (11/11) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                 0.0s
 => => transferring dockerfile: 373B                                                                                                                 0.0s
 => [internal] load metadata for www.kubemsb.com/library/ubuntu-jdk-base:8u191                                                                       0.0s
 => [auth] library/ubuntu-jdk-base:pull token for www.kubemsb.com                                                                                    0.0s
 => [internal] load .dockerignore                                                                                                                    0.0s
 => => transferring context: 2B                                                                                                                      0.0s
 => [1/5] FROM www.kubemsb.com/library/ubuntu-jdk-base:8u191@sha256:779718759c4e0354683a5b86dfaf34fbed38f2289a7ebd01e86161676818365e                 0.0s
 => => resolve www.kubemsb.com/library/ubuntu-jdk-base:8u191@sha256:779718759c4e0354683a5b86dfaf34fbed38f2289a7ebd01e86161676818365e                 0.0s
 => [internal] load build context                                                                                                                    0.1s
 => => transferring context: 10.74MB                                                                                                                 0.1s
 => [2/5] RUN mkdir -pv /apps /data/tomcat/webapps /data/tomcat/logs                                                                                 0.1s
 => [3/5] ADD apache-tomcat-8.5.93.tar.gz /apps/                                                                                                     0.2s
 => [4/5] RUN ln -sv /apps/apache-tomcat-8.5.93 /apps/tomcat                                                                                         0.1s
 => [5/5] RUN useradd -u 2023 tomcat && chown -R tomcat.tomcat /apps /data/tomcat                                                                    0.3s
 => exporting to docker image format                                                                                                                 7.1s
 => => exporting layers                                                                                                                              0.5s
 => => exporting manifest sha256:5c13f803944b9615c439c4caff1287aff6959990ec894d7f0b22725b1121edd2                                                    0.0s
 => => exporting config sha256:7d494cf6a771dece77fecc55f3c9c043bc71edc4020049cb7d4524d1e01c8778                                                      0.0s
 => => sending tarball                                                                                                                               6.6s
Loaded image: www.kubemsb.com/library/tomcat-base:8.5.93
[root@c1 tomcattest]# nerdctl push www.kubemsb.com/library/tomcat-base:8.5.93

null

基于tomcat镜像构建业务应用镜像

[root@c1 ~]# mkdir apptest
[root@c1 ~]# cd apptest/
[root@c1 apptest]# vim Dockerfile
[root@c1 apptest]# cat Dockerfile
#app
FROM www.kubemsb.com/library/tomcat-base:8.5.93

ADD server.xml /apps/tomcat/conf/

ADD myapp.tar.gz /data/tomcat/webapps/

ADD run_tomcat.sh /apps/tomcat/bin/

RUN chown -R tomcat.tomcat /apps /data/tomcat

EXPOSE 8080 8443

CMD ["/apps/tomcat/bin/run_tomcat.sh"]
[root@c1 apptest]# vim index.html
[root@c1 apptest]# cat index.html
Hello,World!
[root@c1 apptest]# mkdir myapp
[root@c1 apptest]# mv index.html myapp/
[root@c1 apptest]# tar czf myapp.tar.gz myapp
[root@c1 apptest]# ls
Dockerfile  myapp  myapp.tar.gz
[root@c1 apptest]# ls myapp
index.html
[root@c1 apptest]# vim run_tomcat.sh
[root@c1 apptest]# cat run_tomcat.sh
#!/bin/sh
su - tomcat -c "/apps/tomcat/bin/catalina.sh run"

[root@c1 apptest]# chmod +x run_tomcat.sh
[root@c1 apptest]# ls
app.tar.gz  Dockerfile  index.html  run_tomcat.sh

可先运行一个tomcat容器,使用nerdctl cp 容器ID:文件存储路径 .的方式获取。

[root@c1 apptest]# nerdctl run -it  www.kubemsb.com/library/tomcat-base:8.5.93 /bin/bash
root@cf0b8c620af4:/# find / -name server.xml
/apps/apache-tomcat-8.5.93/conf/server.xml

使用ctrl+p+q退出后再复制。

[root@c1 apptest]# nerdctl ps
CONTAINER ID    IMAGE                                         COMMAND        CREATED          STATUS    PORTS    NAMES
cf0b8c620af4    www.kubemsb.com/library/tomcat-base:8.5.93    "/bin/bash"    8 seconds ago    Up                 tomcat-base-e3c8b
[root@c1 apptest]# nerdctl cp cf0b8c620af4:/apps/apache-tomcat-8.5.93/conf/server.xml .
[root@c1 apptest]# ls
Dockerfile  myapp  myapp.tar.gz  run_tomcat.sh  server.xml
[root@c1 apptest]# vim server.xml
132     <!-- An Engine represents the entry point (within Catalina) that processes
133          every request.  The Engine implementation for Tomcat stand alone
134          analyzes the HTTP headers included with the request, and passes them
135          on to the appropriate Host (virtual host).
136          Documentation at /docs/config/engine.html -->
137
138     <!-- You should set jvmRoute to support load-balancing via AJP ie :
139     <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
140     -->
141     <Engine name="Catalina" defaultHost="localhost">
142
143       <!--For clustering, please take a look at documentation at:
144           /docs/cluster-howto.html  (simple how to)
145           /docs/config/cluster.html (reference documentation) -->
146       <!--
147       <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
148       -->
149
150       <!-- Use the LockOutRealm to prevent attempts to guess user passwords
151            via a brute-force attack -->
152       <Realm className="org.apache.catalina.realm.LockOutRealm">
153         <!-- This Realm uses the UserDatabase configured in the global JNDI
154              resources under the key "UserDatabase".  Any edits
155              that are performed against this UserDatabase are immediately
156              available for use by the Realm.  -->
157         <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
158                resourceName="UserDatabase"/>
159       </Realm>

160
161       <Host name="localhost"  appBase="/data/tomcat/webapps"  修改了此处。
162             unpackWARs="true" autoDeploy="true">
163
164         <!-- SingleSignOn valve, share authentication between web applications
165              Documentation at: /docs/config/valve.html -->
[root@c1 apptest]# ls
app.tar.gz  Dockerfile  index.html  run_tomcat.sh  server.xml
[root@c1 apptest]# nerdctl build -t www.kubemsb.com/library/tomcat-app:v1 .
[root@c1 apptest]# nerdctl images
DEBU[0000] raw image name="www.kubemsb.com/library/nginx:latest"
DEBU[0000] raw image name="www.kubemsb.com/library/tomcat-app:v1"
DEBU[0000] raw image name="www.kubemsb.com/library/tomcat-base:8.5.93"
DEBU[0000] raw image name="www.kubemsb.com/library/ubuntu-jdk-base:8u191"
REPOSITORY                                 TAG       IMAGE ID        CREATED           PLATFORM       SIZE         BLOB SIZE
www.kubemsb.com/library/nginx              latest    48a84a0728ca    4 hours ago       linux/amd64    188.9 MiB    67.2 MiB
www.kubemsb.com/library/tomcat-app         v1        5874cc4c16e3    26 seconds ago    linux/amd64    834.6 MiB    355.8 MiB
www.kubemsb.com/library/tomcat-base        8.5.93    5c13f803944b    18 minutes ago    linux/amd64    834.5 MiB    355.8 MiB
www.kubemsb.com/library/ubuntu-jdk-base    8u191     779718759c4e    31 minutes ago    linux/amd64    802.3 MiB    335.3 MiB
[root@c1 apptest]# nerdctl run -p 8080:8080 -it --rm www.kubemsb.com/library/tomcat-app:v1

null

results matching ""

    No results matching ""