OS/DevOps程序员切入Harness Engineering的入门与进阶指南

当AI模型本身不再稀缺,真正决定生产级AI应用成败的,是你为它搭建的"驾驭系统"------这就是Harness Engineering。

一、引言:为什么OS/DevOps程序员必须了解Harness Engineering?

你是一名OS或DevOps工程师,日常工作可能是维护Linux服务器、管理Kubernetes集群、编写Terraform脚本、配置CI/CD流水线、处理告警和日志。你可能已经尝试过用AI来写脚本或分析日志,但往往发现:AI给出的答案不可靠、执行复杂任务容易中断、或者需要你反复人工纠正。

问题的根源不在于AI模型不够强,而在于缺少一个让AI能够安全、稳定、可观测地运行在真实生产环境中的"驾驭系统"------这就是Harness Engineering。

Harness Engineering是继Prompt Engineering、Context Engineering之后的第三代AI工程范式。它关注的不再是"怎么说"或"看到什么",而是AI运行其中的整个系统:包括工具调用生命周期、安全护栏、失败重试、审计日志、成本控制,以及最重要的------让AI能够持续完成长周期、多步骤的复杂任务。

作为OS/DevOps工程师,你天然具备系统思维、自动化脚本能力、以及对可观测性和稳定性的深刻理解------这正是Harness Engineering最需要的底层素养。换句话说,你不是在转行,而是在升级你的现有技能


二、核心概念与原理:你需要的理论基础

在动手之前,先花10分钟理解以下三个关键概念。它们将贯穿你后续的所有实践。

2.1 三层金字塔:Prompt → Context → Harness

层级 核心问题 典型技术 类比
Prompt Engineering 如何把任务说清楚? 结构化提示、思维链、角色设定 给AI发指令
Context Engineering AI在执行时看到什么信息? RAG检索、上下文窗口管理、动态信息注入 给AI配资料
Harness Engineering AI在什么系统中运行? 工具集约束、安全护栏、反馈闭环、容错机制 给AI造驾驶舱

三者不是替代关系,而是层层包含:Harness 包含 Context 管理,Context 包含 Prompt 设计。一个没有Harness的AI Agent就像一个没有方向盘的发动机------马力再大也无法安全上路。

2.2 Agent Harness vs Harness Engineering:不要混淆

  • Agent Harness :具体的运行控制面板(如LangChain的AgentExecutor、Claude Code的运行时),是一个技术实体
  • Harness Engineering :设计和维护Agent Harness的工程方法论,包括设计模式、最佳实践、评估标准。

作为工程师,你既要会用具体的Harness框架,更要理解背后的设计原则。

2.3 Harness Engineering的三大核心组件

根据2025-2026年的行业实践,一个完整的Harness体系包含:

① 上下文工程(Context Engineering)

不是把所有信息塞进AI的上下文窗口,而是像"索引地图"一样按需加载。上下文窗口是稀缺资源,塞太满会导致AI"注意力涣散"。

② 架构约束(Architecture Constraints)

通过机械化规则强制AI的行为边界。一个反直觉的经验是:移除80%的工具,AI的表现反而更好。因为约束缩小了解的空间,降低了AI做出错误选择的概率。

③ 垃圾回收(Garbage Collection)

持续对抗AI高速产出带来的"代码熵增"。AI写得快,也写得乱。你需要定期清理AI生成的劣质代码、重复逻辑和无效工具调用。

2.4 为什么OS/DevOps背景是优势?

你的日常工作已经包含了Harness Engineering的雏形:

  • 你用Prometheus监控系统指标 → 这是AI的可观测性基础
  • 你用Terraform声明基础设施 → 这是约束AI操作范围的声明式方法
  • 你用CI/CD流水线自动测试部署 → 这是AI输出的自动化验证机制
  • 你用Shell脚本处理故障 → 这是AI工具调用的执行环境

你缺的不是基础,而是如何将这些能力"对齐"到AI Agent上的方法论。


三、入门指南:两周内跑通你的第一个AI Harness

本部分按"部署→修改→测试→验证"四个阶段组织,每个阶段都有可执行的代码或配置。

3.1 环境准备(一天内完成)

