在 2GB 内存的 Linux 服务器上部署 Docker 需要格外谨慎,因为 Docker 本身及其运行容器会消耗可观的系统资源。以下是关键注意事项和优化建议:
一、系统层面优化
1. 调整 Swap 分区
# 检查当前 swap
free -h
# 创建或调整 swap(推荐至少 2-4GB)
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
2. 限制 Docker 资源使用
编辑 /etc/docker/daemon.json:
{
"default-runtime": "runc",
"exec-opts": ["native.cgroupdriver=cgroupfs"],
"storage-driver": "overlay2",
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"dns": ["8.8.8.8", "8.8.4.4"]
}
重启 Docker:
sudo systemctl restart docker
二、容器资源限制策略
1. 启动时指定资源限制
# CPU 和内存限制示例
docker run -d --name myapp
--memory="512m"
--memory-swap="768m"
--cpus="0.5"
nginx:alpine
2. 使用 compose 文件统一管理
version: '3.8'
services:
app:
image: your-app:latest
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M
restart: unless-stopped
三、镜像选择与优化
1. 优先使用轻量级镜像
- ✅ 推荐使用:
alpine、slim、distroless版本 - ❌ 避免使用:完整版 Ubuntu/CentOS 镜像
# 示例:使用 Alpine 替代 Ubuntu
docker pull nginx:alpine
# 而不是
docker pull nginx:latest
2. 定期清理未使用资源
# 清理停止容器
docker container prune
# 清理悬空镜像
docker image prune
# 清理所有未使用的镜像、构建缓存等
docker system prune -a
# 定期执行(可加入 cron)
crontab -e
# 添加:0 3 * * * docker system prune -f
四、服务部署建议
1. 单实例原则
- 每个容器只运行一个核心服务
- 避免在一个容器中运行多个进程
2. 优先级排序
将最关键的资源分配给核心应用:
- 数据库:保留 512MB-768MB
- Web 应用:256MB-512MB
- 辅助服务:128MB-256MB
3. 监控告警
安装轻量级监控工具:
# 使用 cAdvisor 监控资源
docker run -d
--name cadvisor
--volume=/:/rootfs:ro
--volume=/var/run:/var/run:ro
--volume=/sys:/sys:ro
--volume=/var/lib/docker/:/var/lib/docker:ro
--pid=host
--privileged=true
google/cadvisor:latest
五、实际部署检查清单
- [ ] 已配置足够 swap 空间(≥2GB)
- [ ] Docker daemon 已设置合理的日志轮转
- [ ] 所有容器都设置了
--memory和--cpus限制 - [ ] 使用了最小化基础镜像(alpine/slim)
- [ ] 配置了自动清理机制
- [ ] 实施了资源监控
- [ ] 避免了在单一容器中运行多个服务
- [ ] 预留了至少 256MB 给操作系统本身
六、应急方案
如果服务器频繁 OOM:
- 立即停止非关键容器
- 临时增加 swap 大小
- 考虑迁移到更高配置服务器
- 评估是否真的需要 Docker(有时直接使用 systemd 服务更节省资源)
重要提醒:2GB 内存环境应严格控制容器数量,建议最多同时运行 2-3 个轻量级容器,并始终监控内存使用情况(docker stats)。
PHPWP博客