在只有 2GB 内存的 Linux 服务器上运行 Docker,必须采取严格的资源控制策略。以下是经过验证的优化方案:
1. 系统级优化
禁用不必要的服务
# 停止非核心服务
systemctl disable --now bluetooth cups avahi-daemon
# 清理临时文件
rm -rf /tmp/* /var/tmp/*
调整内核参数
# 添加至 /etc/sysctl.conf
vm.swappiness=10
vm.vfs_cache_pressure=50
使用轻量级 init 系统
# 考虑从 systemd 切换到 runit 或 s6(如果适用)
2. Docker 配置优化
修改 Docker 守护进程配置
创建/编辑 /etc/docker/daemon.json:
{
"storage-driver": "overlay2",
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 1024,
"Soft": 1024
}
},
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn"
]
}
重启 Docker 服务:
systemctl daemon-reload
systemctl restart docker
3. 容器资源限制
启动时限制资源
# CPU 限制为 1 核,内存限制为 800MB
docker run -d
--cpus="1.0"
--memory="800m"
--memory-swap="800m"
--pids-limit=50
--restart=unless-stopped
your-image:tag
使用 cgroup 限制
# 设置全局默认限制
docker update --cpus="1.0" --memory="800m" <container_id>
4. 镜像选择与构建
使用最小化基础镜像
# 优先选择 alpine 版本
FROM alpine:3.18
# 或使用 distroless 镜像(无 shell)
FROM gcr.io/distroless/static-debian11
优化 Dockerfile
# 多阶段构建减少最终镜像大小
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
CMD ["node", "index.js"]
5. 监控与维护
实时监控资源使用
# 查看容器资源使用情况
docker stats --no-stream
# 查看特定容器
docker stats container_name
定期清理未使用资源
# 清理停止的容器、悬空镜像、未使用的网络
docker system prune -a --volumes
# 定期执行(建议每周)
cronjob: 0 3 * * 0 docker system prune -f
日志管理
# 限制日志大小防止磁盘占满
docker logs --tail 100 container_name
# 查看日志大小
du -sh /var/lib/docker/containers/*/logs/*.log
6. 替代方案考虑
如果应用确实需要更多资源:
- 使用 Podman:无守护进程,更轻量
- 容器化程度降低:直接运行二进制程序而非容器
- 考虑 VPS 升级:最低 4GB 内存更适合生产环境
7. 性能测试示例
# 测试容器响应时间
time curl http://localhost:8080
# 监控内存峰值
watch -n 1 'docker stats --no-stream | grep container_name'
通过以上优化,2GB 内存的服务器可以稳定运行 1-2 个轻量级容器应用。关键原则是:严格控制每个容器的资源配额,选择最小化镜像,并定期清理无用资源。
CLOUD技术博