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四个发行版底座,一张表选完
| 基础镜像 | 构建模板 | 大小量级 | 适用场景 |
|---|---|---|---|
| Alpine | devtools/Dockerfile.alpine | ~15MB | 默认首选,边缘计算 |
| Debian | devtools/Dockerfile.debian | ~80MB | 需要glibc兼容时 |
| Ubuntu | devtools/Dockerfile.ubuntu | ~90MB | 企业环境统一Ubuntu栈 |
| Fedora | devtools/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),仅供参考