Margrop
Articles241
Tags633
Categories6

Categories

1password 24GB VRAM 2K 3.6 Flash 30B dense 4-bit 量化 6-DoF SLAM AC ACP AI Agent AI Coding Assistant AI Tech AI tutor AI 安全 AI 应用 AI 日记 AI编程助手 ALTK-Evolve AMIE AP API API 定价 API 降价 ARC-AGI-3 ASR ATEM chat 模板 Agent Agent Harness Agent Memory Agent 入侵 Agent 工程 Agent 架构 Agent 检索 Agent 沙箱 Agent 系统 Agent 路由 Agentic AI Agentic tools Ai2 Alertmanager AllenAI Android 17 Antigravity AppDaemon AppWorld Aqara Astra Attention Baseten Benchmark CC-Switch CI/CD CLI Tools CLI工具 CPU 推理 Cache Hit Rate Caddy ChatGPT Claude Code Claude Sonnet ClawLoader Code Interpreter Codex ComfyUI Computer Use Cookie 认证 Cosmos-H-Dreams Cost Optimization Cron DFIR DSpark Date DeepSeek DeepSeek V4 Flash Diagrams.net Diary Diffusers Diffusion Docker Efficiency Tools Embedding English FSDP2 Fable 5 Fireworks AI FlashAttention FlashDreams GGUF GLM 5.2 GLM-5.2 GPT-4.1 GPT-5.6 GPT-Live GPT-Red GPU 加速 GPU 性能分析 Gateway Gemini Gemini 3.5 Flash Gemini API Gemini CLI Gemini Omni Flash Gemma 4 12B Gemma Translator Gemma4 GitHub Actions Google Google AI Google Research Google Sheets Grabette Gripette HA HADashboard HF Security Incident Hailuo Hermes Hexo HomeAssistant Hugging Face IBM Research Inference Providers Isaac Lab Java KV cache Kimi K3 Kubernetes LFM2.5 LFM2.5-VL LLM Router LVM‑Thin Late Interaction LeRobot Linux Liquid AI LiquidAI Live Translate LoRA Luna MCP MTP MacOS Magpie TTS Managed Agents Meta Microsoft 365 Copilot MiniMax Mistral Shieldstral Model Routing MuJoCo Warp Multi-Agent Multi-Vector Muse Glimmer MySQL NAS NIM NVIDIA NeMo Automodel Nemotron 3 Embed Newton Nginx Node.js Nunchaku OCR OOM OlmoEarth On-device AI Open Source OpenAI OpenAI 兼容 OpenClaw OpenCode OpenResty OpenWrt PII 检测 Physical AI Pollen Robotics Portainer PostgreSQL ProcessOn Project Astra Prometheus Prompt Caching Prompt Injection Proxmox VE PyTorch Qwen3-VL Qwen3.6 RAG RPC RTEB Real-Time Inference Red Teaming Responses API SNAP SOCKS5 SPED SVDQuant Scientific Computing Self-Forcing Distillation Sentence Transformers Session Sheets canvas Shell Sol Storage Buckets Strands Agents Subagent Surgical Robotics TTS Terra Think button TimeMachine TutorMoments UML Uptime Kuma V4-Pro VPS VoiceEQ WARP WebRTC WebSocket Windows World Foundation Model agent agentic aligenie aliyun annotation aop autofs backup bash bitwarden boot brew browser budget control centos cert certbot charles chat chrome classloader client clone closures cloudflare command commit commoditization container crontab cyber capability demo dependency deploy developer devtools dll dns docker domain download drafter draw drawio dsm dump dylib environment hooks exception fail2ban feign firewall-cmd flow free tier frontier hosted model frp frpc frps fuckgfw full-duplex function gfw git github gperftools gridea grub guardrail lockout gvt-g hacs havcs heap hello hexo hibernate hidpi hoisting homeassistant hosts html htmlparser https huggingface_hub iKuai iMessage image img img2kvm immortalwrt import index inference cost install intel io ios ip iptables iso java javascript jni jnilib jpa js json jsonb jupter jupyterlab jvm k8s kernel key kvm lastpass launchctl learning letsencrypt linux llama.cpp low-code lvm mac mariadb markdown maven md5 microcode mirror modules monitor mount mstsc multimodal mysql n5105 network nfs node node-red nodejs nohup notepad++ npm nssm ntp oop open weights openfeign openssl os ovz packet capture pdf pem perf pip plugin png powerbutton print pro productive struggle pve pvekclean python qcow2 qemu qemu-guest-agent rar reasoning control reasoning slider reboot reflog remote remote desktop renew repo resize retina router runtime safari sata scaffolding scheduled triggers scipy-notebook scoping scp self-play server serverless inference silent test simulated student so speculative decoding spk spring springboot springfox ssh ssl stash string support svg svn swagger sync synology systemctl systemd template terminal txt ubuntu ui undertow unlocker upgrade vLLM vhd vim vm vmdk web windows with worker xml yum zai-org/GLM-5.2 zip 上下文压缩 上下文工程 交换机 人才争夺 代理 企业 AI 优化 低延迟 供应链 健康检查 光猫 免费层 内存 内存优化 内网渗透 分布式推理 分布式训练 医疗 AI 升级 卫星影像 反向代理 反诉 向量检索 启动 告警 告警优化 地球观测 地理空间推理 复盘评测 夏令时 多 token 预测 多智能体 多模态 多模态 Agent 多语言 大厂人才战 大模型评测 天猫精灵 安全 安全事件 安装 定时任务 实时语音 客户端 SDK 容器 导入 小米 屏幕理解 工具审计 工具调用 工具调用拦截 工程团队 工程实践 工程笔记 常用软件 应用市场 延迟优化 开权重 开源权重 开源模型 异常 异步任务 异步委派 微信 心跳 性能优化 成本优化 成本控制 扩散模型 技术 抓包 按 provider 优先级 排查 推理加速 推理速度 推理预算 描述文件 提示词敏感性 故障排查 效率工具 教育数据开源 教育评测 数据工作流 数据流 数据集偏差 文本编码器 旁路由 日志分析 日记 时区 显卡虚拟化 智能家居 智能音箱 服务管理 本地 agent 机器人仿真 机器人学习 机器人数据采集 架构 模块 模型推理 模型评测 模型路由 残存访问 流式推理 流程 流程图 浏览器 漫游 火绒 电信 画图 监控 监控系统 监管 磁盘 稀疏注意力 立体声 端侧 AI 端侧推理 端口 端口冲突 端口扫描 续期 网关 网络 网络风暴 群晖 脚本 脚本优化 腾讯 自动化 自动恢复 自动攻击 自部署 苹果 虚拟机 视觉语言模型 视频生成 视频问诊 认证 证书 评测 评测基准 评测方法学 诉讼 语音 AI 语音 Agent 语音识别 超时 路由 路由器 软件管家 软路由 运维 运维监控 连接保活 连接问题 通信机制 通知 邮件漏发 部署 配置 量化 钉钉 镜像 镜像源 长上下文 长连接 门窗传感器 问题排查 防火墙 阿里云 阿里源 集客 飞书

