【Docker实战 01】低配VPS运行10个核心服务

1核1G 甚至 512MB 的小鸡也能跑十几个服务。本文讲透 OOM Killer、Swap、zRAM、容器内存限制与反代,并推荐一批真·轻量开源应用。

延伸阅读

更多相关攻略推荐:【10刀以内VPS系列 01】年付不到70块钱的便宜VPS,到底能用【IP 地址 05】IPv6-Only VPS + Cloudfla512MB/1GB 小内存 VPS 优化实战:1 美元机器能跑什么 2026 实测:VPS 自托管 Whisper 语音转写——用 fa点几下鼠标就能管服务器:cPanel、宝塔、1Panel 与 Hes

一、先泼盆冷水:1GB 内存到底怎么分的

很多人一看到「1 核 1G」就觉得啥也干不了,其实真不是。一台刚装好系统的 Debian 12,开机啥都不干大概就吃掉 150~250MB 内存,Docker 守护进程(dockerd)本身常驻再占 80~150MB。也就是说,留给你的容器实际有 600MB 上下 的空间。只要肯精打细算,跑 10 个轻量服务完全没问题——但前提是,你得先学会「防饿死」。

低配机最大的敌人不是 CPU,而是 内存耗尽后触发的 OOM Killer(Out Of Memory Killer)。这是 Linux 内核的一个保命机制:当物理内存和 Swap 全被吃光,内核会挑一个「评分最高」的进程直接杀掉,腾出空间保系统不崩。问题来了——它经常挑错人,把你正在用的数据库或者反代干掉,服务就全瘫了。下面三道防线,咱们一道一道布。

有人会问:都 2026 年了,几刀真的够用吗?实测够。拿我个人举例,一台年付 $10 出头的 1 核 1G 机器,常年挂着监控、RSS、笔记、密码库、文件管理器,CPU 长期 5% 以下,内存靠 zRAM 撑到等效 2GB+,半年没重启过。关键在于「架构」而不是「堆配置」:把重活交给 Cloudflare 缓存、把状态外置、给每个容器划清资源红线。下面全按这个思路来。

二、第一道防线:Swap 交换分区(保命底线)

Swap 就是把磁盘划出一块当「虚拟内存」。速度比内存慢几百倍,但有它就不会被 OOM 直接杀。低配小鸡,尤其是 Oracle 免费机、RackNerd 那种年付几刀的,强烈建议开上。1GB 内存就建 1GB 的 Swap,512MB 内存建 1GB 也行。

最干净的做法是用 fallocate 直接预分配一个文件(比 dd 快得多):

sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

确认一下有没有生效:

swapon --show
free -h

光 swapon 只是临时生效,重启就没了。要永久生效,把下面这行写进 /etc/fstab

/swapfile none swap sw 0 0

顺手调一下 vm.swappiness,这个参数决定系统「多乐意用 Swap」。默认是 60(比较积极),低配机建议设成 10,让它尽量先用物理内存,实在不够才换到磁盘,避免频繁读写磁盘导致卡顿:

echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
echo 'vm.vfs_cache_pressure=50' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

三、第二道防线:zRAM 内存压缩(把 1GB 当 2~3GB 用)

Swap 在磁盘上,慢。zRAM 的思路更妙:它在内存里划出一块「压缩区块」,把不常用的数据在内存里压缩存着。典型压缩比能到 2:1 甚至 3:1,等于白送你一倍多可用内存,而且全程在内存里跑,没有磁盘 I/O 抖动,比 Swap 快得多。

在 Debian / Ubuntu 上开 zRAM 最省事,装个 zram-tools 就完事:

sudo apt update
sudo apt install -y zram-tools

编辑配置文件 /etc/default/zramswap,用 zstd 算法、占用 75% 内存、优先级拉满:

ALGO=zstd
PERCENT=75
PRIORITY=100

重启服务让它生效,并刷新所有交换设备:

sudo systemctl restart zramswap
sudo swapoff -a && sudo swapon -a

验证一下(应该能看到 /dev/zram0):

swapon --show
zramctl

经验值:1GB 内存配 PERCENT=75 大约生成 768MB 的 zRAM。压缩不是免费魔法,CPU 也要干活,所以别贪心配到 200% 以上。理想组合是 zRAM + 一个小 Swapfile:平时靠 zRAM 顶,极端情况 Swapfile 兜底。

