399 lines
8.4 KiB
Markdown
399 lines
8.4 KiB
Markdown
# Docker Image Migration Guide
|
|
|
|
This guide explains how to export your built Docker images, transfer them to another environment, and run them without rebuilding.
|
|
|
|
## Overview
|
|
|
|
The migration process involves:
|
|
1. **Export**: Save built images to tar files
|
|
2. **Transfer**: Copy tar files to target environment
|
|
3. **Import**: Load images on target environment
|
|
4. **Run**: Start services with imported images
|
|
|
|
## Prerequisites
|
|
|
|
### Source Environment (where images are built)
|
|
- Docker installed and running
|
|
- All services built and working
|
|
- Sufficient disk space for image export
|
|
|
|
### Target Environment (where images will run)
|
|
- Docker installed and running
|
|
- Sufficient disk space for image import
|
|
- Network access to source environment (or USB drive)
|
|
|
|
## Step 1: Export Docker Images
|
|
|
|
### 1.1 List Current Images
|
|
|
|
First, check what images you have:
|
|
|
|
```bash
|
|
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.ID}}\t{{.Size}}"
|
|
```
|
|
|
|
You should see images like:
|
|
- `legal-doc-masker-backend-api`
|
|
- `legal-doc-masker-frontend`
|
|
- `legal-doc-masker-mineru-api`
|
|
- `redis:alpine`
|
|
|
|
### 1.2 Export Individual Images
|
|
|
|
Create a directory for exports:
|
|
|
|
```bash
|
|
mkdir -p docker-images-export
|
|
cd docker-images-export
|
|
```
|
|
|
|
Export each image:
|
|
|
|
```bash
|
|
# Export backend image
|
|
docker save legal-doc-masker-backend-api:latest -o backend-api.tar
|
|
|
|
# Export frontend image
|
|
docker save legal-doc-masker-frontend:latest -o frontend.tar
|
|
|
|
# Export mineru image
|
|
docker save legal-doc-masker-mineru-api:latest -o mineru-api.tar
|
|
|
|
# Export redis image (if not using official)
|
|
docker save redis:alpine -o redis.tar
|
|
```
|
|
|
|
### 1.3 Export All Images at Once (Alternative)
|
|
|
|
If you want to export all images in one command:
|
|
|
|
```bash
|
|
# Export all project images
|
|
docker save \
|
|
legal-doc-masker-backend-api:latest \
|
|
legal-doc-masker-frontend:latest \
|
|
legal-doc-masker-mineru-api:latest \
|
|
redis:alpine \
|
|
-o legal-doc-masker-all.tar
|
|
```
|
|
|
|
### 1.4 Verify Export Files
|
|
|
|
Check the exported files:
|
|
|
|
```bash
|
|
ls -lh *.tar
|
|
```
|
|
|
|
You should see files like:
|
|
- `backend-api.tar` (~200-500MB)
|
|
- `frontend.tar` (~100-300MB)
|
|
- `mineru-api.tar` (~1-3GB)
|
|
- `redis.tar` (~30-50MB)
|
|
|
|
## Step 2: Transfer Images
|
|
|
|
### 2.1 Transfer via Network (SCP/RSYNC)
|
|
|
|
```bash
|
|
# Transfer to remote server
|
|
scp *.tar user@remote-server:/path/to/destination/
|
|
|
|
# Or using rsync (more efficient for large files)
|
|
rsync -avz --progress *.tar user@remote-server:/path/to/destination/
|
|
```
|
|
|
|
### 2.2 Transfer via USB Drive
|
|
|
|
```bash
|
|
# Copy to USB drive
|
|
cp *.tar /Volumes/USB_DRIVE/docker-images/
|
|
|
|
# Or create a compressed archive
|
|
tar -czf legal-doc-masker-images.tar.gz *.tar
|
|
cp legal-doc-masker-images.tar.gz /Volumes/USB_DRIVE/
|
|
```
|
|
|
|
### 2.3 Transfer via Cloud Storage
|
|
|
|
```bash
|
|
# Upload to cloud storage (example with AWS S3)
|
|
aws s3 cp *.tar s3://your-bucket/docker-images/
|
|
|
|
# Or using Google Cloud Storage
|
|
gsutil cp *.tar gs://your-bucket/docker-images/
|
|
```
|
|
|
|
## Step 3: Import Images on Target Environment
|
|
|
|
### 3.1 Prepare Target Environment
|
|
|
|
```bash
|
|
# Create directory for images
|
|
mkdir -p docker-images-import
|
|
cd docker-images-import
|
|
|
|
# Copy images from transfer method
|
|
# (SCP, USB, or download from cloud storage)
|
|
```
|
|
|
|
### 3.2 Import Individual Images
|
|
|
|
```bash
|
|
# Import backend image
|
|
docker load -i backend-api.tar
|
|
|
|
# Import frontend image
|
|
docker load -i frontend.tar
|
|
|
|
# Import mineru image
|
|
docker load -i mineru-api.tar
|
|
|
|
# Import redis image
|
|
docker load -i redis.tar
|
|
```
|
|
|
|
### 3.3 Import All Images at Once (if exported together)
|
|
|
|
```bash
|
|
docker load -i legal-doc-masker-all.tar
|
|
```
|
|
|
|
### 3.4 Verify Imported Images
|
|
|
|
```bash
|
|
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.ID}}\t{{.Size}}"
|
|
```
|
|
|
|
## Step 4: Prepare Target Environment
|
|
|
|
### 4.1 Copy Project Files
|
|
|
|
Transfer the following files to target environment:
|
|
|
|
```bash
|
|
# Essential files to copy
|
|
docker-compose.yml
|
|
DOCKER_COMPOSE_README.md
|
|
setup-unified-docker.sh
|
|
|
|
# Environment files (if they exist)
|
|
backend/.env
|
|
frontend/.env
|
|
mineru/.env
|
|
|
|
# Storage directories (if you want to preserve data)
|
|
backend/storage/
|
|
mineru/storage/
|
|
backend/legal_doc_masker.db
|
|
```
|
|
|
|
### 4.2 Create Directory Structure
|
|
|
|
```bash
|
|
# Create necessary directories
|
|
mkdir -p backend/storage
|
|
mkdir -p mineru/storage/uploads
|
|
mkdir -p mineru/storage/processed
|
|
```
|
|
|
|
## Step 5: Run Services
|
|
|
|
### 5.1 Start All Services
|
|
|
|
```bash
|
|
# Start all services using imported images
|
|
docker-compose up -d
|
|
```
|
|
|
|
### 5.2 Verify Services
|
|
|
|
```bash
|
|
# Check service status
|
|
docker-compose ps
|
|
|
|
# Check service logs
|
|
docker-compose logs -f
|
|
```
|
|
|
|
### 5.3 Test Endpoints
|
|
|
|
```bash
|
|
# Test frontend
|
|
curl -I http://localhost:3000
|
|
|
|
# Test backend API
|
|
curl -I http://localhost:8000/api/v1
|
|
|
|
# Test mineru API
|
|
curl -I http://localhost:8001/health
|
|
```
|
|
|
|
## Automation Scripts
|
|
|
|
### Export Script
|
|
|
|
Create `export-images.sh`:
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
|
|
set -e
|
|
|
|
echo "🚀 Exporting Docker Images"
|
|
|
|
# Create export directory
|
|
mkdir -p docker-images-export
|
|
cd docker-images-export
|
|
|
|
# Export images
|
|
echo "📦 Exporting backend-api image..."
|
|
docker save legal-doc-masker-backend-api:latest -o backend-api.tar
|
|
|
|
echo "📦 Exporting frontend image..."
|
|
docker save legal-doc-masker-frontend:latest -o frontend.tar
|
|
|
|
echo "📦 Exporting mineru-api image..."
|
|
docker save legal-doc-masker-mineru-api:latest -o mineru-api.tar
|
|
|
|
echo "📦 Exporting redis image..."
|
|
docker save redis:alpine -o redis.tar
|
|
|
|
# Show file sizes
|
|
echo "📊 Export complete. File sizes:"
|
|
ls -lh *.tar
|
|
|
|
echo "✅ Images exported successfully!"
|
|
```
|
|
|
|
### Import Script
|
|
|
|
Create `import-images.sh`:
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
|
|
set -e
|
|
|
|
echo "🚀 Importing Docker Images"
|
|
|
|
# Check if tar files exist
|
|
if [ ! -f "backend-api.tar" ]; then
|
|
echo "❌ backend-api.tar not found"
|
|
exit 1
|
|
fi
|
|
|
|
# Import images
|
|
echo "📦 Importing backend-api image..."
|
|
docker load -i backend-api.tar
|
|
|
|
echo "📦 Importing frontend image..."
|
|
docker load -i frontend.tar
|
|
|
|
echo "📦 Importing mineru-api image..."
|
|
docker load -i mineru-api.tar
|
|
|
|
echo "📦 Importing redis image..."
|
|
docker load -i redis.tar
|
|
|
|
# Verify imports
|
|
echo "📊 Imported images:"
|
|
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" | grep legal-doc-masker
|
|
|
|
echo "✅ Images imported successfully!"
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Common Issues
|
|
|
|
1. **Image not found during import**
|
|
```bash
|
|
# Check if image exists
|
|
docker images | grep image-name
|
|
|
|
# Re-export if needed
|
|
docker save image-name:tag -o image-name.tar
|
|
```
|
|
|
|
2. **Port conflicts on target environment**
|
|
```bash
|
|
# Check what's using the ports
|
|
lsof -i :8000
|
|
lsof -i :8001
|
|
lsof -i :3000
|
|
|
|
# Modify docker-compose.yml if needed
|
|
ports:
|
|
- "8002:8000" # Change external port
|
|
```
|
|
|
|
3. **Permission issues**
|
|
```bash
|
|
# Fix file permissions
|
|
chmod +x setup-unified-docker.sh
|
|
chmod +x export-images.sh
|
|
chmod +x import-images.sh
|
|
```
|
|
|
|
4. **Storage directory issues**
|
|
```bash
|
|
# Create directories with proper permissions
|
|
sudo mkdir -p backend/storage
|
|
sudo mkdir -p mineru/storage/uploads
|
|
sudo mkdir -p mineru/storage/processed
|
|
sudo chown -R $USER:$USER backend/storage mineru/storage
|
|
```
|
|
|
|
### Performance Optimization
|
|
|
|
1. **Compress images for transfer**
|
|
```bash
|
|
# Compress before transfer
|
|
gzip *.tar
|
|
|
|
# Decompress on target
|
|
gunzip *.tar.gz
|
|
```
|
|
|
|
2. **Use parallel transfer**
|
|
```bash
|
|
# Transfer multiple files in parallel
|
|
parallel scp {} user@server:/path/ ::: *.tar
|
|
```
|
|
|
|
3. **Use Docker registry (alternative)**
|
|
```bash
|
|
# Push to registry
|
|
docker tag legal-doc-masker-backend-api:latest your-registry/backend-api:latest
|
|
docker push your-registry/backend-api:latest
|
|
|
|
# Pull on target
|
|
docker pull your-registry/backend-api:latest
|
|
```
|
|
|
|
## Complete Migration Checklist
|
|
|
|
- [ ] Export all Docker images
|
|
- [ ] Transfer image files to target environment
|
|
- [ ] Transfer project configuration files
|
|
- [ ] Import images on target environment
|
|
- [ ] Create necessary directories
|
|
- [ ] Start services
|
|
- [ ] Verify all services are running
|
|
- [ ] Test all endpoints
|
|
- [ ] Update any environment-specific configurations
|
|
|
|
## Security Considerations
|
|
|
|
1. **Secure transfer**: Use encrypted transfer methods (SCP, SFTP)
|
|
2. **Image verification**: Verify image integrity after transfer
|
|
3. **Environment isolation**: Ensure target environment is properly secured
|
|
4. **Access control**: Limit access to Docker daemon on target environment
|
|
|
|
## Cost Optimization
|
|
|
|
1. **Image size**: Remove unnecessary layers before export
|
|
2. **Compression**: Use compression for large images
|
|
3. **Selective transfer**: Only transfer images you need
|
|
4. **Cleanup**: Remove old images after successful migration |