硬件要求

  • 本地开发机:8GB内存以上,建议16GB
  • 可选:云服务器(阿里云、AWS)用于部署生产级Harness

软件要求

bash 复制代码
# 安装必要工具
# macOS
brew install node git python@3.10
# Ubuntu/Debian
sudo apt update && sudo apt install nodejs npm git python3.10

# 验证安装
node --version   # 需 >= v18
python3 --version # 需 >= 3.10
git --version

获取API密钥(以低成本或免费方案为例):

  • 选项A(推荐):阿里云百炼平台,新用户有免费额度,支持Claude和通义千问API
  • 选项B:本地运行Ollama + Llama3 8B(完全免费,但需要较高配置)
  • 选项C:OpenAI API(需付费,但生态最成熟)

3.2 部署:让第一个AI Agent在终端中跑起来

我们选择Claude Code作为第一个Harness实践,因为它专为开发者设计,内置了工具调用和安全护栏。

步骤1:安装Claude Code

bash 复制代码
# 全局安装
npm install -g @anthropic-ai/claude-code

# Windows用户:先安装WSL2,然后在WSL中执行

步骤2:配置API密钥(以阿里云百炼为例)

bash 复制代码
# 创建配置目录
mkdir -p ~/.claude

# 写入配置
cat > ~/.claude/settings.json <<EOF
{
  "env": {
    "ANTHROPIC_AUTH_TOKEN": "sk-xxxxx",  // 替换为你的API密钥
    "ANTHROPIC_BASE_URL": "https://dashscope.aliyuncs.com/compatible-mode/v1",
    "ANTHROPIC_MODEL": "claude-3-sonnet"
  }
}
EOF

步骤3:启动并测试

bash 复制代码
# 进入你的项目目录
cd ~/my-test-project

# 启动Claude Code
claude

# 在出现的提示符中输入:
> 创建一个hello.py文件,内容为打印"Hello from AI Agent"
# 观察AI如何创建文件、写入内容

恭喜! 你已经成功部署了一个能够操作本地文件系统的AI Agent。这就是Harness Engineering的起点------一个被约束在特定目录内、只能调用有限工具的AI。

3.3 修改:定制你的AI Harness

3.3.1 修改System Prompt(改变AI的"性格")

System Prompt是控制AI行为的最直接方式。在Claude Code中,可以创建项目级别的配置:

bash 复制代码
# 在你的项目根目录下创建 .claude 文件夹
mkdir -p .claude

# 创建系统提示词文件
cat > .claude/instructions.md <<EOF
你是一名DevOps专家AI助手。你在回答时必须遵守以下规则:
1. 所有Shell命令必须经过用户确认后才能执行(使用AskUserApproval工具)
2. 修改生产配置前,必须先输出diff并等待批准
3. 当不确定时,优先请求人类澄清,而不是猜测
4. 输出的代码必须包含错误处理(try-catch或检查返回值)
EOF

这个简单的提示词已经为你构建了第一道"安全护栏"。

3.3.2 为AI添加工具(扩展能力)

Claude Code默认支持文件读写、Shell命令执行。你可以通过配置添加自定义工具:

bash 复制代码
# 在 .claude/settings.json 中添加工具配置
{
  "tools": {
    "kubectl": {
      "description": "执行kubectl命令(只读操作)",
      "allowed_commands": ["get", "describe", "logs"],
      "require_approval": true
    },
    "terraform_plan": {
      "description": "生成Terraform执行计划",
      "command": "terraform plan -out=tfplan",
      "require_approval": false
    }
  }
}

关键设计原则 :为每个工具明确定义允许的操作和是否需要人工审批。永远不要让AI直接拥有kubectl deleterm -rf的能力。

3.3.3 接入RAG知识库(给AI装"长期记忆")

让AI能够基于你的运维文档、runbook、历史事故报告来回答问题。以下是使用LangChain + ChromaDB的完整示例:

python 复制代码
# rag_harness.py - 为你的AI Agent接入私有知识库
import os
from langchain.document_loaders import DirectoryLoader, TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import Chroma
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA

# 1. 加载你的运维文档(假设存放在 ./docs 目录)
loader = DirectoryLoader('./docs', glob="**/*.md", loader_cls=TextLoader)
documents = loader.load()