四、第三道防线:给容器戴上「紧箍咒」

光靠系统层面还不够,你得防止单个容器把内存吃光拖垮全机。两个关键手段:

1)内存上限(memory limit)。docker run 起容器时直接限死:

docker run -d --name uptime-kuma \
  --memory=256m --memory-swap=256m \
  -p 3001:3001 louislam/uptime-kuma:1

注意:--memory-swap--memory 设成一样,意思是禁止这个容器再用 Swap,逼它只在物理内存里活动,保护宿主机更稳。在 docker-compose.yml 里对应写法是:

services:
  uptime-kuma:
    image: louislam/uptime-kuma:1
    mem_limit: 256m
    memswap_limit: 256m

2)oom_score_adj(调 OOM 优先级)。 每个进程在 /proc/<pid>/oom_score_adj 里有个 -1000 到 1000 的评分。值越低越不容易被杀,-1000 代表「永不杀」。把反代、数据库这类关键容器调低,把 RSSHub 这种可重建的调高,OOM 来时内核就会先杀不重要的:

docker run -d --name nginx-proxy \
  --oom-score-adj=-300 \
  -p 80:80 -p 443:443 jc21/nginx-proxy-manager:2

三条防线叠加,你的小鸡基本就告别「半夜被 OOM 干醒」了。

五、端口不够用?一个反代扛所有

10 个服务如果每个都暴露不同端口,域名、证书、防火墙全是噩梦。正确姿势是:只开 80 和 443,前面放一个反向代理,靠域名(SNI / Host 头)把流量分发给后端不同容器。两个主流选择:

Nginx Proxy Manager(NPM,新手友好):带网页后台,点点鼠标就能加站点、自动申请 Let's Encrypt 证书。管理界面在 81 端口,默认账号 admin@example.com / changeme第一次登录务必改密码

services:
  npm:
    image: jc21/nginx-proxy-manager:2
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "81:81"
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    mem_limit: 256m

在后台 Add Proxy Host,填域名、选 http、转发主机填容器名或 docker 内部服务名、端口填容器内部端口(比如 Uptime Kuma 是 3001),SSL 标签页点一下申请证书、勾 Force SSL 即可。

Traefik(高阶、自动化):它本身盯着 Docker 守护进程,你只要在别的容器上贴几个 label,它就自动配好路由和证书,加新服务零手动操作。适合服务经常变动的人:

labels:
  - "traefik.enable=true"
  - "traefik.http.routers.kuma.rule=Host(`status.example.com`)"
  - "traefik.http.routers.kuma.entrypoints=websecure"
  - "traefik.http.routers.kuma.tls.certresolver=letsencrypt"
  - "traefik.http.services.kuma.loadbalancer.server.port=3001"

多域名共用 80/443 的原理就是 SNI:客户端在建立 TLS 连接时就带着想访问的域名,反代据此决定转发给谁,所以一个 IP 能挂无数个站点。

六、真·轻量应用推荐(附内存占用量级)

下面这些是我亲测在 1G 小鸡上能长期稳定跑的,内存都是空闲/典型占用,实际会随使用量涨:

  • Uptime Kuma(监控):~150MB,站点/接口宕机微信钉钉推送,必装。
  • 静态博客 / Hugo / Hexo:~10~30MB,本质就是 Nginx 吐文件,几乎零负担。
  • FreshRSS(RSS 阅读器):~50MB,默认用 SQLite,不用再起数据库容器,省心。
  • RSSHub(RSS 生成器):~150~300MB,纯 Node 抓取,开内存缓存 CACHE_TYPE=memory 减少对源站压力。
  • File Browser(文件管理):~30~50MB,网页版文件管理器,传文件比 SFTP 还顺手。
  • memos(轻笔记):~50~80MB,类 flomo 的碎片化笔记,用 SQLite,超低占用。
  • Vaultwarden(密码库):~10~30MB,Bitwarden 的轻量复刻,强烈推荐。
  • Beszel / Netdata(监控面板):~35~80MB,看整机资源曲线。