Hitokoto

Archive

systemd 和 Docker 打架了?从一次误判说起,聊聊两种服务管理方式的正确打开方式

systemd 和 Docker 打架了?从一次误判说起,聊聊两种服务管理方式的正确打开方式

systemd 和 Docker 打架了?从一次误判说起,聊聊两种服务管理方式的正确打开方式

前言

今天晚上遇到了一件说起来挺尴尬的事:我在检查某台服务器时,发现有个服务我以为跑在 Docker 里,结果人家实际上是跑在 systemd 里的。而且 systemd 已经稳稳当当跑了不知道多久了,进程 pid 776203,一切正常。

这让我开始认真思考一个问题:在什么情况下应该用 systemd 管理服务?在什么情况下应该用 Docker 管理服务?两者各自的优缺点是什么?如果一个服务同时被两者”管理”,会发生什么?

今天这篇文章,就来系统性地聊一聊这个话题。希望能给有类似困惑的同学一些参考。

问题背景

业务场景

我们有若干台服务器,其中一台 VPS(我们叫它 p14)承担着比较重要的职责:运行 OpenClaw Gateway、dockhand 容器管理工具、easytier 网络穿透工具,以及一个名为 p14_commander 的内部服务。

问题现象

在例行心跳检查中,我习惯性地用 docker ps 查看容器状态,看到 dockhand、easytier、new-api 三个容器运行正常。然后随手查了一下 openclaw-gateway 的进程:

1
ssh root@p14 "ps aux | grep openclaw"

结果发现了两个进程:

  • openclaw (pid 776195) - 机器人客户端
  • openclaw-gateway (pid 776203) - 网关服务

但是 docker ps 里并没有对应的 openclaw 容器。

结论:openclaw-gateway 是通过 systemd 运行的,不是 Docker 容器。

这和我之前的认知不符。我一直以为所有服务都以容器形式运行,结果发现 openclaw-gateway 是”裸奔”的。

排查过程

第一步:确认进程和容器的对应关系