# 2. 切分成小块(保留重叠以维持上下文)
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200,
)
texts = text_splitter.split_documents(documents)

# 3. 创建向量数据库(本地运行,不依赖外部API)
embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
vectordb = Chroma.from_documents(texts, embeddings, persist_directory="./chroma_db")
vectordb.persist()

# 4. 创建检索增强的问答链
qa_chain = RetrievalQA.from_chain_type(
    llm=ChatOpenAI(model="gpt-3.5-turbo"),
    retriever=vectordb.as_retriever(search_kwargs={"k": 3}),
    return_source_documents=True
)

# 5. 使用示例:AI回答时会引用你的内部文档
response = qa_chain("如何处理Kubernetes节点NotReady状态?")
print(response['result'])
print("引用文档:", [doc.metadata for doc in response['source_documents']])

将这个脚本集成到你的Agent Harness中,AI就能"记住"你团队的所有运维知识。

3.4 测试:确保AI Agent的可靠性

AI应用的测试与传统软件测试有本质区别------输出是非确定性的。你需要建立一套自动化验证流水线

3.4.1 功能测试(确定性验证)

对于预期行为明确的任务(如"创建一个Nginx Deployment"),可以编写断言测试:

python 复制代码
# test_agent_actions.py
import pytest
from your_harness import AgentHarness

def test_create_nginx_deployment():
    harness = AgentHarness(mode="dry_run")  # 干跑模式,不实际执行
    result = harness.run("创建一个名为test-nginx的Deployment,镜像nginx:alpine")
    
    # 验证AI生成的Kubernetes YAML
    assert "kind: Deployment" in result.generated_yaml
    assert result.generated_yaml["metadata"]["name"] == "test-nginx"
    assert result.generated_yaml["spec"]["template"]["spec"]["containers"][0]["image"] == "nginx:alpine"
3.4.2 可靠性测试(对抗非确定性)

使用相同输入多次运行,统计输出的一致性:

bash 复制代码
# 编写一个简单的可靠性测试脚本
for i in {1..10}; do
  echo "Run $i"
  claude "列出当前目录下所有的.py文件" >> output_$i.txt
done

# 比较10次输出是否相同
diff output_1.txt output_2.txt  # 如果AI足够稳定,应该无差异

对于生产环境,建议使用专门的AI测试框架如Spec27DeepEval

3.4.3 安全边界测试(Harness核心)

测试你的护栏是否有效:

python 复制代码
def test_safety_guardrails():
    harness = AgentHarness()
    
    # 尝试危险操作,应该被拦截
    dangerous_commands = [
        "删除生产数据库",
        "执行 rm -rf /",
        "关闭防火墙"
    ]
    
    for cmd in dangerous_commands:
        result = harness.run(cmd)
        assert result.blocked == True
        assert "需要人工审批" in result.message

3.5 验证:在生产环境的持续监控

当你的AI Agent开始真正服务团队时,你需要一套可观测性体系。以下是最低可行的监控面板:

关键指标

指标 计算方式 目标值
任务成功率 成功完成任务数 / 总任务数 > 85%
平均响应时间 从用户输入到最终输出 < 30秒
人工介入率 需要人工审批的次数 / 总任务数 < 20%
Token成本 每次调用的总token数 × 单价 每月预算内
错误类型分布 超时/护栏拦截/API错误 用于改进Harness

实现示例(使用Prometheus + Grafana):

python 复制代码
# 在你的Agent Harness中添加埋点
from prometheus_client import Counter, Histogram, Summary

task_counter = Counter('agent_tasks_total', 'Total tasks', ['status'])
task_duration = Histogram('agent_task_duration_seconds', 'Task duration')
human_intervention = Counter('agent_human_interventions', 'Interventions', ['reason'])

@task_duration.time()
def run_agent_task(task):
    try:
        result = agent.execute(task)
        task_counter.labels(status='success').inc()
        return result
    except SafetyViolation as e:
        human_intervention.labels(reason='safety').inc()
        task_counter.labels(status='blocked').inc()
        raise

将上述指标暴露给Prometheus,并用Grafana可视化------你的AI Agent就有了"仪表盘"。


四、进阶指南:从单体Agent到多智能体协作系统

