<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Docker on 涯余的博客</title><link>https://hangyan.github.io/categories/docker/</link><description>Recent content in Docker on 涯余的博客</description><generator>Hugo</generator><language>zh</language><managingEditor>hang.yan@hotmail.com (涯余)</managingEditor><webMaster>hang.yan@hotmail.com (涯余)</webMaster><lastBuildDate>Mon, 07 Sep 2020 18:13:47 +0000</lastBuildDate><atom:link href="https://hangyan.github.io/categories/docker/index.xml" rel="self" type="application/rss+xml"/><item><title>Docker 私有 Registry 的镜像 GC 问题</title><link>https://hangyan.github.io/post/2020-09-07-docker-registry-gc/</link><pubDate>Mon, 07 Sep 2020 18:13:47 +0000</pubDate><author>hang.yan@hotmail.com (涯余)</author><guid>https://hangyan.github.io/post/2020-09-07-docker-registry-gc/</guid><description>&lt;h2 id="需求"&gt;需求&lt;/h2&gt;
&lt;p&gt;一个轻量级的 docker registry&lt;/p&gt;
&lt;h2 id="方案讨论"&gt;方案讨论&lt;/h2&gt;
&lt;p&gt;Harbor 的功能丰富，但是过于重量级了，与其他平台集成并不方便。Portus 类似。这一类产品都比较侧重 UI 和认证，一般都带有数据库， 与K8S 的集成也比较麻烦。最终看起来还是 registry 最合适，不过就是功能太简陋了。需要考虑的东西很多:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;HTTPS&lt;/li&gt;
&lt;li&gt;暴露方式 -&amp;gt; Ingress/NodePort. 最好的方式当然是 Ingress, 但虽然 registry 支持 SubPath, 但docker client 不支持。所以只能退而求其次用 NodePort. 对外地址的暴露只能设计 CR 来做了&lt;/li&gt;
&lt;li&gt;GC -&amp;gt; 这块看起来都受限于 registry 本身的能力。它提供了命令行工具能手工清除 blob, 但其他的 metadata 没删完。导致做完 GC 还得重启下 registry. 同时还得保持 GC 时 readonly.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这里面最繁琐的就是 GC, 目前提供的工具非常的原始。harbor 集成了 gc 的功能，应该是在 admin 页面提供了按钮来手动触发。那么在 K8S + registry 的限定范围内应该怎么做，目前想好的流程是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在 registry 的 deployment 里加一个 container 来处理 GC， 这样的好处是可以共享配置，存储和 PID&lt;/li&gt;
&lt;li&gt;gc container 和 registry container 共用同样的镜像，但 CMD 不一样&lt;/li&gt;
&lt;li&gt;gc container 的 CMD 是一个 while 循环，用来周期性地跑 GC 命令&lt;/li&gt;
&lt;li&gt;跑完 GC 之后，如果确实清理了一些 blob, 还需要重启 registry. 不然因为其他一些 metadata 没有清理， 直接 push 和 pull 会出错。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这样就组成了一个低成本的可用的 GC 方案。缺点就是没法方便地将 registry 置为 readonly. 理论上来讲, gc 的周期设置长一点，问题不大.&lt;/p&gt;</description></item><item><title>Docker BuildKit 介绍</title><link>https://hangyan.github.io/post/2019-04-08-buildkit/</link><pubDate>Mon, 08 Apr 2019 16:22:48 +0800</pubDate><author>hang.yan@hotmail.com (涯余)</author><guid>https://hangyan.github.io/post/2019-04-08-buildkit/</guid><description>&lt;!-- toc --&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hangyan.github.io/post/2019-04-08-buildkit/#%e4%b8%ba%e4%bb%80%e4%b9%88%e9%9c%80%e8%a6%81-buildkit"&gt;为什么需要 BuildKit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hangyan.github.io/post/2019-04-08-buildkit/#buildkit-%e9%95%bf%e4%bb%80%e4%b9%88%e6%a0%b7%e5%ad%90"&gt;BuildKit 长什么样子&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hangyan.github.io/post/2019-04-08-buildkit/#llb"&gt;LLB&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hangyan.github.io/post/2019-04-08-buildkit/#%e6%9c%89%e7%94%a8%e7%9a%84%e6%96%b0%e5%8a%9f%e8%83%bd"&gt;有用的新功能&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hangyan.github.io/post/2019-04-08-buildkit/#links"&gt;Links&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- tocstop --&gt;
&lt;p&gt;对于 Docker 和 Kubernetes 来说，在自身发展的壮大过程中，都会经历一个因为功能不断增加导致的软件结构庞杂的问题。对于 Kubernetes 来说，出于架构上的考量，&lt;code&gt;kubectl&lt;/code&gt; 等项目的代码都会逐渐从主项目中移除。对于 Docker 来说，事情更为复杂，它既要考虑开源，又要考虑自己的商业化，所以有了 moby 以及 &lt;code&gt;*kit&lt;/code&gt; 等一系列项目。
下图清晰地展示出了 Docker 对于相关项目的一个架构规划:&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://images.techhive.com/images/article/2017/05/moby-project-100721192-large.jpg"&gt;&lt;/p&gt;
&lt;p&gt;总体来说，Docker 希望将容器技术与容器产品分离开，核心技术是开源的，可扩展的，这样允许有其他人来基于同样的技术来构建类似于 Docker CE/Docker EE 这样的产品。
BuildKit 自 2017 年年底便已经实现，但似乎关注度不是很高(在国内)，在 CI/CD 系统中的应用也不是很广泛。本文是关于 BuildKit 的一个相关介绍。&lt;/p&gt;
&lt;h2 id="为什么需要-buildkit"&gt;为什么需要 BuildKit&lt;/h2&gt;
&lt;p&gt;除了上面说的商业以及架构上的考量，本身在构建这一块，Dockerfile 以及相应的机制也面临着一些问题&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;并发程度不够好&lt;/p&gt;
&lt;p&gt;很多步骤都是可以并行执行的，比如两部构建中的两次 pull 镜像，以及各种 run 命令&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对 cache 的支持不好&lt;/p&gt;
&lt;p&gt;像 golang 这样的语言，每次构建都要从头开始，没法复用缓存&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对 secret 的支持不好&lt;/p&gt;
&lt;p&gt;难以支持在 dockerfile 中通过 username-password/ssl key 等方式获取一些加密信息&lt;/p&gt;</description></item><item><title>Docker 1.7 介绍</title><link>https://hangyan.github.io/post/2015-07-12-docker-1.7/</link><pubDate>Sun, 12 Jul 2015 21:37:39 +0800</pubDate><author>hang.yan@hotmail.com (涯余)</author><guid>https://hangyan.github.io/post/2015-07-12-docker-1.7/</guid><description>docker 1.7 features</description></item><item><title>docker 容器的一些概念辨析</title><link>https://hangyan.github.io/post/2015-04-16-some-concepts-of-docker-containers/</link><pubDate>Thu, 16 Apr 2015 21:37:39 +0800</pubDate><author>hang.yan@hotmail.com (涯余)</author><guid>https://hangyan.github.io/post/2015-04-16-some-concepts-of-docker-containers/</guid><description>&lt;p&gt;本篇的主要内容是为了澄清 docker 容器的一些容易混淆的概念，主要分两部分，
一是容器端口的&lt;code&gt;publish&lt;/code&gt;和&lt;code&gt;expose&lt;/code&gt;,二是 Dockerfile 中&lt;code&gt;ENTRYPOINT&lt;/code&gt;和&lt;code&gt;CMD&lt;/code&gt;的区分。&lt;/p&gt;</description></item><item><title>docker 源码分析(6) -- 镜像删除</title><link>https://hangyan.github.io/post/2015-04-03-docker-source-code-part6-image-delete/</link><pubDate>Fri, 03 Apr 2015 21:37:39 +0800</pubDate><author>hang.yan@hotmail.com (涯余)</author><guid>https://hangyan.github.io/post/2015-04-03-docker-source-code-part6-image-delete/</guid><description>&lt;p&gt;本篇的主要内容是关于如何删除镜像的.听起来是挺简单的一件事,但是&lt;code&gt;docker&lt;/code&gt;本身的删除
策略定义并不清除，而且在实际的使用过程中,似乎总是与我们预计的结果不符,比如磁盘空间并没有被释放.所以在此单列一篇,详细解析镜
像删除的过程.&lt;/p&gt;</description></item><item><title>docker 源码分析(5) -- 镜像拉取及存储</title><link>https://hangyan.github.io/post/2015-03-30-docker-source-code-part5-images/</link><pubDate>Mon, 30 Mar 2015 21:37:39 +0800</pubDate><author>hang.yan@hotmail.com (涯余)</author><guid>https://hangyan.github.io/post/2015-03-30-docker-source-code-part5-images/</guid><description>docker images pulling and store</description></item><item><title>docker 源码分析(4) -- 网络设置</title><link>https://hangyan.github.io/post/2015-02-16-docker-source-code-part4-network-settings/</link><pubDate>Mon, 16 Feb 2015 21:37:39 +0800</pubDate><author>hang.yan@hotmail.com (涯余)</author><guid>https://hangyan.github.io/post/2015-02-16-docker-source-code-part4-network-settings/</guid><description>docker network setttings</description></item><item><title>docker 源码分析(3) -- daemon 启动流程</title><link>https://hangyan.github.io/post/2015-02-05-docker-source-code-part3-daemon-start/</link><pubDate>Thu, 05 Feb 2015 21:37:39 +0800</pubDate><author>hang.yan@hotmail.com (涯余)</author><guid>https://hangyan.github.io/post/2015-02-05-docker-source-code-part3-daemon-start/</guid><description>&lt;p&gt;本篇的主要内容是关于&lt;code&gt;docker daemon&lt;/code&gt;的启动流程。其主要内容均包含在
&lt;code&gt;github.com/docker/docker/docker/daemon.go&lt;/code&gt;文件中的&lt;code&gt;mainDaemon&lt;/code&gt;函数中，本文即按
其执行流程分析源码。因为所涉源码较多，所以所涉部分多是点到为止，详细分析会在后续
分专篇讲述。&lt;/p&gt;</description></item><item><title>docker 源码分析(2) -- 主程序及命令行参数解析</title><link>https://hangyan.github.io/post/2015-01-30-docker-source-code-part2-start-and-args/</link><pubDate>Fri, 30 Jan 2015 21:37:39 +0800</pubDate><author>hang.yan@hotmail.com (涯余)</author><guid>https://hangyan.github.io/post/2015-01-30-docker-source-code-part2-start-and-args/</guid><description>&lt;p&gt;研究一个大项目的源码，最好是从&lt;code&gt;main&lt;/code&gt;函数入口，一步一步与实际程序相结合，将实际代
码与相应相印证。所以本篇的主要内容就是 docker 主程序的启动流程以及命令行参数解析的
过程。&lt;/p&gt;</description></item><item><title>docker 源码分析(1) -- 开发环境准备</title><link>https://hangyan.github.io/post/2015-01-29-docker-source-code-part1-dev-setup/</link><pubDate>Thu, 29 Jan 2015 21:37:39 +0800</pubDate><author>hang.yan@hotmail.com (涯余)</author><guid>https://hangyan.github.io/post/2015-01-29-docker-source-code-part1-dev-setup/</guid><description>&lt;p&gt;之前看过一遍&lt;code&gt;docker&lt;/code&gt;的代码，但比较粗略。第二遍准备详细过一遍并且用博客的方式将其
整理一下。目前为止&lt;code&gt;docker&lt;/code&gt;的稳定版本为&lt;code&gt;1.4.1&lt;/code&gt;,所以就以此版本的代码为基础进行阅读，分
析。&lt;/p&gt;</description></item></channel></rss>