• 消除对特权账户的依赖使用Kaniko构建镜像


    Kaniko项目最初于2018年由谷歌提出。Kaniko的创建之初是寻求在执行容器镜像构建时消除对特权账户的依赖。无特权的容器镜像构建是注重安全性的公司最需要的功能之一。这与在Kubernetes集群中构建容器镜像类似。

    在了解如何使用Kaniko构建镜像之前,我们先了解一下几种构建镜像的方式。

    docker构建镜像

    1. docker build -t your_registry/your_repository:tag

    然后用 docker push 将镜像推送到镜像仓库。

    1. docker push your_registry/your_repository:tag

    容器内构建镜像

    1. docker run -it -v /var/run/docker.sock:/var/run/docker.sock -v /tmp/kaniko:/tmp/kaniko docker
    1. 挂载宿主机的socket文件到容器内部,然后在容器内部用 docker build 构建镜像
    1. $ docker build -t dllhb/kaniko-test:v0.1 .
    2. Sending build context to Docker daemon 5.632kB
    3. Step 1/4 : FROM alpine:latest
    4. latest: Pulling from library/alpine
    5. 89d9c30c1d48: Already exists
    6. Digest: sha256:c19173c5ada610a5989151111163d28a67368362762534d8a8121ce95cf2bd5a
    7. Status: Downloaded newer image for alpine:latest
    8. ---> 965ea09ff2eb
    9. Step 2/4 : MAINTAINER <devops008@sina.com xiaomage>
    10. ---> Running in 8a2b1dc13d6b
    11. Removing intermediate container 8a2b1dc13d6b
    12. ---> bd535532278d
    13. Step 3/4 : RUN apk add busybox-extras curl
    14. ---> Running in fc254ad3d088
    15. fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/main/x86_64/APKINDEX.tar.gz
    16. fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/community/x86_64/APKINDEX.tar.gz
    17. (1/5) Installing busybox-extras (1.30.1-r3)
    18. Executing busybox-extras-1.30.1-r3.post-install
    19. (2/5) Installing ca-certificates (20190108-r0)
    20. (3/5) Installing nghttp2-libs (1.39.2-r0)
    21. (4/5) Installing libcurl (7.66.0-r0)
    22. (5/5) Installing curl (7.66.0-r0)
    23. Executing busybox-1.30.1-r2.trigger
    24. Executing ca-certificates-20190108-r0.trigger
    25. OK: 7 MiB in 19 packages
    26. Removing intermediate container fc254ad3d088
    27. ---> 1bbe81600a67
    28. Step 4/4 : CMD ["echo","Hello DevOps"]
    29. ---> Running in 4b92a6a4b37e
    30. Removing intermediate container 4b92a6a4b37e
    31. ---> de712b8cd7e5
    32. Successfully built de712b8cd7e5
    33. Successfully tagged dllhb/kaniko-test:v0.1Sending build context to Docker daemon 5.632kB
    34. Step 1/4 : FROM alpine:latest
    35. latest: Pulling from library/alpine
    36. 89d9c30c1d48: Already exists
    37. Digest: sha256:c19173c5ada610a5989151111163d28a67368362762534d8a8121ce95cf2bd5a
    38. Status: Downloaded newer image for alpine:latest
    39. ---> 965ea09ff2eb
    40. Step 2/4 : MAINTAINER <devops008@sina.com xiaomage>
    41. ---> Running in 8a2b1dc13d6b
    42. Removing intermediate container 8a2b1dc13d6b
    43. ---> bd535532278d
    44. Step 3/4 : RUN apk add busybox-extras curl
    45. ---> Running in fc254ad3d088

    由于docker依赖于 docker daemon 进程, docker daemon 进程是一个 Unixsocket 连接,且 /var/run/docker.sock 文件是root权限,

    1. $ ls -ltr /var/run/docker.sock
    2. lrwxr-xr-x 1 root daemon 69 Nov 26 15:13 /var/run/docker.sock
    1. $ docker run --rm -it --privileged docker:18.06-dind

    dind能够满足构建容器镜像的需求,但是从上面的命令看,有一个参数:–privileged 。意味着这个容器具有一些特权,他可能会看到宿主机上的一些设备,而且能够执行mount命令。

    dind还有很多问题,只是方便docker开发人员来测试docker,所以官方也说running Docker inside Docker is generally not recommended。

    上述两种方法,都能满足在容器内构建容器镜像且推送镜像至远端仓库的需求,但是从security角度来讲,需要root 权限(第一种方式),提供特权(第二种方式) 都使得风险增大,在Kubernetes 多租户的场景下,这种风险是不能接受的。那是否有一种不需要特殊权限,还能快速构建容器镜像的方法呢?答案就是下面讲的Kaniko。

    Kaniko介绍

    Kaniko是谷歌开源的一款用来构建容器镜像的工具。与docker不同,Kaniko 并不依赖于Docker daemon进程,完全是在用户空间根据Dockerfile的内容逐行执行命令来构建镜像,这就使得在一些无法获取 docker daemon 进程的环境下也能够构建镜像,比如在标准的Kubernetes Cluster上。

    1080×373 116 KB

    kaniko以容器镜像的方式来运行的,同时需要三个参数: Dockerfile、上下文、以及远端镜像仓库的地址

    Kaniko会先提取基础镜像(Dockerfile FROM 之后的镜像)的文件系统,然后根据Dockerfile中所描述的,一条条执行命令,每一条命令执行完以后会在用户空间下面创建一个snapshot,并与存储与内存中的上一个状态进行比对,如果有变化,就将新的修改生成一个镜像层添加在基础镜像上,并且将相关的修改信息写入镜像元数据中。等所有命令执行完,kaniko会将最终镜像推送到指定的远端镜像仓库。

    1. Kaniko Demo

    这里选择的是 GitHub - traefik/whoami: Tiny Go webserver that prints os information and HTTP request to output 和

    https://github.com/peishunwu/kaniko项目用来测试。访问该服务之后,接口会返回访。

    对项目的要求是,通过 Dockerfile 能够直接编译得到镜像。一共有两个验证点:

    ① 能够构建镜像

    ② 构建的镜像能够运行

    2. 在 Docker 上运行 Kaniko

    生成推送镜像的凭证

    以下说明:

    YOUR_USERNAME(我的dockerhub账户)

    YOUR_PASSWORD(我的dockerhub账户密码)

    1. export AUTH=$(echo -n YOUR_USERNAME:YOUR_PASSWORD | base64 )
    2. cat > config.json <<-EOF
    3. {
    4. "auths": {
    5. "https://index.docker.io/v1/": {
    6. "auth": "${AUTH}"
    7. }
    8. }
    9. }
    10. EOF

    构建镜像

    1. docker run \
    2. --interactive -v `pwd`/config.json:/kaniko/.docker/config.json gcr.io/kaniko-project/executor:latest \
    3. --context git://github.com/traefik/whoami \
    4. --dockerfile Dockerfile \
    5. --destination=xxx/kaniko-demo:v1

    context:构建需要的上下文。支持多种格式,S3、本地目录、标准输入、Git 仓库等

    dockerfile:Dockerfile 路径

    destination:构建后推送的镜像地址

    其中–destination=xxx/kaniko-demo:v1:xxx/kaniko-demo我的dockerhub的仓库

    在生产环境,可以配置缓存,用于加速镜像构建。

    执行上一步的命令之后,可以看到如下输出:

    901×332 25.4 KB

    如果没有问题会正常退出!

    1. docker images|grep kaniko-demo

    执行完命令,没有任何输出,符合预期。构建之后的镜像,直接被推送到了远程 Registry。

    DockerHub 查看镜像,在 DockerHub 页面可以查看到推送的镜像:

    1080×574 75.4 KB

    1. docker run -d -p 8011:80 peishunwu/kaniko-demo:v1

    1. curl localhost:8011

    服务正常!

  • 相关阅读:
    [附源码]java毕业设计公务员报名
    JOSEF约瑟 HJY-E1A/4D电压继电器 欠电压动作 整定范围10~242V 二转换
    数据库上机实验5 数据库安全性
    1. 两数之和、Leetcode的Python实现
    智能运维,为新型数据中心注入科技动能
    Spring的AOP使用配置
    UE4 UEngine.GameInstance.WorldContext.World.Level.Actor.Component
    mybatis使用事务
    【设计模式2_工厂、策略】
    这几个Python实战项目,让大家了解到它的神奇
  • 原文地址:https://blog.csdn.net/ceshiren456/article/details/126141641