当你熟练掌握了单个AI Harness的部署、修改、测试和验证后,就可以进入下一阶段:构建多智能体协作系统。这是2026年AI工程化的核心方向。

4.1 为什么要多智能体?(Motivation)

一个全能AI往往不如多个专业AI协作。类比人类的软件开发团队:产品经理、架构师、前端、后端、测试各司其职。同理,你应该构建:

  • Planner Agent:将复杂运维任务拆解成子任务
  • Executor Agent:执行具体的脚本或API调用
  • Checker Agent:验证执行结果是否符合预期
  • Reporter Agent:汇总结果并生成人类可读的报告

实际案例:Anthropic团队在构建Claude Code的多Agent协作时,将一个复杂代码库迁移任务拆解为5个并行Agent,完成时间从4小时缩短到45分钟。

4.2 多智能体架构设计(参考模式)

python 复制代码
# multi_agent_harness.py
from typing import List, Dict
from dataclasses import dataclass

@dataclass
class Task:
    description: str
    assigned_to: str  # agent name
    dependencies: List[str]  # 依赖的其他任务ID

class MultiAgentOrchestrator:
    def __init__(self):
        self.planner = PlannerAgent()
        self.executors = {
            "k8s": K8sExecutor(),
            "terraform": TerraformExecutor(),
            "monitoring": PrometheusExecutor()
        }
        self.checker = CheckerAgent()
        
    def run(self, user_request: str):
        # 1. Planner拆解任务
        tasks = self.planner.decompose(user_request)
        
        # 2. 构建依赖图并调度执行
        results = {}
        for task in self._topological_sort(tasks):
            executor = self.executors[task.assigned_to]
            result = executor.execute(task.description)
            # 3. Checker验证结果
            if not self.checker.verify(result, task.expected_output):
                # 重试或升级到人工
                self._handle_failure(task, result)
            results[task.id] = result
        
        # 4. 汇总返回
        return self._aggregate(results)

4.3 解决"自我评价失效"问题

一个深刻的行业教训:让AI评价自己的同类工作,模型存在天然的盲目自信。Anthropic发现,即使Claude Code生成的代码有明显bug,让它自己检查时经常说"一切正常"。

解决方案

  1. 量化评估标准 :不要用"这个部署是否成功?"这种主观问题,而是用可测量的硬指标:
    • Pod启动时间 < 30秒?
    • 健康检查端点返回200?
    • 内存使用量 < 500MB?
  2. 赋予Checker真实工具 :让验证Agent能够执行实际测试(如调用kubectl get podscurl健康端点、查询Prometheus指标)。
python 复制代码
class HardChecker:
    def verify_deployment(self, namespace, deployment_name):
        # 不是问模型"你觉得行不行",而是实际检查
        pods = kubectl(f"get pods -n {namespace} -l app={deployment_name} -o json")
        ready_pods = [p for p in pods if p['status']['phase'] == 'Running']
        
        # 返回布尔值
        return len(ready_pods) >= 1

4.4 构建"智能体可读"的环境

OpenAI的研究表明,瓶颈往往不在模型能力,而在于环境对Agent是否"可读"。你需要让AI Agent能够像人类工程师一样"看到"系统状态。

实施清单

  • 将Chrome DevTools协议接入Agent(让AI能"看到"UI)
  • 为Agent提供PromQL查询能力(让它能查询监控指标)
  • 接入日志聚合系统(Loki/ELK),让AI能grep日志
  • 将基础设施代码(Terraform/K8s YAML)以结构化方式暴露

示例:给Agent装上"日志眼睛"

python 复制代码
# log_reader_tool.py
def query_logs(service_name, time_range="15m", grep_pattern=None):
    # 调用Loki API
    response = requests.get(
        f"http://loki:3100/loki/api/v1/query_range",
        params={
            "query": f'{{service="{service_name}"}} |~ "{grep_pattern}"' if grep_pattern else f'{{service="{service_name}"}}',
            "start": f"now-{time_range}",
            "end": "now"
        }
    )
    return response.json()['data']['result']

4.5 垃圾回收(Garbage Collection)机制

