<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Devops on Zayn's Blog</title><link>https://blog.treesir.pub/tags/devops/</link><description>Recent content in Devops on Zayn's Blog</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><managingEditor>yangzun@treesir.pub (Zayn)</managingEditor><webMaster>yangzun@treesir.pub (Zayn)</webMaster><copyright>2021-2026 Zayn</copyright><lastBuildDate>Sun, 29 Mar 2026 10:30:00 +0800</lastBuildDate><atom:link href="https://blog.treesir.pub/tags/devops/index.xml" rel="self" type="application/rss+xml"/><item><title>每日技术实践简报 - 2026-03-25</title><link>https://blog.treesir.pub/posts/daily-practice-2026-03-25/</link><pubDate>Wed, 25 Mar 2026 23:00:00 +0800</pubDate><author>yangzun@treesir.pub (Zayn)</author><guid>https://blog.treesir.pub/posts/daily-practice-2026-03-25/</guid><description>&lt;h1 class="relative group">今日技术实践
&lt;div id="今日技术实践" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e4%bb%8a%e6%97%a5%e6%8a%80%e6%9c%af%e5%ae%9e%e8%b7%b5" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h1>
&lt;h2 class="relative group">解决的问题
&lt;div id="解决的问题" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e8%a7%a3%e5%86%b3%e7%9a%84%e9%97%ae%e9%a2%98" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;ul>
&lt;li>把分散的 DevOps 反馈从“零散问题”改写为“工程健康治理”视角，先做问题分层，再做治理路线，避免头痛医头式修修补补。&lt;/li>
&lt;li>对未解决痛点做了结构化快照，统一了后续追踪入口，减少跨工具来回翻找的时间成本。&lt;/li>
&lt;/ul>
&lt;h2 class="relative group">学到的新东西
&lt;div id="学到的新东西" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e5%ad%a6%e5%88%b0%e7%9a%84%e6%96%b0%e4%b8%9c%e8%a5%bf" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;ul>
&lt;li>当问题长期存在且跨团队反复出现时，最有效的切入点不是继续加临时补丁，而是定义统一指标与优先级，把“处理单点故障”升级为“治理系统性风险”。&lt;/li>
&lt;li>轻量任务管理在早期调研阶段很关键：先把研究动作显式化，再逐步补齐验收标准，执行阻力会明显下降。&lt;/li>
&lt;/ul>
&lt;h2 class="relative group">踩坑记录
&lt;div id="踩坑记录" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e8%b8%a9%e5%9d%91%e8%ae%b0%e5%bd%95" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;ul>
&lt;li>仅有结论没有上下文时，后续复盘很难复用；因此当天补齐了“问题快照 + 行动项”配对记录，确保后续能直接接力推进。&lt;/li>
&lt;/ul>
&lt;h2 class="relative group">明日计划
&lt;div id="明日计划" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e6%98%8e%e6%97%a5%e8%ae%a1%e5%88%92" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;ul>
&lt;li>继续完善工程健康治理的指标草案（稳定性、交付效率、可观测性）。&lt;/li>
&lt;li>将今日痛点快照扩展为可执行清单，补充负责边界与时间窗口。&lt;/li>
&lt;li>对研究任务增加阶段性产出定义，确保每次推进都有可验证结果。&lt;/li>
&lt;/ul>
&lt;h2 class="relative group">推荐阅读
&lt;div id="推荐阅读" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e6%8e%a8%e8%8d%90%e9%98%85%e8%af%bb" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;ul>
&lt;li>&lt;a
href="https://blog.treesir.pub/posts/daily-practice-2026-03-24/">每日技术实践简报 - 2026-03-24&lt;/a>&lt;/li>
&lt;li>&lt;a
href="https://blog.treesir.pub/posts/daily-practice-2026-03-23/">每日技术实践简报 - 2026-03-23&lt;/a>&lt;/li>
&lt;li>&lt;a
href="https://blog.treesir.pub/posts/openclaw-memory-fallback-pattern/">OpenClaw 记忆层降级策略：当 Working Memory 不可用时，如何保持稳定输出&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>3 行 YAML 接入生产级 GitLab CI/CD：gitlab-ci-templates 实战</title><link>https://blog.treesir.pub/posts/gitlab-ci-templates-3-line-production-cicd/</link><pubDate>Tue, 24 Mar 2026 23:45:00 +0800</pubDate><author>yangzun@treesir.pub (Zayn)</author><guid>https://blog.treesir.pub/posts/gitlab-ci-templates-3-line-production-cicd/</guid><description>&lt;blockquote>
&lt;p>来源声明：本文基于开源仓库 &lt;code>cdryzun/gitlab-ci-templates&lt;/code> 的 README、目录结构与公开文档整理，重点提炼可直接落地的工程实践。&lt;/p>&lt;/blockquote>
&lt;p>很多团队在 GitLab CI/CD 上都踩过同一个坑：&lt;/p>
&lt;ul>
&lt;li>每个仓库维护一份独立流水线，重复劳动严重；&lt;/li>
&lt;li>语言一多（Java / Node.js / Python / Go），规则开始分裂；&lt;/li>
&lt;li>扫描、部署、回滚策略缺少统一治理。&lt;/li>
&lt;/ul>
&lt;p>这篇文章的核心目标很明确：&lt;strong>用一套可复用模板，把“能跑”升级成“可持续维护”。&lt;/strong>&lt;/p>
&lt;hr>
&lt;h2 class="relative group">一、3 行接入：把流水线从“项目资产”变成“平台能力”
&lt;div id="一3-行接入把流水线从项目资产变成平台能力" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e4%b8%803-%e8%a1%8c%e6%8e%a5%e5%85%a5%e6%8a%8a%e6%b5%81%e6%b0%b4%e7%ba%bf%e4%bb%8e%e9%a1%b9%e7%9b%ae%e8%b5%84%e4%ba%a7%e5%8f%98%e6%88%90%e5%b9%b3%e5%8f%b0%e8%83%bd%e5%8a%9b" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;p>最小接入：&lt;/p></description></item><item><title>2026 AI Agent 工程化全景：从框架选型到生产落地</title><link>https://blog.treesir.pub/posts/ai-agent-engineering-landscape-2026/</link><pubDate>Mon, 16 Mar 2026 14:00:00 +0800</pubDate><author>yangzun@treesir.pub (Zayn)</author><guid>https://blog.treesir.pub/posts/ai-agent-engineering-landscape-2026/</guid><description>从 7 层架构到框架选型、从多智能体协作到记忆系统、从 Coding Agent 到企业工具链的 AI Agent 2026 工程化实践全景。</description></item><item><title>Claude Code + GitLab pr-agent：AI 驱动的持续迭代开发实践</title><link>https://blog.treesir.pub/posts/claude-code-pr-agent-continuous-iteration/</link><pubDate>Mon, 16 Mar 2026 13:00:00 +0800</pubDate><author>yangzun@treesir.pub (Zayn)</author><guid>https://blog.treesir.pub/posts/claude-code-pr-agent-continuous-iteration/</guid><description>32 个 MR 的真实案例，展示 Claude Code + GitLab CI + pr-agent 三位一体的 AI 驱动持续迭代开发工作流。</description></item><item><title>从 60 分到 95 分：Hugo Blowfish 博客的极致优化之路</title><link>https://blog.treesir.pub/posts/hugo-blowfish-blog-optimization-journey/</link><pubDate>Mon, 16 Mar 2026 12:00:00 +0800</pubDate><author>yangzun@treesir.pub (Zayn)</author><guid>https://blog.treesir.pub/posts/hugo-blowfish-blog-optimization-journey/</guid><description>20+ 项优化、16 个 MR、涵盖 SEO 修复、布局重构、苹果代码框、封面图自动化和 SSH 远程部署的完整博客优化复盘。</description></item><item><title>Docker 常用命令速查手册</title><link>https://blog.treesir.pub/posts/docker-commands-cheatsheet/</link><pubDate>Sun, 15 Mar 2026 18:30:00 +0800</pubDate><author>yangzun@treesir.pub (Zayn)</author><guid>https://blog.treesir.pub/posts/docker-commands-cheatsheet/</guid><description>&lt;h2 class="relative group">前言
&lt;div id="前言" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e5%89%8d%e8%a8%80" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;p>Docker 是现代 DevOps 工作流中不可或缺的容器化工具。本文整理了日常工作中最常用的 Docker 命令，方便快速查阅。&lt;/p>
&lt;h2 class="relative group">镜像管理
&lt;div id="镜像管理" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e9%95%9c%e5%83%8f%e7%ae%a1%e7%90%86" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;h3 class="relative group">查看镜像
&lt;div id="查看镜像" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e6%9f%a5%e7%9c%8b%e9%95%9c%e5%83%8f" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">docker images
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker image ls
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 class="relative group">搜索镜像
&lt;div id="搜索镜像" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e6%90%9c%e7%b4%a2%e9%95%9c%e5%83%8f" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">docker search nginx
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 class="relative group">拉取镜像
&lt;div id="拉取镜像" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e6%8b%89%e5%8f%96%e9%95%9c%e5%83%8f" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">docker pull nginx:latest
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker pull nginx:1.21
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 class="relative group">删除镜像
&lt;div id="删除镜像" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e5%88%a0%e9%99%a4%e9%95%9c%e5%83%8f" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">docker rmi nginx:latest
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker rmi &lt;span class="k">$(&lt;/span>docker images -q&lt;span class="k">)&lt;/span> &lt;span class="c1"># 删除所有镜像&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 class="relative group">导出/导入镜像
&lt;div id="导出导入镜像" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e5%af%bc%e5%87%ba%e5%af%bc%e5%85%a5%e9%95%9c%e5%83%8f" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">docker save -o nginx.tar nginx:latest
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker load -i nginx.tar
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h2 class="relative group">容器管理
&lt;div id="容器管理" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e5%ae%b9%e5%99%a8%e7%ae%a1%e7%90%86" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;h3 class="relative group">查看容器
&lt;div id="查看容器" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e6%9f%a5%e7%9c%8b%e5%ae%b9%e5%99%a8" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">docker ps &lt;span class="c1"># 查看运行中的容器&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker ps -a &lt;span class="c1"># 查看所有容器&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker container ls &lt;span class="c1"># 同 docker ps&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 class="relative group">创建并启动容器
&lt;div id="创建并启动容器" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e5%88%9b%e5%bb%ba%e5%b9%b6%e5%90%af%e5%8a%a8%e5%ae%b9%e5%99%a8" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">docker run -d --name nginx -p 80:80 nginx:latest
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker run -it --name centos centos:7 /bin/bash
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 class="relative group">启动/停止/重启容器
&lt;div id="启动停止重启容器" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e5%90%af%e5%8a%a8%e5%81%9c%e6%ad%a2%e9%87%8d%e5%90%af%e5%ae%b9%e5%99%a8" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">docker start nginx
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker stop nginx
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker restart nginx
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 class="relative group">进入容器
&lt;div id="进入容器" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e8%bf%9b%e5%85%a5%e5%ae%b9%e5%99%a8" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">docker &lt;span class="nb">exec&lt;/span> -it nginx /bin/bash
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker attach nginx
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 class="relative group">查看容器日志
&lt;div id="查看容器日志" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e6%9f%a5%e7%9c%8b%e5%ae%b9%e5%99%a8%e6%97%a5%e5%bf%97" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">docker logs nginx
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker logs -f nginx &lt;span class="c1"># 实时查看&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker logs --tail &lt;span class="m">100&lt;/span> nginx &lt;span class="c1"># 查看最后100行&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 class="relative group">查看容器详情
&lt;div id="查看容器详情" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e6%9f%a5%e7%9c%8b%e5%ae%b9%e5%99%a8%e8%af%a6%e6%83%85" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">docker inspect nginx
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 class="relative group">查看容器资源使用
&lt;div id="查看容器资源使用" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e6%9f%a5%e7%9c%8b%e5%ae%b9%e5%99%a8%e8%b5%84%e6%ba%90%e4%bd%bf%e7%94%a8" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">docker stats
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker stats nginx
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 class="relative group">删除容器
&lt;div id="删除容器" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e5%88%a0%e9%99%a4%e5%ae%b9%e5%99%a8" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">docker rm nginx
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker rm -f nginx &lt;span class="c1"># 强制删除运行中的容器&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker rm &lt;span class="k">$(&lt;/span>docker ps -aq&lt;span class="k">)&lt;/span> &lt;span class="c1"># 删除所有容器&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h2 class="relative group">数据卷管理
&lt;div id="数据卷管理" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e6%95%b0%e6%8d%ae%e5%8d%b7%e7%ae%a1%e7%90%86" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;h3 class="relative group">创建数据卷
&lt;div id="创建数据卷" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e5%88%9b%e5%bb%ba%e6%95%b0%e6%8d%ae%e5%8d%b7" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">docker volume create mydata
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 class="relative group">查看数据卷
&lt;div id="查看数据卷" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e6%9f%a5%e7%9c%8b%e6%95%b0%e6%8d%ae%e5%8d%b7" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">docker volume ls
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker volume inspect mydata
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 class="relative group">删除数据卷
&lt;div id="删除数据卷" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e5%88%a0%e9%99%a4%e6%95%b0%e6%8d%ae%e5%8d%b7" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">docker volume rm mydata
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker volume prune &lt;span class="c1"># 删除未使用的数据卷&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 class="relative group">挂载数据卷
&lt;div id="挂载数据卷" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e6%8c%82%e8%bd%bd%e6%95%b0%e6%8d%ae%e5%8d%b7" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">docker run -d -v mydata:/data nginx
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker run -d -v /host/path:/container/path nginx
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h2 class="relative group">网络管理
&lt;div id="网络管理" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e7%bd%91%e7%bb%9c%e7%ae%a1%e7%90%86" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;h3 class="relative group">查看网络
&lt;div id="查看网络" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e6%9f%a5%e7%9c%8b%e7%bd%91%e7%bb%9c" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">docker network ls
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker network inspect bridge
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 class="relative group">创建网络
&lt;div id="创建网络" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e5%88%9b%e5%bb%ba%e7%bd%91%e7%bb%9c" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">docker network create mynet
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker network create --driver bridge mynet
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 class="relative group">连接容器到网络
&lt;div id="连接容器到网络" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e8%bf%9e%e6%8e%a5%e5%ae%b9%e5%99%a8%e5%88%b0%e7%bd%91%e7%bb%9c" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">docker network connect mynet nginx
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 class="relative group">断开容器网络
&lt;div id="断开容器网络" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e6%96%ad%e5%bc%80%e5%ae%b9%e5%99%a8%e7%bd%91%e7%bb%9c" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">docker network disconnect mynet nginx
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 class="relative group">删除网络
&lt;div id="删除网络" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e5%88%a0%e9%99%a4%e7%bd%91%e7%bb%9c" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">docker network rm mynet
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h2 class="relative group">系统清理
&lt;div id="系统清理" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e7%b3%bb%e7%bb%9f%e6%b8%85%e7%90%86" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;h3 class="relative group">清理退出状态的容器
&lt;div id="清理退出状态的容器" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e6%b8%85%e7%90%86%e9%80%80%e5%87%ba%e7%8a%b6%e6%80%81%e7%9a%84%e5%ae%b9%e5%99%a8" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">docker rm &lt;span class="k">$(&lt;/span>docker container ls -f &lt;span class="s2">&amp;#34;status=exited&amp;#34;&lt;/span> -q&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 class="relative group">清理未使用的镜像
&lt;div id="清理未使用的镜像" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e6%b8%85%e7%90%86%e6%9c%aa%e4%bd%bf%e7%94%a8%e7%9a%84%e9%95%9c%e5%83%8f" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">docker image prune
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker image prune -a &lt;span class="c1"># 删除所有未使用的镜像&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 class="relative group">一键清理
&lt;div id="一键清理" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e4%b8%80%e9%94%ae%e6%b8%85%e7%90%86" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">docker system prune
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker system prune -a &lt;span class="c1"># 包括镜像&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker system prune --volumes &lt;span class="c1"># 包括数据卷&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h2 class="relative group">Dockerfile 构建
&lt;div id="dockerfile-构建" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#dockerfile-%e6%9e%84%e5%bb%ba" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;h3 class="relative group">构建镜像
&lt;div id="构建镜像" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e6%9e%84%e5%bb%ba%e9%95%9c%e5%83%8f" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">docker build -t myimage:v1 .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker build -t myimage:v1 -f Dockerfile.custom .
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 class="relative group">Dockerfile 示例
&lt;div id="dockerfile-示例" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#dockerfile-%e7%a4%ba%e4%be%8b" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-dockerfile" data-lang="dockerfile">&lt;span class="line">&lt;span class="cl">&lt;span class="k">FROM&lt;/span>&lt;span class="s"> centos:7&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">LABEL&lt;/span> &lt;span class="nv">maintainer&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;admin@example.com&amp;#34;&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">RUN&lt;/span> yum install -y vim &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> yum clean all&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">COPY&lt;/span> app.py /app/&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">WORKDIR&lt;/span>&lt;span class="s"> /app&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">EXPOSE&lt;/span>&lt;span class="s"> 8080&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">CMD&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;python&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;app.py&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 class="relative group">容器转镜像（不推荐）
&lt;div id="容器转镜像不推荐" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e5%ae%b9%e5%99%a8%e8%bd%ac%e9%95%9c%e5%83%8f%e4%b8%8d%e6%8e%a8%e8%8d%90" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">docker commit container_name image_name
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>&lt;strong>注意&lt;/strong>：不推荐使用 commit 创建镜像。建议使用 Dockerfile 构建镜像，因为 commit 创建的镜像不可复现。&lt;/p></description></item><item><title>Docker 部署 OpenLDAP 统一身份认证服务</title><link>https://blog.treesir.pub/posts/docker-deploy-ldap/</link><pubDate>Fri, 18 Dec 2020 16:24:43 +0800</pubDate><author>yangzun@treesir.pub (Zayn)</author><guid>https://blog.treesir.pub/posts/docker-deploy-ldap/</guid><description>&lt;h2 class="relative group">OpenLDAP 简介
&lt;div id="openldap-简介" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#openldap-%e7%ae%80%e4%bb%8b" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;h2 class="relative group">什么是 OpenLDAP
&lt;div id="什么是-openldap" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e4%bb%80%e4%b9%88%e6%98%af-openldap" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;p>OpenLDAP 是一个开源的轻量级目录访问协议（LDAP）实现，广泛用于企业级统一身份认证和目录服务。它提供了集中化的用户管理、身份验证和授权功能。&lt;/p></description></item><item><title>企业级 GitLab 平台部署与运维完整指南</title><link>https://blog.treesir.pub/posts/gitlab-deploy/</link><pubDate>Thu, 04 Mar 2021 16:31:06 +0800</pubDate><author>yangzun@treesir.pub (Zayn)</author><guid>https://blog.treesir.pub/posts/gitlab-deploy/</guid><description>&lt;h2 class="relative group">推荐阅读
&lt;div id="推荐阅读" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e6%8e%a8%e8%8d%90%e9%98%85%e8%af%bb" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;ul>
&lt;li>&lt;a
href="https://blog.treesir.pub/posts/jenkins-install/">企业级 Jenkins CI/CD 平台部署与配置完整指南&lt;/a>&lt;/li>
&lt;li>&lt;a
href="https://blog.treesir.pub/posts/kubernetes-deploy-gitlab/">Kubernetes 环境下部署 GitLab：localPv + 外部数据库方案&lt;/a>&lt;/li>
&lt;li>&lt;a
href="https://blog.treesir.pub/posts/spinnaker-helm-installd/">使用 Helm 部署 Spinnaker 持续部署(CD)平台&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 class="relative group">GitLab 平台简介
&lt;div id="gitlab-平台简介" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#gitlab-%e5%b9%b3%e5%8f%b0%e7%ae%80%e4%bb%8b" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;h2 class="relative group">什么是 GitLab
&lt;div id="什么是-gitlab" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e4%bb%80%e4%b9%88%e6%98%af-gitlab" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;p>GitLab 是一个基于 Web 的 DevOps 生命周期工具，提供了 Git 仓库管理、代码审查、问题跟踪、CI/CD 流水线和 Wiki 等功能。作为一个完整的 DevOps 平台，GitLab 帮助团队协作开发、测试和部署应用程序。&lt;/p></description></item><item><title>企业级 Nexus3 制品仓库平台部署与运维完整指南</title><link>https://blog.treesir.pub/posts/docker-deploy-nexus3-upgrade/</link><pubDate>Tue, 22 Dec 2020 09:24:55 +0800</pubDate><author>yangzun@treesir.pub (Zayn)</author><guid>https://blog.treesir.pub/posts/docker-deploy-nexus3-upgrade/</guid><description>&lt;p>Nexus3 是世界领先的企业级制品仓库管理平台，为现代 DevOps 工具链提供统一的制品管理解决方案。本指南将从基础部署到企业级配置，全面介绍 Nexus3 的部署、配置、管理和运维最佳实践。&lt;/p>
&lt;h2 class="relative group">Nexus3 平台简介
&lt;div id="nexus3-平台简介" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#nexus3-%e5%b9%b3%e5%8f%b0%e7%ae%80%e4%bb%8b" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;h2 class="relative group">什么是 Nexus3
&lt;div id="什么是-nexus3" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e4%bb%80%e4%b9%88%e6%98%af-nexus3" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;p>Nexus Repository Manager 3 是由 Sonatype 公司开发的下一代制品仓库管理平台，作为 DevOps 工具链的核心组件，为软件开发生命周期提供统一的制品管理能力。&lt;/p></description></item><item><title>从 MCP 到一键发包：把 Teambition 评论里的 APK 自动上传 Nexus 的那些坑</title><link>https://blog.treesir.pub/posts/from-mcp-to-one-click-release-ai-agent-automation/</link><pubDate>Sun, 29 Mar 2026 10:30:00 +0800</pubDate><author>yangzun@treesir.pub (Zayn)</author><guid>https://blog.treesir.pub/posts/from-mcp-to-one-click-release-ai-agent-automation/</guid><description>&lt;h2 class="relative group">推荐阅读
&lt;div id="推荐阅读" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e6%8e%a8%e8%8d%90%e9%98%85%e8%af%bb" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;ul>
&lt;li>&lt;a
href="https://blog.treesir.pub/posts/daily-practice-2026-03-28/">每日技术实践简报 - 2026-03-28&lt;/a>&lt;/li>
&lt;li>&lt;a
href="https://blog.treesir.pub/posts/openclaw-ai-agent-architecture-v2/">OpenClaw AI Agent 架构解析：多引擎联动与记忆系统&lt;/a>&lt;/li>
&lt;li>&lt;a
href="https://blog.treesir.pub/posts/ai-agent-workflow-practice/">当 AI Agent 遇上运维自动化：我的实践踩坑之路&lt;/a>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 class="relative group">目录
&lt;div id="目录" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e7%9b%ae%e5%bd%95" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;ul>
&lt;li>&lt;a
href="#%e7%9b%ae%e6%a0%87%e6%8a%8a%e6%89%8b%e5%b7%a5%e7%82%b9%e7%82%b9%e7%82%b9%e5%8f%98%e6%88%90%e5%8f%af%e5%a4%8d%e7%94%a8%e9%93%be%e8%b7%af">目标：把&amp;quot;手工点点点&amp;quot;变成可复用链路&lt;/a>&lt;/li>
&lt;li>&lt;a
href="#%e6%8a%80%e6%9c%af%e6%96%b9%e6%a1%88%e4%b8%ba%e4%bb%80%e4%b9%88%e9%80%89-mcp--skill">技术方案：为什么选 MCP + Skill&lt;/a>&lt;/li>
&lt;li>&lt;a
href="#%e5%ae%9e%e6%88%98%e4%bb%8e-mcporter-%e8%b0%83%e9%80%9a%e7%ac%ac%e4%b8%80%e6%9d%a1%e9%93%be%e8%b7%af">实战：从 mcporter 调通第一条链路&lt;/a>
&lt;ul>
&lt;li>&lt;a
href="#%e7%ac%ac%e4%b8%80%e4%b8%aa%e5%9d%91mcporter-%e7%9a%84%e5%8f%82%e6%95%b0%e6%a0%bc%e5%bc%8f">第一个坑：mcporter 的参数格式&lt;/a>&lt;/li>
&lt;li>&lt;a
href="#%e6%8b%bf%e8%af%84%e8%ae%ba%e5%92%8c%e9%99%84%e4%bb%b6listtaskactivitiesv3">拿评论和附件：ListTaskActivitiesV3&lt;/a>&lt;/li>
&lt;li>&lt;a
href="#%e7%ac%ac%e4%ba%8c%e4%b8%aa%e5%9d%91%e6%88%90%e5%91%98-id-%e5%85%a8%e6%98%af-objectid">第二个坑：成员 ID 全是 ObjectId&lt;/a>&lt;/li>
&lt;li>&lt;a
href="#%e7%ac%ac%e4%b8%89%e4%b8%aa%e5%9d%91apk-%e6%96%87%e4%bb%b6%e5%90%8d%e5%a4%aa%e9%87%8e%e4%ba%86">第三个坑：APK 文件名太野了&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a
href="#skill-%e5%b0%81%e8%a3%85tb-apk-uploader-%e7%9a%84%e6%a0%b8%e5%bf%83%e6%b5%81%e7%a8%8b">Skill 封装：tb-apk-uploader 的核心流程&lt;/a>&lt;/li>
&lt;li>&lt;a
href="#%e6%9c%80%e7%bb%88%e6%95%88%e6%9e%9c%e4%b8%80%e5%8f%a5%e8%af%9d%e5%8f%91%e5%8c%85">最终效果：一句话发包&lt;/a>&lt;/li>
&lt;li>&lt;a
href="#%e8%b8%a9%e5%9d%91%e6%80%bb%e7%bb%93%e5%88%ab%e8%a2%ab%e7%bb%86%e8%8a%82%e6%8b%96%e6%ad%bb">踩坑总结：别被细节拖死&lt;/a>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>这周我被一个很&amp;quot;低级但很费命&amp;quot;的流程折磨了好几次:&lt;/p></description></item><item><title>Istio in Action 学习笔记</title><link>https://blog.treesir.pub/posts/istio-in-action-study/</link><pubDate>Sun, 15 Mar 2026 21:24:00 +0800</pubDate><author>yangzun@treesir.pub (Zayn)</author><guid>https://blog.treesir.pub/posts/istio-in-action-study/</guid><description>&lt;h2 class="relative group">Istio in Action 学习笔记
&lt;div id="istio-in-action-学习笔记" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#istio-in-action-%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;blockquote>
&lt;p>Istio 是当下最流行的 Service Mesh（服务网格）方案之一，本文是学习《Istio in Action》书籍的详细笔记，涵盖从入门到进阶的核心知识点。&lt;/p>&lt;/blockquote>
&lt;h2 class="relative group">1. Istio 解决的问题
&lt;div id="1-istio-解决的问题" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#1-istio-%e8%a7%a3%e5%86%b3%e7%9a%84%e9%97%ae%e9%a2%98" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;p>在微服务架构中，网络问题往往是最大的挑战之一：&lt;/p></description></item><item><title>Python DevOps 完整实战指南</title><link>https://blog.treesir.pub/posts/python-fro-devops-notes/</link><pubDate>Thu, 05 Oct 2023 20:40:24 +0800</pubDate><author>yangzun@treesir.pub (Zayn)</author><guid>https://blog.treesir.pub/posts/python-fro-devops-notes/</guid><description>&lt;p>Python 在 DevOps 领域扮演着重要角色，其简洁的语法、丰富的生态系统和强大的自动化能力使其成为运维自动化的首选语言。本指南将从 DevOps 理念开始，逐步深入到 Python 在各个 DevOps 场景中的实际应用，帮助您构建高效的自动化运维体系。&lt;/p>
&lt;p>
&lt;figure>
&lt;img class="my-0 rounded-md" loading="lazy" alt="Python for DevOps 书籍封面" src="https://cdn.treesir.pub/images/2023/10/05/20231005204456.jpg">
&lt;/figure>
&lt;/p>
&lt;p>&lt;em>图：《Python for DevOps: Learn Ruthlessly Effective Automation》&lt;/em>&lt;/p>
&lt;h2 class="relative group">DevOps 理念与文化
&lt;div id="devops-理念与文化" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#devops-%e7%90%86%e5%bf%b5%e4%b8%8e%e6%96%87%e5%8c%96" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;h3 class="relative group">什么是 DevOps
&lt;div id="什么是-devops" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e4%bb%80%e4%b9%88%e6%98%af-devops" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h3>
&lt;p>DevOps 是一种文化、实践和工具的组合，旨在提高组织快速交付应用程序和服务的能力。它强调开发（Development）和运维（Operations）团队之间的协作与沟通。&lt;/p></description></item><item><title>Gitea Actions ActRunner 基于 Systemd 部署安装</title><link>https://blog.treesir.pub/posts/gitea-actrunner-systemd-deployment/</link><pubDate>Tue, 25 Jul 2023 22:06:35 +0800</pubDate><author>yangzun@treesir.pub (Zayn)</author><guid>https://blog.treesir.pub/posts/gitea-actrunner-systemd-deployment/</guid><description>&lt;h2 class="relative group">说明
&lt;div id="说明" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e8%af%b4%e6%98%8e" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;blockquote>
&lt;p>Gitea是一个开源的自助式Git服务，用于托管和管理Git仓库。它是一个轻量级且易于安装和使用的解决方案，类似于GitHub或GitLab，可以在私有服务器上搭建自己的Git仓库服务。Gitea提供了一系列功能，使团队或个人能够方便地进行版本控制和协作开发，包括：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>仓库管理：可以创建、克隆、推送和拉取Git仓库，管理分支和标签，查看提交历史和代码差异等操作。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>用户和权限管理：可以创建用户账号，管理用户的访问权限，并为不同的用户或团队分配不同的角色和权限，以控制仓库的访问和操作。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>问题追踪：提供了一个问题追踪系统，用户可以创建和管理问题、缺陷或需求，并与仓库的代码和提交相关联，方便团队进行协作和解决问题。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Pull请求：支持Pull请求（合并请求），允许用户在不直接修改主分支的情况下，通过提出Pull请求来建议将自己的代码合并到项目中。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>代码审查：Gitea提供了代码审查功能，可以让团队成员对提交的代码进行审查、讨论和评论，以提高代码质量和团队协作。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>集成与插件：Gitea支持与其他工具和服务的集成，如邮件通知、CI/CD工具和第三方插件等。&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>Gitea 从 &lt;code>1.19&lt;/code> 开始支持 Actions，使用前提需要像 GitlabRunner 一样部署一个独立的 Runner 来管理 Job，名叫 &lt;code>ActRunner&lt;/code>，具体可参考文档:&lt;/p></description></item><item><title>Sonatype Nexus Repository（Nexus3） 私服文件下载至本地 - (使用进阶篇 一)</title><link>https://blog.treesir.pub/posts/nexus-browse-directory-download/</link><pubDate>Tue, 25 Jul 2023 20:47:22 +0800</pubDate><author>yangzun@treesir.pub (Zayn)</author><guid>https://blog.treesir.pub/posts/nexus-browse-directory-download/</guid><description>&lt;h2 class="relative group">说明
&lt;div id="说明" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e8%af%b4%e6%98%8e" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;h2 class="relative group">Sonatype Nexus Repository 是什么？
&lt;div id="sonatype-nexus-repository-是什么" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#sonatype-nexus-repository-%e6%98%af%e4%bb%80%e4%b9%88" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;blockquote>
&lt;ul>
&lt;li>Sonatype Nexus Repository 是一个用于管理和分发软件组件的开源仓库管理系统。它提供了一个集中化的平台，使开发人员能够有效地存储、共享和发布各种类型的软件包。Nexus Repository 支持多种主流技术栈，并具有强大的安全性和可扩展性。通过使用 Sonatype Nexus Repository，团队可以更好地控制其软件构建过程，并确保高质量和稳定性的交付。&lt;code> by ChatCPT&lt;/code>&lt;/li>
&lt;/ul>&lt;/blockquote>
&lt;h2 class="relative group">Nexus3 私服文件下载至本地的用途是什么？
&lt;div id="nexus3-私服文件下载至本地的用途是什么" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#nexus3-%e7%a7%81%e6%9c%8d%e6%96%87%e4%bb%b6%e4%b8%8b%e8%bd%bd%e8%87%b3%e6%9c%ac%e5%9c%b0%e7%9a%84%e7%94%a8%e9%80%94%e6%98%af%e4%bb%80%e4%b9%88" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;blockquote>
&lt;ol>
&lt;li>比如我们要将 &lt;code>Nexus3&lt;/code> 私服中的依赖包制品，&lt;code>进行迁移&lt;/code>，因 Nexus3 基于 &lt;a
href="https://help.sonatype.com/repomanager3/planning-your-implementation/storage-guide"
target="_blank"
>BlobStore&lt;/a> 技术实现对文件的落盘存储，无法在对应节点中直接看到制品文件，此时则需要通过一些手段进行转换取出，虽然可以通过网页一个一个点击下载，但如果下载制品数量过多，则不会是个过于明智的选择。迁移的场景也有很多种，如:
&lt;ul>
&lt;li>迁移至其他实例，或离线环境&lt;/li>
&lt;li>需要更换到其他类型的存储库如: &lt;code>JFrog&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>&lt;/blockquote>
&lt;h2 class="relative group">文件下载至本地
&lt;div id="文件下载至本地" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e6%96%87%e4%bb%b6%e4%b8%8b%e8%bd%bd%e8%87%b3%e6%9c%ac%e5%9c%b0" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;blockquote>
&lt;p>下面所展示的方法，使用到了 Nexus3 的API 进行实现，具体可参考如下文档：&lt;/p></description></item><item><title>企业级 Jenkins CI/CD 平台部署与配置完整指南</title><link>https://blog.treesir.pub/posts/jenkins-install/</link><pubDate>Tue, 02 Mar 2021 19:31:09 +0800</pubDate><author>yangzun@treesir.pub (Zayn)</author><guid>https://blog.treesir.pub/posts/jenkins-install/</guid><description>&lt;h2 class="relative group">推荐阅读
&lt;div id="推荐阅读" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e6%8e%a8%e8%8d%90%e9%98%85%e8%af%bb" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;ul>
&lt;li>&lt;a
href="https://blog.treesir.pub/posts/gitlab-deploy/">企业级 GitLab 平台部署与运维完整指南&lt;/a>&lt;/li>
&lt;li>&lt;a
href="https://blog.treesir.pub/posts/spinnaker-helm-installd/">使用 Helm 部署 Spinnaker 持续部署(CD)平台&lt;/a>&lt;/li>
&lt;li>&lt;a
href="https://blog.treesir.pub/posts/kubernetes-deploy-gitlab/">在 Kubernetes 中使用 localPv 部署 Gitlab&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 class="relative group">Jenkins 平台简介
&lt;div id="jenkins-平台简介" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#jenkins-%e5%b9%b3%e5%8f%b0%e7%ae%80%e4%bb%8b" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;h2 class="relative group">什么是 Jenkins
&lt;div id="什么是-jenkins" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#%e4%bb%80%e4%b9%88%e6%98%af-jenkins" aria-label="锚点">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;p>Jenkins 是世界领先的开源自动化服务器，由 Kohsuke Kawaguchi 于 2004 年创建。作为 DevOps 工具链的核心组件，Jenkins 为软件开发生命周期提供了强大的自动化能力。&lt;/p></description></item></channel></rss>