Docker 跑起来只是第一步。备份、迁移、日志、资源限制——这些日常运维的东西,实际用到了才知道有多重要。
数据备份
Volume 备份
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 天前的旧备份:
#!/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
迁移到另一台服务器
# 旧服务器
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}}"。
日志管理
限制日志大小。这个很重要,不限制的话跑几个月吃满磁盘:
cat > /etc/docker/daemon.json << 'EOF'
{
"log-driver": "json-file",
"log-opts": {
"max-size": "50m",
"max-file": "3"
}
}
EOF
systemctl restart docker每个容器最多 3 个日志文件,每个 50MB。
清理旧日志
for f in $(find /var/lib/docker/containers/ -name "*.log"); do
truncate -s 0 $f
done资源限制
默认容器能吃多少吃多少。Ollama 把内存吃光,MySQL 和 Nginx 也会跟着挂。限制一下:
services:
ollama:
deploy:
resources:
limits:
memory: 8G
cpus: "4"
reservations:
memory: 4G这样即使 Ollama 出问题,也不会把整台机器拖死。
健康检查
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 模型名 删。