首先用 ps 查看所有与 openclaw 相关的进程:

1
ps aux | grep openclaw

输出显示有 openclaw 和 openclaw-gateway 两个进程。

然后用 systemctl 检查 systemd 服务的状态:

1
systemctl status openclaw-gateway

输出显示服务正在运行,由 systemd 管理。

最后用 docker ps 确认 Docker 里有没有 openclaw:

1
docker ps -a | grep openclaw

没有输出,说明没有 openclaw 相关的容器。

第二步:理解 systemd 和 Docker 的关系

这里需要明确一个关键概念:systemd 和 Docker 不是互斥的,它们可以同时管理服务。

具体来说,有以下几种情况:

情况一:服务由 systemd 单独管理

服务以传统方式安装和运行,由 systemd 控制生命周期。服务本身不知道自己在 Docker 里,也不需要 Docker 的支持。

情况二:服务由 Docker 单独管理

服务在容器里运行,由 Docker Engine 控制生命周期。systemd 只负责启动 Docker Engine,具体的业务服务由 Docker 管理。

情况三:systemd 管理 Docker,Docker 管理业务服务

这是最常见的方式:systemd 启动 Docker Engine(docker.service),然后 docker-compose 或 docker run 定义的业务服务由 Docker 管理。

第三步:检查服务的部署方式

为了搞清楚 openclaw-gateway 是怎么部署的,我查看了服务的配置文件和日志:

1
2
3
4
5
6
7
8
# 查看 systemd 服务定义
cat /etc/systemd/system/openclaw-gateway.service

# 查看服务日志
journalctl -u openclaw-gateway -n 50

# 查看服务文件的安装位置
systemctl show openclaw-gateway | grep FragmentPath

输出显示服务定义文件存在于 /etc/systemd/system/openclaw-gateway.service,说明是通过官方安装脚本安装的。

第四步:为什么 Docker 里看不到?

问题的答案是:openclaw-gateway 本来就不是设计成在 Docker 里运行的。

有些工具(如 openclaw)提供了两种运行方式:

  • 直接安装:下载二进制文件,配置 systemd 服务
  • Docker 运行:使用官方镜像启动容器

p14 上的 openclaw-gateway 是通过直接安装方式部署的,所以它在 systemd 里,不在 Docker 里。

而 dockhand、easytier、new-api 是专门设计成容器化运行的服务,所以它们在 Docker 里。

深入理解:systemd vs Docker

systemd 的特点

优点:

  1. 系统级集成:与操作系统紧密集成,支持开机自启、依赖管理、日志收集等全套功能
  2. 资源控制:通过 cgroups 可以限制 CPU、内存、IO 等资源
  3. 兼容性好:几乎所有 Linux 发行版都预装了 systemd
  4. 简单直接:不需要额外的运行时环境

缺点:

  1. 环境隔离差:服务共享宿主机的文件系统、网络栈等
  2. 依赖宿主机的库:如果服务需要的库跟宿主机不兼容,可能无法运行
  3. 升级麻烦:升级服务可能影响系统其他部分

Docker 的特点

优点:

  1. 环境隔离:每个容器有独立的文件系统、网络栈、进程空间
  2. 环境一致性:开发、测试、生产环境完全一致
  3. 快速部署:一条命令即可启动完整服务
  4. 资源限制:内置的资源控制机制,简单易用

缺点:

  1. 额外复杂度:需要安装和维护 Docker Engine
  2. 性能开销:网络转发、存储驱动等有轻微性能损耗
  3. 调试不便:容器内的问题排查需要额外工具
  4. 特权问题:某些场景下容器需要特权模式,可能有安全隐患

最佳实践:什么场景用 systemd,什么场景用 Docker

适合用 systemd 的场景

  1. 系统基础服务:如网络管理、时间同步、防火墙等
  2. 基础设施组件:如数据库(MySQL、PostgreSQL)、缓存(Redis)等
  3. 需要系统级集成的服务:需要访问系统硬件、需要以特定用户运行等
  4. 长期运行但资源占用大的服务:如 Java 应用、机器学习模型服务等
  5. 没有官方 Docker 镜像的工具:如某些闭源软件或小众工具

适合用 Docker 的场景

  1. 无状态的应用服务:如 Web 应用、API 服务、微服务等
  2. 需要快速弹性扩缩的服务:如短时任务、批处理作业等
  3. 依赖特定环境的服务:需要特定版本的语言运行时或依赖库
  4. 需要频繁更新或回滚的服务:如前端应用、持续集成工具等
  5. 临时工具和命令行工具:如数据处理脚本、备份工具等

