<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>容器化 on lategege 的技术博客</title><link>https://lategege.com/tags/%E5%AE%B9%E5%99%A8%E5%8C%96/</link><description>Recent content in 容器化 on lategege 的技术博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Sun, 19 Apr 2026 05:40:00 +0000</lastBuildDate><atom:link href="https://lategege.com/tags/%E5%AE%B9%E5%99%A8%E5%8C%96/index.xml" rel="self" type="application/rss+xml"/><item><title>记一次模型服务Docker容器化的经历</title><link>https://lategege.com/p/%E8%AE%B0%E4%B8%80%E6%AC%A1%E6%A8%A1%E5%9E%8B%E6%9C%8D%E5%8A%A1docker%E5%AE%B9%E5%99%A8%E5%8C%96%E7%9A%84%E7%BB%8F%E5%8E%86/</link><pubDate>Sun, 19 Apr 2026 05:40:00 +0000</pubDate><guid>https://lategege.com/p/%E8%AE%B0%E4%B8%80%E6%AC%A1%E6%A8%A1%E5%9E%8B%E6%9C%8D%E5%8A%A1docker%E5%AE%B9%E5%99%A8%E5%8C%96%E7%9A%84%E7%BB%8F%E5%8E%86/</guid><description>&lt;p&gt;今天本来只想干一件事：把我的一些本地模型服务做成 Docker 容器，方便后续迁移。&lt;br&gt;
结果真动手之后，才发现这事没想象中那么顺。&lt;/p&gt;
&lt;p&gt;我的环境本身就比较复杂：在已经虚拟化的 Ubuntu 系统里又装了 vGPU 驱动。&lt;br&gt;
没容器化之前，服务靠一堆本地依赖勉强维持，尤其是 CUDA 相关版本兼容，环境非常脆弱。&lt;br&gt;
很多时候只要某个依赖被动过一点，模型服务就可能直接起不来。&lt;br&gt;
也正因为这样，才有了这次“必须容器化”的经历。&lt;/p&gt;
&lt;h2 id="先说结果"&gt;先说结果
&lt;/h2&gt;&lt;p&gt;这次改造最直接的好处，不是“跑起来了”这么简单，而是把原来松散、脆弱、难迁移的运行环境，整理成了一套可复用、可打包、可迁移的方案。&lt;/p&gt;
&lt;p&gt;另外，镜像体积降下来以后，构建和推送都稳了不少，失败重试的情况也少了很多。&lt;/p&gt;
&lt;h2 id="这次主要踩了哪些坑"&gt;这次主要踩了哪些坑
&lt;/h2&gt;&lt;p&gt;一开始我以为主要问题会出在容器编排，结果真正花时间的是四件事：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;构建内容太大&lt;/strong&gt;&lt;br&gt;
一些不该进镜像的大文件被带进去了，导致镜像层太大，推送压力一下子变重。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;GPU 运行环境太敏感&lt;/strong&gt;&lt;br&gt;
vGPU、CUDA、推理运行时之间版本关系很挑，稍微不合适，就会在运行阶段出问题。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;超时参数看着配了，但实际没按预期生效&lt;/strong&gt;&lt;br&gt;
特别是带 &lt;code&gt;sudo&lt;/code&gt; 的执行方式，环境变量继承经常和想的不一样，排查时很容易被带偏。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;docker push&lt;/code&gt; 一直 retry，问题不在本地客户端&lt;/strong&gt;&lt;br&gt;
当时 push 过程反复重试，我先后查了本地环境、网关和 Nexus 服务。&lt;br&gt;
最后定位到网关缓存空间被占满，导致上传过程异常。&lt;br&gt;
处理方式是：网关对 Docker 仓库推送这条路径不做缓存，问题随即消失。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="后来是怎么理顺的"&gt;后来是怎么理顺的
&lt;/h2&gt;&lt;p&gt;真正有效的做法，是不再只盯某条命令对不对，而是把问题分开处理：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;先把构建内容里不需要的东西排出去，减小镜像层&lt;/li&gt;
&lt;li&gt;再把 GPU 依赖版本固定住，尽量不要来回变&lt;/li&gt;
&lt;li&gt;推送失败时，客户端参数和服务端上传问题分开看&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样以后，很多以前混在一起的问题都能看清楚，不会一上来就全盘怀疑。&lt;/p&gt;
&lt;h2 id="这次做完之后留下了什么"&gt;这次做完之后，留下了什么
&lt;/h2&gt;&lt;p&gt;这轮工作最有价值的地方，不是一次过关，而是留下了后面还能继续用的经验：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一套更轻量的镜像做法&lt;/li&gt;
&lt;li&gt;一组更稳的 GPU 运行环境组合&lt;/li&gt;
&lt;li&gt;一种更清楚的排查顺序（构建、运行、推送分开处理）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="后面准备怎么做"&gt;后面准备怎么做
&lt;/h2&gt;&lt;p&gt;接下来我会坚持几件事：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;默认优先用瘦身后的镜像方案&lt;/li&gt;
&lt;li&gt;控制单层大小，尽量避免超大层带来的上传不稳&lt;/li&gt;
&lt;li&gt;再遇到推送异常，第一时间看上传相关日志，不只盯客户端&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;这次最大的收获，是把“能跑”变成了“能迁移、能复用、出问题也知道怎么查”。&lt;br&gt;
对模型服务这种依赖敏感的场景来说，容器化不只是方便部署，更是为了把风险控制在自己能处理的范围里。&lt;/p&gt;</description></item></channel></rss>