☰
30秒跑通最小可用的Memcached容器镜像,撑住生产流量
2026/11/2 10:42:31 网站建设 项目流程

30秒跑通最小可用的Memcached容器镜像,撑住生产流量

【免费下载链接】memcachedmemcached development tree项目地址: https://gitcode.com/gh_mirrors/mem/memcached

做Web后端需要一套轻量的内存KV缓存,又不想手动装编译依赖?用Docker跑memcached是条短路径:仓库自带的官方构建模板让镜像落在15MB级别,本文结束时你手里会有一张能健康检查、内存有上限、非root运行的缓存镜像。

本地5分钟,让Memcached缓存服务先应答

先不解释模板里每行在干嘛,直接跑。构建入口是 devtools/Dockerfile.alpine:

# 源码就在当前目录,构建上下文用 . 即可 docker build -f devtools/Dockerfile.alpine -t memcached:mini .

镜像构建完成后,仓库里的 docker-compose.yml 其实可以直接拿来对比各发行版模板,但你只需要起一个容器:

docker run -d --name mc -p 11211:11211 memcached:mini \ memcached -u memcached -m 64 # 显式指定二进制和参数,原因见下一节第2条

验证是否真的在听11211端口:

# 发一条 stats 并过滤版本号,返回 1.6.x 即通 docker exec mc sh -c "echo stats | nc 127.0.0.1 11211 | grep version"

看到版本号,最小可用版本就成了。下面三个坑,基本人人都会踩到。

非x86平台构建失败,卡在configure那一步

现象:在Apple Silicon或ARM服务器上构建,./configure阶段报错,日志里出现 seccomp 相关字样。

排查:看Dockerfile第二行——模板默认注入了--enable-seccomp。README.md 里写得很清楚,libseccomp 只支持Linux的x86-64,musl环境下也未必有包。

修复:构建时覆盖这个变量,跳过seccomp:

# 去掉 seccomp,换取跨平台可编译 docker build -f devtools/Dockerfile.alpine --build-arg CONFIGURE_OPTS="" \ -t memcached:mini .

容器起来了又立刻退出,日志里全是测试输出

现象:docker run后docker ps里没有这个容器,docker logs刷过一堆测试用例。

排查:devtools/Dockerfile.alpine 末尾的默认命令是CMD make test,官方模板本意是跑测试而不是起服务。

修复:run时把启动命令整个传掉,二进制在镜像里的/src/memcached。另外镜像已切换成 memcached 非root用户运行,-u是降权动作,必须带:

docker run -d --name mc -p 11211:11211 memcached:mini \ memcached -u memcached -m 64

写入几百个key就开始miss,内存却被吃满

现象:压测时命中率直线下跌,get_misses快速上涨。

排查:默认-m只有64MB。看当前内存水位:

# limit_bytes 是当前上限,bytes 是已用内存 docker exec mc sh -c "echo stats | nc 127.0.0.1 11211 | grep -E 'limit_bytes| bytes'"

如果bytes贴着limit_bytes走,说明在持续淘汰旧数据。把启动参数里的-m 64调成你的真实预算,比如-m 512,重启容器即可。

按业务量级叠加配置,能用到好用

跑通只是及格线。下面三组参数不是必选项,按你的量级取用。

QPS上千、长连接客户端多时:默认1024个连接、单线程处理,连接池稍大就会触发拒绝。

# -t 4 用4个线程;-c 10240 顶住连接风暴 memcached -u memcached -m 512 -t 4 -c 10240

不加-c时,超出部分会被拒绝;不加-t时,CPU核数越多浪费越多。

容器有内存配额时:让-m和--memory对齐,让memcached自己主动淘汰,而不是被OOM killer直接杀掉:

services: memcached: build: context: . dockerfile: devtools/Dockerfile.alpine command: [memcached, -u, memcached, -m, "512"] mem_limit: 512m healthcheck: # 非root容器里没有bash,用 sh -c 管道探测存活 test: ["CMD-SHELL", "sh -c 'echo stats | nc 127.0.0.1 11211 | grep version'"] interval: 30s timeout: 3s retries: 3

-m比容器配额大,OOM killer 会杀进程;比配额小太多,又白白浪费内存。

需要观测缓存状态时:镜像里的/src/scripts/自带工具,不用另装:

# display 一次输出内存、命中率、淘汰等核心指标 docker exec mc /src/scripts/memcached-tool 127.0.0.1:11211 display

四个发行版底座,一张表选完

基础镜像构建模板大小量级适用场景
Alpinedevtools/Dockerfile.alpine~15MB默认首选,边缘计算
Debiandevtools/Dockerfile.debian~80MB需要glibc兼容时
Ubuntudevtools/Dockerfile.ubuntu~90MB企业环境统一Ubuntu栈
Fedoradevtools/Dockerfile.fedora~100MB与RHEL生态对齐

默认选Alpine;只有当主机环境强依赖glibc或需要TLS(--enable-tls)时,再换Debian或Ubuntu。

缓存跑稳之后,下一步是搞清淘汰策略和内存分块逻辑,协议细节看 doc/ 目录下的protocol.txt,全部命令行选项查 doc/memcached.1。

【免费下载链接】memcachedmemcached development tree项目地址: https://gitcode.com/gh_mirrors/mem/memcached

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询