算笔账:上面这些加起来空闲也就 600~800MB,配合 zRAM 和 Swap,1GB 小鸡稳稳塞下 10 个。注意别碰 Nextcloud(吃 CPU)、Jellyfin/Plex(要转码)、GitLab(要吃 4G+)、Elasticsearch——这些是低配机杀手。

七、一个 compose 把它们串起来

建一个共享网络,反代和所有后端都连上去,后端不暴露公网端口,只让反代转:

docker network create proxy-net

然后每个服务都加 networks: - proxy-net,反代也连这个网。所有配置、数据目录用 volumebind mount 落盘,比如:

services:
  memos:
    image: neosmemo/memos:stable
    restart: unless-stopped
    mem_limit: 128m
    volumes:
      - ./memos:/var/opt/memos
    networks:
      - proxy-net
networks:
  proxy-net:
    external: true

八、日常维护三件套

  • 看实时占用docker stats 看每个容器吃多少内存,free -h 看整机。
  • 清垃圾docker system prune -f 删掉停止的容器和悬空镜像,省磁盘。
  • 限日志:在 compose 里加 logging: options: max-size: "10m",否则容器日志能把磁盘写爆。

九、别光限内存,CPU 也得管

1 核的 CPU 是另一个隐形瓶颈。如果某个容器疯狂占满单核,其他服务连响应都卡。给容器限 CPU 同样重要:

docker run -d --name rsshub \
  --cpus=0.5 --memory=300m \
  diygod/rsshub:latest

在 compose 里就是:

services:
  rsshub:
    image: diygod/rsshub:latest
    mem_limit: 300m
    cpus: "0.5"

另外几个常被忽视的守护进程调优:把 Docker 默认日志驱动设好上限(全局在 /etc/docker/daemon.json 里加 "log-driver":"json-file","log-opts":{"max-size":"10m","max-file":"3"}),避免日志偷偷吃满磁盘;存储驱动默认 overlay2 就行,别乱改;关掉系统里蓝牙、打印、snapd 这类用不上的后台服务,又省出几十 MB。

十、举个完整的「10 个服务」规划表

别被「10 个」吓到,下面这套是我在一台 RackNerd 1 核 1G 年付机上实测能长期跑的清单,全部走反代、共用 80/443,内存占用合计空闲约 700MB,配合 zRAM 游刃有余:

  • status.example.com → Uptime Kuma(监控,~150MB)
  • blog.example.com → 静态博客 / Nginx(~15MB)
  • rss.example.com → FreshRSS(~50MB)
  • hub.example.com → RSSHub(~250MB)
  • files.example.com → File Browser(~40MB)
  • note.example.com → memos(~60MB)
  • vault.example.com → Vaultwarden(~25MB)
  • mon.example.com → Beszel 监控面板(~40MB)
  • proxy.example.com → Nginx Proxy Manager 后台(~120MB)
  • dl.example.com → AList / 轻量网盘(~50MB)

域名用一条通配符 A 记录 *.example.com 指向 VPS IP 即可,加新服务时反代后台点一下就行,DNS 都不用动。推荐在 Cloudflare 用 DNS-only(灰云)解析,避免被限带宽。

十一、选对机器:哪些小鸡适合这么折腾

不是所有低价 VPS 都适合。优先选 KVM 架构(能自由开 Swap/zRAM,OpenVZ/LXC 往往限制内核模块,zRAM 可能开不了);内存至少 1GB,512MB 也能跑但得把服务砍到 5 个以内。几个适合练手的高性价比选择:RackNerd 年付几刀的 KVM、ColoCrossing 机房多延迟低、CloudCone 按量计费灵活、Oracle Cloud 免费机(2 核 1G/4 核 6G 白嫖但要抢)、Virtono 欧洲节点便宜。年付机记得先把本文三道防线布好再装服务,别等 OOM 了才补救。

最后提醒一句:镜像一律选 alpine / slim 版本(如 nginx:alpine),比 Ubuntu 基础镜像小几十上百 MB;能用 SQLite 就别起 PostgreSQL 容器。低配机的哲学就八个字:轻量、限制、勤清理。照着做,你的几刀小鸡照样能当生产环境用。而且一旦哪天商家涨价或跑路,只要平时把数据卷规规矩矩落盘,换个机器 docker compose up -d 就能满血复活——怎么做到 5 分钟无缝搬家,咱们下一篇接着聊。