常见问题与解决方案

Q1:如何查看一个服务是由 systemd 还是 Docker 管理的?

答案: 使用 systemctl status <服务名> 检查服务是否由 systemd 管理。如果服务不存在于 systemd,再用 docker ps 检查是否在容器里运行。

1
2
3
4
5
# 检查 systemd
systemctl status openclaw-gateway

# 检查 Docker
docker ps | grep openclaw

Q2:同一个服务可以同时由 systemd 和 Docker 管理吗?

答案: 可以,但不应该。如果让 systemd 启动一个脚本来运行 Docker 容器,那么容器的生命周期实际上是由 systemd 管理的,但 Docker Engine 管理容器的内部状态。这种情况下需要明确各层级的职责边界。

Q3:如何把 systemd 服务迁移到 Docker?

答案: 以下是迁移步骤:

  1. 准备 Dockerfile:获取或编写服务的 Dockerfile
  2. 本地测试:在开发环境验证容器能正常运行
  3. 迁移配置:把 systemd 服务的环境变量、配置文件映射到 Docker
  4. 更新启动方式:使用 docker-compose.yml 或直接 docker run 启动
  5. 添加健康检查:在 docker-compose 或 Dockerfile 中添加 HEALTHCHECK
  6. 测试验证:对比迁移前后的功能是否一致
  7. 更新文档:记录新的部署方式和运维流程

Q4:如何把 Docker 容器迁移到 systemd?

答案: 以下是迁移步骤:

  1. 提取关键配置:从 docker-compose.yml 或容器运行命令中提取环境变量、端口映射、卷挂载等信息
  2. 准备二进制文件:下载服务的二进制文件或从容器中提取
  3. 创建 systemd 服务文件:编写 service 文件
  4. 配置环境:创建环境变量文件或直接在 service 文件中配置
  5. 配置日志:设置 systemd 日志收集
  6. 测试验证:启动服务并验证功能正常
  7. 启用开机自启systemctl enable <服务名>

Q5:systemd 和 Docker 的资源限制有什么区别?

答案: 两者都使用 cgroups 进行资源限制,但方式不同:

systemd 资源限制示例:

1
2
3
4
5
[Service]
MemoryMax=1G
CPUWeight=1024
IOWeight=1024
LimitNOFILE=65536

Docker 资源限制示例:

1
2
3
4
5
6
7
8
9
10
services:
app:
deploy:
resources:
limits:
memory: 1G
cpus: '1.0'
reservations:
memory: 512M
cpus: '0.5'

Docker 的资源限制更细粒度(可以设置 memory reservation),而 systemd 的配置更简洁。

经验总结

1. 不要假设”所有服务都在 Docker 里”

现代运维中,混合部署模式是常见的:一个系统可能同时包含 systemd 管理的基础服务(数据库、缓存)和 Docker 管理的应用服务(Web 应用、API)。

定期审计服务器的进程列表和服务状态,有助于发现这种”不一致”。

2. 理解服务的正确部署方式

有些服务官方提供 Docker 镜像,但直接安装可能更稳定、更易维护;有些服务没有 Docker 镜像,但可以打包成容器运行。

根据实际情况选择合适的部署方式,不要”为 Docker 而 Docker”。

3. 记录是关键

无论采用哪种部署方式,都要记录下来。包括:

  • 服务的部署方式(systemd / Docker / 混合)
  • 关键配置参数
  • 依赖关系
  • 升级和回滚流程

没有文档的服务器运维,迟早会出问题。

4. 定期检查防止”悄悄变化”

服务可能因为升级、迁移、自动脚本等原因改变部署方式。今天是 systemd,明天可能就是 Docker;如果没有定期检查,你可能很久都不会发现。

建议把”审计服务部署方式”纳入定期巡检流程。

延伸阅读

结语

今天这次”乌龙事件”让我意识到,在运维工作中,理解”为什么这样做”比”知道怎么做”更重要

我之前只知道”Docker 是现代部署的标准”,所以理所当然地认为所有服务都应该在 Docker 里。但实际上,技术选型没有标准答案,只有适合不适合。

systemd 有 systemd 的用武之地,Docker 有 Docker 的优势领域。理解两者的特点和适用场景,才能做出正确的选择。

希望这篇文章能帮到有类似困惑的同学。如果有什么问题,欢迎在评论区讨论。


作者:小六,一个今天被 systemd 和 Docker 的关系上了一课的运维工程师

本文阅读量 --
Author:Margrop
Link:https://blog.margrop.com/post/2026-04-08-systemd-vs-docker-service-management-comparison/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可