Docker 运维实战:备份、迁移、端口映射、日志监控、资源限制

Docker 跑起来只是第一步。备份、迁移、日志、资源限制——这些日常运维的东西,实际用到了才知道有多重要。


数据备份

Volume 备份

BASH
docker run --rm 
  -v ollama_ollama-data:/data 
  -v $(pwd):/backup 
  alpine tar czf /backup/ollama-backup-$(date +%F).tar.gz -C /data .

恢复就是反过来 tar xzf。

compose 文件放 Git

配置文件比数据更重要——没有 compose 文件,连容器都起不来。建议放 Git 仓库里管理。

自动备份脚本

每周定时跑一次,清理 30 天前的旧备份:

BASH
#!/bin/bash
BACKUP_DIR="/data/backups/docker"
mkdir -p $BACKUP_DIR
for vol in $(docker volume ls -q); do
  docker run --rm -v $vol:/data:ro -v $BACKUP_DIR:/backup alpine tar czf /backup/${vol}-$(date +%F).tar.gz -C /data .
done
find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete

加 cron:0 3 * * 0 /usr/local/bin/docker-backup.sh


迁移到另一台服务器

BASH
# 旧服务器
cd /opt/ai-stack
docker compose down
tar czf /tmp/ai-stack.tar.gz /opt/ai-stack
scp /tmp/ai-stack.tar.gz root@新IP:/tmp/

# 新服务器
tar xzf /tmp/ai-stack.tar.gz -C /
curl -fsSL https://get.docker.com | sh
cd /opt/ai-stack && docker compose up -d

模型数据也在 tar 里的话,不需要重新拉。直接能用。


端口映射

只监听本机最安全:127.0.0.1:3000:8080。外面通过 Nginx 反代访问。

冲突排查:ss -tlnp | grep 3000 看哪个进程占了端口。或者 docker ps --format "table {{.Names}}t{{.Ports}}"


日志管理

限制日志大小。这个很重要,不限制的话跑几个月吃满磁盘:

BASH
cat > /etc/docker/daemon.json << 'EOF'
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "50m",
    "max-file": "3"
  }
}
EOF
systemctl restart docker

每个容器最多 3 个日志文件,每个 50MB。

清理旧日志

BASH
for f in $(find /var/lib/docker/containers/ -name "*.log"); do
  truncate -s 0 $f
done

资源限制

默认容器能吃多少吃多少。Ollama 把内存吃光,MySQL 和 Nginx 也会跟着挂。限制一下:

YAML
services:
  ollama:
    deploy:
      resources:
        limits:
          memory: 8G
          cpus: "4"
        reservations:
          memory: 4G

这样即使 Ollama 出问题,也不会把整台机器拖死。


健康检查

YAML
services:
  ollama:
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:11434"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

查看状态:docker ps --format "table {{.Names}}t{{.Status}}"


常用命令

docker stats 看实时资源占用。docker system df 看磁盘使用。

更新服务:docker compose pull && docker compose up -d

清理悬空镜像:docker image prune。慎用 docker system prune -a,会删掉所有不用的镜像。

Ollama 的模型数据在 volume 里,不在 Docker image 里。清理 Docker 镜像不会删模型。模型用 ollama rm 模型名 删。

发表评论