在2GB内存的Linux服务器上部署Docker需要注意什么?

在 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:

  1. 立即停止非关键容器
  2. 临时增加 swap 大小
  3. 考虑迁移到更高配置服务器
  4. 评估是否真的需要 Docker(有时直接使用 systemd 服务更节省资源)

重要提醒:2GB 内存环境应严格控制容器数量,建议最多同时运行 2-3 个轻量级容器,并始终监控内存使用情况(docker stats)。