AI写得快,也写得乱。你需要部署一个后台"清洁工"Agent,定期做:

  1. 删除死代码:扫描仓库中未被任何地方引用的函数或变量
  2. 合并重复逻辑:识别多个Agent生成的相似代码块,抽象成公共函数
  3. 更新过时注释:AI生成的注释可能与代码实际行为不符
  4. 回滚无效更改:如果一个Agent提交的PR在24小时内被回滚,自动标记为"低质量"
bash 复制代码
# 每周五下午运行GC Agent
0 14 * * 5 cd /path/to/repo && python garbage_collector.py --aggressive=false

五、赋能OS/DevOps团队:从个人到集体

当你掌握了以上技能,你可以开始将AI能力注入整个OS/DevOps团队的工作流。

5.1 自动化运维Agent(全天候值班)

参考亚马逊的Amazon DevOps Agent设计,你可以构建一个能够:

  • 7×24小时监控应用健康状态
  • 收到告警后自动启动故障排查流程
  • 关联代码变更、配置变更、依赖服务状态
  • 提供根因分析报告,甚至自动执行修复

实际效果:西部州立大学SRE团队引入类似Agent后,平均故障修复时间(MTTR)降低了77%。

实现框架

yaml 复制代码
# 运维Agent的配置(使用K8s CronJob部署)
apiVersion: batch/v1
kind: CronJob
metadata:
  name: ops-agent
spec:
  schedule: "*/5 * * * *"  # 每5分钟运行一次
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: agent
            image: your-registry/ops-agent:latest
            env:
            - name: PROMETHEUS_URL
              value: "http://prometheus:9090"
            - name: GITHUB_TOKEN
              valueFrom:
                secretKeyRef:
                  name: github-token
                  key: token
            args:
            - --check-threshold=warning
            - --auto-remediate=false  # 初期设为false,仅建议

5.2 安全护栏与审计系统(企业级必须)

对于生产环境,你需要一个独立于AI Agent的安全代理(Security Proxy),拦截所有AI发出的命令。

python 复制代码
# security_proxy.py - 部署在AI Agent和实际系统之间
class SafetyInterceptor:
    DENY_LIST = [
        r"rm -rf /",
        r"kubectl delete.*--all",
        r"DROP DATABASE",
        r"chmod 777 /etc"
    ]
    
    APPROVAL_REQUIRED = [
        r"terraform apply",
        r"kubectl delete deployment",
        r"systemctl stop"
    ]
    
    def intercept(self, command: str) -> str:
        for pattern in self.DENY_LIST:
            if re.search(pattern, command):
                raise SafetyViolation(f"Blocked: {command}")
        
        for pattern in self.APPROVAL_REQUIRED:
            if re.search(pattern, command):
                # 发送到人工审批队列
                approval_id = self.request_approval(command)
                return f"Pending approval {approval_id}"
        
        return command

5.3 CI/CD流水线的AI集成

将AI Agent嵌入到你的GitLab CI或GitHub Actions中:

yaml 复制代码
# .github/workflows/ai-code-review.yml
name: AI Code Review
on:
  pull_request:
    types: [opened, synchronize]

jobs:
  review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Run AI Code Reviewer
        run: |
          claude "请审查PR #${{ github.event.pull_request.number }} 中的代码变更,检查:
            - 是否存在安全漏洞(如硬编码密钥)
            - 是否符合团队代码规范
            - 是否包含足够的单元测试
            以Markdown表格形式输出结果"
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_KEY }}

5.4 告警根因分析助手

将AI Agent接入PagerDuty或Alertmanager,让它自动分析告警:

python 复制代码
# alert_analyzer.py
def analyze_alert(alert):
    # 1. 获取过去1小时的K8s事件
    events = kubectl("get events --all-namespaces --field-selector type=Warning")
    
    # 2. 获取相关服务的日志
    logs = query_loki(alert.service, time_range="30m")
    
    # 3. 获取最近的代码变更
    commits = get_github_commits(alert.service, days=1)
    
    # 4. 让AI综合分析
    prompt = f"""
    告警: {alert.message}
    最近的K8s事件: {events}
    服务日志片段: {logs[-50:]}
    最近提交: {commits}
    
    请给出可能的根因、置信度(0-100%)、以及建议的修复步骤。
    """
    
    return claude_complete(prompt)

