首页 > 编程知识 正文

镜像网站,docker创建镜像

时间:2023-05-04 18:38:36 阅读:154856 作者:1981

一、前言最近,该公司重新搭建了devops相关平台,针对流水线上以集装箱方式交付的产品越来越多,为了以更安全的方式构建集装箱镜像,采用Kaniko进行搭建。

在了解如何在Kaniko上构建镜像之前,请了解一些构建镜像的方法。

二、构建docker镜像构建docker镜像是一种常见的方法,在具备构建容器镜像所需的两个要素(Dockerfile和上下文)的前提下,可以通过以下命令构建容器镜像:

docker build-tyour _ registry/your _ repository : tag .然后用docker push将镜像推送到镜像仓库

dockerpushyour _ registry/your _ repository : tag三、在容器中构建镜像当前DevOps的许多CI/CD环境都在容器中运行,镜像配置也在容器中进行。 在这种情况下,构建容器中的镜像通常有两种方法:

第一,将主机套接字文件存储在容器内部的docker run-it-v/var/run/docker.sock 3360/var/run/docker.sock-v/tmp/ka niko 3360

$ docker build-tdllhb/ka niko-test : v 0.1.sendingbuildcontexttodockerdaemon 5.632 kb step1/43: from alpine : latest latest alpine 89 d9c 30 C1 d 48: alreadyexistsdigest : sha 2563360 c 19173 C5 ad a610 a 5989151111163 d 28 a 67368362762534 d8a 8121 ce 95 c f2b D5 as tatatatatatatastatad latest----965ea09ff2EBstep2/4: maintainerdevops 008 @ Sina.com xiaomage---- running in8a2 B1 DC 13 D6 bremovingintermediatecontainer8a2 B1 DC 13 d 6b--- BD 533333 ----- running infc 254 ad 3d 088 fetch http://dl-cdn.alpine Linux.org/alpine/v 3.10/main apk index.tar.gz fetch 3http://dl-corg x86 _ 64/apk index.tar.gz (executing busybox-extras-1.30.1-R3.post-install (2/5) installling ca-certififed executing busybox-1.30.1-R2.triggerexecutingca-certificates-2019 01 08-r0.trigger ok :7 mibin 19 packagesremoving 4:cmd['Echo ', ' Hello DevOps'] ----running in 4b 92 a6a 4b 37 eremovingintermediatecontainer 4b 92 a6a 4b 37 e---de 712 b8cd 7e5successfulybuiltde 712 b8cd 7e5succcescesssssssffffffse 因为r依赖于docker daemon进程,所以docker daemon进程是UNIX套接字连接,并且在/var/run/docker.sock文件中具有root权限。

只有$ ls-ltr/var/run/docker.socklrwxr-xr-x1 root daemon 69 nov 2615336013/var/run/docker.sock说明root权限或者用户没有获取docker daemon进程的权限,则使用docker build构建镜像将非常困难。

您可能认为docker build镜像只需要docker命令正常运行,并且在可接受的范围内就能成功

器里面安装一个docker不就成功了吗?这也就是下面讲的第二种方法。

第二:dind(docker-in-docker)

这种方式不需要挂载宿主机的socket文件,但是需要以 --privileged 权限来以dind镜像创建一个容器:

$ docker run --rm -it --privileged docker:18.06-dind

然后在容器里面构建容器镜像并推送至远端仓库。

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

dind还有很多问题,只是方便docker开发人员来测试docker,所以官方也说running Docker inside Docker is generally not recommended。具体的可以看看这篇博文: https://jpetazzo.github.io/20…
上述两种方法,都能满足在容器内构建容器镜像且推送镜像至远端仓库的需求,但是从security角度来讲,需要root 权限(第一种方式),提供特权(第二种方式) 都使得风险增大,在Kubernetes 多租户的场景下,这种风险是不能接受的。那是否有一种不需要特殊权限,还能快速构建容器镜像的方法呢?答案就是下面将的Kaniko。

四、Kaniko介绍

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

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

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

4.1、Kaniko Demo

这里选择的是 https://github.com/traefik/whoami 项目和https://github.com/peishunwu/kaniko项目用来测试
。访问该服务之后,接口会返回访

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

能够构建镜像
构建的镜像能够运行

4.2、在 Docker 上运行 Kaniko

生成推送镜像的凭证
以下说明:
YOUR_USERNAME(我的dockerhub账户)
YOUR_PASSWORD(我的dockerhub账户密码)

export AUTH=$(echo -n YOUR_USERNAME:YOUR_PASSWORD | base64 )cat > config.json <<-EOF{"auths": {"https://index.docker.io/v1/": {"auth": "${AUTH}"}}}EOF

构建镜像

docker run --interactive -v `pwd`/config.json:/kaniko/.docker/config.json gcr.io/kaniko-project/executor:latest --context git://github.com/traefik/whoami --dockerfile Dockerfile --destination=peishunwu/kaniko-demo:v1

参数说明:

context, 构建需要的上下文。支持多种格式,S3、本地目录、标准输入、Git 仓库等dockerfile, Dockerfile 路径destination, 构建后推送的镜像地址

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

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

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

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

查看构建镜像是否落盘本地

docker images|grep kaniko-demo

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

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

使用刚才上传到dockerhub镜像,创建容器
执行命令:

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


验证服务是否正常:

curl localhost:8011Hostname: 6dd22f1e4100IP: 127.0.0.1IP: 172.17.0.2RemoteAddr: 172.17.0.1:40940GET / HTTP/1.1Host: localhost:8011User-Agent: curl/7.29.0Accept: */*

五、在 Kubernetes 上运行 Kaniko

待测试验证,后续添加

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。