docker Docker 服务迁移完整指南 Bin Lian 2025-10-10 2025-12-18 Teslamate 迁移
lsky兰空图床搭建
lskypro迁移
目录
迁移策略判断方法
TeslaMate 迁移指南
Lsky Pro 图床迁移指南
常用命令详解
故障排查
迁移策略判断方法
如何判断使用哪种迁移方式
方法1:直接复制目录(最简单快速)
适用条件(必须同时满足):
✅ 使用本地目录挂载 (bind mount)
✅ 配置中使用绝对路径,如:
1 volumes: - /path/to/data:/var/lib/data
✅ 数据量较大,目录结构简单
✅ 新旧服务器可以保持相同的目录结构
典型例子:Lsky Pro
1 2 3 volumes: - /media/bsuperstation/biG_RU/docker_data/lsky-bed/lsky_data:/var/www/html - /media/bsuperstation/biG_RU/docker_data/lsky-bed/db:/var/lib/mysql
方法2:数据库导出 (pg_dump/mysqldump)
适用条件(满足任一):
✅ 使用 Docker volumes (命名卷)
✅ 需要跨版本迁移数据库
✅ 需要选择性恢复数据
✅ 数据库与应用可以分离备份
典型例子:TeslaMate
1 2 volumes: - teslamate-db:/var/lib/postgresql/data
方法3:Volume 备份(最完整)
适用条件:
✅ 使用 Docker volumes
✅ 需要完整保留所有数据和配置
✅ 有多个相互依赖的 volumes
✅ 包含二进制数据或复杂配置
快速判断流程图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 检查 docker-compose.yml 中的 volumes 配置 │ ├─ 是绝对路径 (/xxx/xxx) ────────────────► 方法1:直接复制目录 │ ├─ 是命名卷 (volume_name:) │ │ │ ├─ 仅数据库服务 ─────────────────────► 方法2:数据库导出 │ │ │ └─ 多个服务/复杂依赖 ────────────────► 方法3:Volume 备份 │ └─ 混合使用 └─ 分别处理: - 绝对路径部分 ────► 直接复制 - 命名卷部分 ──────► Volume备份或数据库导出
三种方式对比
特性
直接复制目录
数据库导出
Volume备份
速度
⭐⭐⭐ 最快
⭐⭐ 中等
⭐ 较慢
操作难度
⭐⭐⭐ 最简单
⭐⭐ 中等
⭐ 较复杂
数据完整性
⭐⭐ 中等
⭐⭐⭐ 最好
⭐⭐⭐ 最好
版本兼容
⭐ 可能有问题
⭐⭐⭐ 最好
⭐⭐ 中等
选择性恢复
❌ 不支持
✅ 支持
❌ 不支持
跨平台
⚠️ 需注意
✅ 无问题
⚠️ 需注意
TeslaMate 迁移指南
服务架构分析
1 2 3 4 5 6 volumes: teslamate-db: teslamate-grafana-data: mosquitto-conf: mosquitto-data:
推荐策略: 数据库导出 (pg_dump) + Volume 备份混合方案
方法1:使用 pg_dump(推荐用于数据库)
1. 旧服务器备份
1 2 3 4 5 6 7 8 9 10 11 12 13 14 cd /path/to/teslamatedocker compose stop docker compose exec -T database pg_dump -U teslamate teslamate | gzip > teslamate-db-backup.sql.gz tar czf teslamate-config-backup.tar.gz docker-compose.yml .env import/ ls -lh *.tar.gz *.sql.gz
命令详解:
docker compose exec - 在运行中的容器内执行命令
-T - 禁用伪终端(必须!否则输出会包含控制字符导致备份损坏)
database - docker-compose.yml 中的服务名
pg_dump - PostgreSQL 备份工具
-U teslamate - 使用 teslamate 用户
teslamate - 数据库名
| gzip - 通过管道压缩输出
> file.sql.gz - 保存到文件
2. 传输到新服务器
1 2 3 4 5 6 7 8 rsync -avzP teslamate-*.gz user@new-server:/opt/teslamate/
3. 新服务器恢复
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 cd /opt/teslamatetar xzf teslamate-config-backup.tar.gz docker compose up -d database echo "等待数据库启动..." sleep 15docker compose exec database pg_isready -U teslamate gunzip -c teslamate-db-backup.sql.gz | docker compose exec -T database psql -U teslamate teslamate docker compose up -d docker compose logs -f
恢复命令详解:
gunzip -c - 解压并输出到标准输出(-c 保留原文件)
psql - PostgreSQL 命令行客户端
-U teslamate teslamate - 用户名和数据库名
4. 验证迁移结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 docker compose ps docker compose exec database psql -U teslamate teslamate -c " SELECT 'cars' as table_name, COUNT(*) as count FROM cars UNION ALL SELECT 'drives', COUNT(*) FROM drives UNION ALL SELECT 'charging_processes', COUNT(*) FROM charging_processes UNION ALL SELECT 'positions', COUNT(*) FROM positions ORDER BY table_name; " docker compose exec database psql -U teslamate teslamate -c " SELECT MAX(start_date) as latest_drive FROM drives; "
方法2:Volume 完整备份(备选方案)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 docker compose stop docker run --rm \ -v teslamate_teslamate-db:/source \ -v $(pwd ):/backup \ alpine tar czf /backup/volume-teslamate-db.tar.gz -C /source . docker run --rm \ -v teslamate_teslamate-grafana-data:/source \ -v $(pwd ):/backup \ alpine tar czf /backup/volume-grafana-data.tar.gz -C /source . docker volume create teslamate_teslamate-db docker run --rm \ -v teslamate_teslamate-db:/target \ -v $(pwd ):/backup \ alpine tar xzf /backup/volume-teslamate-db.tar.gz -C /target docker compose up -d
自动化备份脚本
创建 backup-teslamate.sh:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #!/bin/bash BACKUP_DIR="./teslamate-backups" DATE=$(date +%Y%m%d_%H%M%S) mkdir -p $BACKUP_DIR echo "=== 开始备份 TeslaMate ===" echo "备份时间: $DATE " echo "备份数据库..." docker compose exec -T database pg_dump -U teslamate teslamate | \ gzip > $BACKUP_DIR /teslamate-db-$DATE .sql.gz echo "备份配置..." tar czf $BACKUP_DIR /teslamate-config-$DATE .tar.gz \ docker-compose.yml .env import/ echo "=== 备份完成 ===" ls -lh $BACKUP_DIR /*-$DATE .*
创建 restore-teslamate.sh:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #!/bin/bash if [ -z "$1 " ]; then echo "用法: ./restore-teslamate.sh <数据库备份文件.sql.gz>" exit 1 fi DB_BACKUP=$1 echo "=== 开始恢复 TeslaMate ===" docker compose up -d database sleep 15docker compose exec database pg_isready -U teslamate echo "恢复数据库..." gunzip -c $DB_BACKUP | docker compose exec -T database psql -U teslamate teslamate docker compose up -d echo "=== 恢复完成 ===" docker compose ps
使用方法:
1 2 3 4 5 6 7 8 9 10 chmod +x backup-teslamate.sh./backup-teslamate.sh rsync -avzP teslamate-backups/ user@new-server:/opt/teslamate/backups/ chmod +x restore-teslamate.sh./restore-teslamate.sh backups/teslamate-db-20250110_120000.sql.gz
重要注意事项
ENCRYPTION_KEY 必须保持一致
这个密钥用于加密 Tesla API tokens
如果更改,将无法解密现有的 tokens
位置:docker-compose.yml 或 .env 文件
数据库密码保持一致
确保 DATABASE_PASS 和 POSTGRES_PASSWORD 相同
端口检查
1 2 sudo netstat -tulpn | grep -E ':(4000|3000)'
防火墙设置
1 2 3 sudo ufw allow 4000/tcpsudo ufw allow 3000/tcp
Lsky Pro 图床迁移指南
服务架构分析
1 2 3 4 volumes: - /media/bsuperstation/biG_RU/docker_data/lsky-bed/lsky_data:/var/www/html - /media/bsuperstation/biG_RU/docker_data/lsky-bed/db:/var/lib/mysql
推荐策略: 直接复制目录(最简单)
方法1:直接复制整个目录(推荐)
1. 旧服务器备份
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 cd /path/to/lsky-prodocker compose stop cd /media/bsuperstation/biG_RU/docker_datatar czf lsky-bed-backup-$(date +%Y%m%d).tar.gz lsky-bed/ cd /path/to/lsky-protar czf lsky-config-$(date +%Y%m%d).tar.gz docker-compose.yml .env ls -lh *.tar.gz
2. 传输到新服务器
1 2 3 4 5 6 7 rsync -avzP lsky-bed-backup-*.tar.gz lsky-config-*.tar.gz \ user@new-server:/tmp/ scp lsky-bed-backup-*.tar.gz lsky-config-*.tar.gz \ user@new-server:/tmp/
3. 新服务器恢复
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 sudo mkdir -p /media/bsuperstation/biG_RU/docker_datacd /media/bsuperstation/biG_RU/docker_datasudo tar xzf /tmp/lsky-bed-backup-*.tar.gzmkdir -p /opt/lsky-procd /opt/lsky-protar xzf /tmp/lsky-config-*.tar.gz docker compose up -d docker compose logs -f
4. 验证迁移结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 docker compose ps docker compose exec mysql mysql -u lsky-bs -pbl27855 -e " USE lsky-bs; SHOW TABLES; SELECT COUNT(*) as image_count FROM images; SELECT COUNT(*) as user_count FROM users; " find /media/bsuperstation/biG_RU/docker_data/lsky-bed/lsky_data -type f | wc -l curl -I http://localhost:7676
方法2:分别备份(更灵活)
1 2 3 4 5 6 7 8 9 docker compose stop tar czf lsky-data-$(date +%Y%m%d).tar.gz \ -C /media/bsuperstation/biG_RU/docker_data/lsky-bed lsky_data/ tar czf lsky-db-$(date +%Y%m%d).tar.gz \ -C /media/bsuperstation/biG_RU/docker_data/lsky-bed db/
方法3:使用 mysqldump(数据库单独备份)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 docker compose exec -T mysql mysqldump \ -u lsky-bs \ -pbl27855 \ lsky-bs | gzip > lsky-db-$(date +%Y%m%d).sql.gz docker compose up -d mysql sleep 20gunzip -c lsky-db-*.sql.gz | \ docker compose exec -T mysql mysql -u lsky-bs -pbl27855 lsky-bs docker compose up -d
mysqldump 命令详解:
mysqldump - MySQL 数据库备份工具
-u lsky-bs - 用户名
-pbl27855 - 密码(注意:-p 和密码之间没有空格 )
lsky-bs - 数据库名
自动化脚本
创建 backup-lsky.sh:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #!/bin/bash BACKUP_DIR="./lsky-backups" DATE=$(date +%Y%m%d_%H%M%S) DATA_PATH="/media/bsuperstation/biG_RU/docker_data/lsky-bed" mkdir -p $BACKUP_DIR echo "=== 开始备份 Lsky Pro ===" echo "备份时间: $DATE " docker compose stop echo "备份应用数据..." tar czf $BACKUP_DIR /lsky-data-$DATE .tar.gz -C $DATA_PATH lsky_data/ echo "备份数据库..." tar czf $BACKUP_DIR /lsky-db-$DATE .tar.gz -C $DATA_PATH db/ echo "备份配置..." tar czf $BACKUP_DIR /lsky-config-$DATE .tar.gz docker-compose.yml .env 2>/dev/null || \ tar czf $BACKUP_DIR /lsky-config-$DATE .tar.gz docker-compose.yml echo "=== 备份完成 ===" ls -lh $BACKUP_DIR /*-$DATE .*
创建 restore-lsky.sh:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 #!/bin/bash if [ "$# " -lt 1 ]; then echo "用法: ./restore-lsky.sh <备份时间戳>" echo "示例: ./restore-lsky.sh 20250110_143000" exit 1 fi TIMESTAMP=$1 DATA_PATH="/media/bsuperstation/biG_RU/docker_data/lsky-bed" echo "=== 开始恢复 Lsky Pro ===" sudo mkdir -p $DATA_PATH echo "恢复应用数据..." sudo tar xzf lsky-backups/lsky-data-$TIMESTAMP .tar.gz -C $DATA_PATH /echo "恢复数据库..." sudo tar xzf lsky-backups/lsky-db-$TIMESTAMP .tar.gz -C $DATA_PATH /echo "恢复配置..." tar xzf lsky-backups/lsky-config-$TIMESTAMP .tar.gz docker compose up -d echo "=== 恢复完成 ===" docker compose ps
路径调整(不同目录结构)
如果新服务器需要使用不同的路径:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 NEW_PATH="/opt/docker/lsky" sudo mkdir -p $NEW_PATH sudo tar xzf /tmp/lsky-bed-backup-*.tar.gz \ --strip-components=1 -C $NEW_PATH / vim docker-compose.yml
重要注意事项
权限问题
1 2 3 4 5 6 sudo chown -R www-data:www-data $DATA_PATH /lsky_datasudo chown -R 999:999 $DATA_PATH /db ls -ln $DATA_PATH /
密码安全
配置中的密码是明文(bl27855)
迁移后建议修改密码
1 2 3 4 5 6 docker compose exec mysql mysql -u root -pbl27855 -e " ALTER USER 'lsky-bs'@'%' IDENTIFIED BY 'new_secure_password'; FLUSH PRIVILEGES; "
图片链接更新
如果域名或 IP 变更,需要在 Lsky Pro 后台更新
路径:管理后台 → 系统设置 → 站点设置
端口冲突检查
1 sudo netstat -tulpn | grep 7676
常用命令详解
Docker Compose 命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 docker compose up -d docker compose stop docker compose restart docker compose ps docker compose logs -f docker compose logs -f service_name docker compose logs --tail =100 docker compose exec service_name bash docker compose exec service_name sh docker compose down -v
PostgreSQL 相关命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 docker compose exec -T database pg_dump -U username dbname > backup.sql docker compose exec -T database pg_dump -U username dbname | gzip > backup.sql.gz docker compose exec -T database psql -U username dbname < backup.sql gunzip -c backup.sql.gz | docker compose exec -T database psql -U username dbname docker compose exec database pg_isready -U username docker compose exec database psql -U username dbname \l \dt \d table \q
MySQL 相关命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 docker compose exec -T mysql mysqldump -u username -ppassword dbname > backup.sql docker compose exec -T mysql mysqldump -u username -ppassword dbname | gzip > backup.sql.gz docker compose exec -T mysql mysql -u username -ppassword dbname < backup.sql gunzip -c backup.sql.gz | docker compose exec -T mysql mysql -u username -ppassword dbname docker compose exec mysql mysqladmin ping -u root -ppassword docker compose exec mysql mysql -u username -ppassword SHOW DATABASES; USE database_name; SHOW TABLES; DESCRIBE table_name; EXIT;
Volume 操作命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 docker volume ls docker volume inspect volume_name docker volume create volume_name docker volume rm volume_name docker run --rm \ -v volume_name:/source \ -v $(pwd ):/backup \ alpine tar czf /backup/volume-backup.tar.gz -C /source . docker volume create volume_name docker run --rm \ -v volume_name:/target \ -v $(pwd ):/backup \ alpine tar xzf /backup/volume-backup.tar.gz -C /target
文件传输命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 rsync -avzP source_file user@host:/destination/ scp file.tar.gz user@host:/destination/ scp -r directory/ user@host:/destination/ rsync -avzP user@host:/source/ ./local/ scp user@host:/source/file.tar.gz ./
故障排查
常见问题及解决方案
1. 容器无法启动
1 2 3 4 5 6 7 8 9 10 11 docker compose logs service_name docker compose ps -a docker compose up docker compose config
2. 数据库连接失败
1 2 3 4 5 6 7 8 9 docker compose exec database pg_isready -U username docker compose exec mysql mysqladmin ping -u root -ppassword docker compose exec service_name ping database docker compose exec service_name env | grep DATABASE
3. 端口被占用
1 2 3 4 5 6 7 8 9 10 sudo netstat -tulpn | grep :PORTsudo lsof -i :PORTsudo kill -9 PIDports: - "NEW_PORT:80"
4. 权限问题
1 2 3 4 5 6 7 8 9 10 11 ls -la /path/to/datasudo chown -R user:group /path/to/datasudo chmod -R 755 /path/to/datadocker compose exec service_name id
5. Volume 数据丢失
1 2 3 4 5 6 7 8 docker volume ls | grep volume_name docker volume inspect volume_name docker run --rm -v volume_name:/data alpine ls -la /data
6. 备份文件损坏
1 2 3 4 5 6 7 8 9 10 11 gzip -t backup.sql.gz tar -tzf backup.tar.gz ls -lh backup.*docker compose exec -T database pg_dump ... docker compose exec database pg_dump ...
7. 数据恢复后数据不完整
1 2 3 4 5 6 7 8 9 10 11 ls -lh backup.*docker compose exec database psql -U user dbname -c "SELECT COUNT(*) FROM table;" docker compose exec database psql -U user dbname -c "SELECT COUNT(*) FROM table;"
网络诊断
1 2 3 4 5 6 7 8 9 docker compose exec service1 ping service2 docker network ls docker network inspect network_name docker compose exec service_name curl -I https://example.com
磁盘空间检查
1 2 3 4 5 6 7 8 9 df -hdocker system df docker system prune -a docker volume prune
最佳实践
1. 定期备份
1 2 3 4 5 6 7 8 crontab -e 0 2 * * * /path/to/backup-script.sh 0 3 * * 0 /path/to/backup-script.sh
2. 备份文件管理
1 2 3 4 find ./backups/ -name "*.tar.gz" -mtime +7 -delete