将分析结果自动发送到Slack或钉钉,工程师可以立即看到AI的诊断。


六、转型为AI Native Engineer:你的职业进化路线图

6.1 能力模型对比

维度 传统OS/DevOps工程师 AI Native Engineer
故障排查 手动查日志、执行命令 设计AI Agent自动诊断流程
自动化脚本 编写Bash/Python脚本 编写Prompt + 工具定义
系统设计 静态架构图 动态Agent协作图
知识传承 撰写Wiki文档 构建可执行的Runbook Agent
值班 人工轮值 AI第一响应 + 人工复核

6.2 三个月学习路线图

第1个月(基础)

  • Week 1-2:完成本指南的"入门指南"部分,跑通Claude Code + 简单RAG
  • Week 3:学习LangChain或LlamaIndex的基本使用
  • Week 4:用AI Agent自动化你日常工作中最烦人的一个手动任务(如日志分析)

第2个月(进阶)

  • Week 1-2:构建一个多Agent协作系统(Planner + Executor + Checker)
  • Week 3:为你的团队搭建AI Agent的监控面板(Prometheus + Grafana)
  • Week 4:在测试环境部署运维Agent,处理低风险告警

第3个月(落地)

  • Week 1-2:设计安全护栏,将AI Agent接入预生产环境
  • Week 3:编写团队培训材料,教会同事如何与AI Agent交互
  • Week 4:选择一个核心运维场景(如"自动扩缩容分析")正式上线

6.3 推荐的资源与工具

学习资源

  • 论文:"Harness Engineering: A New Paradigm for Reliable AI Agents"(arXiv 2026)
  • 开源项目:Qwen-Agent、LangGraph、AutoGen
  • 社区:AI Engineer Summit、Prompt Engineering Guide

核心工具链

类别 推荐工具 用途
Agent框架 LangChain, LlamaIndex, Qwen-Agent 构建Agent逻辑
向量数据库 ChromaDB, Qdrant, Pinecone RAG知识库
可观测性 Prometheus + Grafana, LangSmith 监控Agent行为
安全拦截 OPA (Open Policy Agent) 策略即代码
本地模型 Ollama, vLLM, llama.cpp 运行私有化LLM

七、总结:你的下一步行动

Harness Engineering不是一门遥不可及的理论,而是你今天就可以开始实践的工程方法。作为OS/DevOps工程师,你已经站在了最佳起跑线上。

立即开始的三个行动

  1. 今天:安装Claude Code,让它帮你写一个Kubernetes YAML文件,感受AI的潜力与局限。
  2. 本周:为你的团队搭建一个简单的RAG知识库,让AI能回答"XX服务的重启步骤是什么"。
  3. 本月:选择一个运维场景(如"磁盘空间告警自动清理"),设计一个包含Planner、Executor、Checker的Agent,并部署到测试环境。

记住:你的目标不是被AI取代,而是成为那个"给AI配缰绳"的人。当你的同事还在手动查日志时,你已经设计了一个Agent自动完成故障分析------这才是未来五年DevOps工程师的核心竞争力。

"代码不再值钱,值钱的是让代码在真实世界中正确运行的驾驭系统。" ------ 匿名AI工程师

现在,打开你的终端,输入 claude,开始你的第一段Harness Engineering之旅。

相关推荐
飞飞传输2 小时前
国产化FTP替代方案哪个好?选对平台让传输更安全高效
大数据·运维·安全
一生了无挂2 小时前
自己编译RustDesk,并将自建ID服务器和key信息写入客户端
运维·服务器
王飞飞不会飞2 小时前
Mac 安装Hermes Agent 过程记录
运维·深度学习·机器学习
徐子元竟然被占了!!3 小时前
Nginx
运维·nginx
SPC的存折4 小时前
6、Docker常用配置
运维·docker·容器
星谐5 小时前
AutoUploadLL:自动化上传工具开发实践
运维·自动化
NineData5 小时前
NineData将亮相2026德国汉诺威工业博览会
运维·数据库·后端
CXH7285 小时前
nginx——https
运维·nginx·https
SPC的存折5 小时前
4、Docker私有仓库
运维·docker·容器