如何从标准Debian 12系统迁移到Debian 12 Docker容器环境?

从标准 Debian 12 系统迁移到 Docker 容器环境需要将现有系统配置和应用容器化。以下是详细步骤:

1. 分析现有系统

# 查看已安装的软件包
dpkg --get-selections > packages.list

# 查看运行的服务
systemctl list-units --type=service --state=running

# 查看挂载点和存储配置
df -h
cat /etc/fstab

# 查看网络配置
ip addr show
cat /etc/network/interfaces

2. 创建 Dockerfile

# 基于 Debian 12 官方镜像
FROM debian:bookworm-slim

# 设置时区和语言环境
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 更新并安装基础软件
RUN apt-get update && apt-get install -y 
    apt-transport-https 
    ca-certificates 
    curl 
    gnupg 
    lsb-release 
    && rm -rf /var/lib/apt/lists/*

# 从 packages.list 安装软件包
COPY packages.list /tmp/
RUN xargs -a /tmp/packages.list apt-get install -y

# 复制配置文件
COPY config/ /etc/

# 复制应用数据
COPY app/ /var/lib/app/

# 暴露端口
EXPOSE 80 443

# 设置启动命令
CMD ["/usr/sbin/init"]

3. 迁移配置和数据

# 创建迁移目录结构
mkdir -p docker-migration/{config,app,scripts}

# 备份重要配置文件
cp -r /etc/{apache2,nginx,mysql,ssh} docker-migration/config/

# 备份应用数据
cp -r /var/www docker-migration/app/
cp -r /var/lib/mysql docker-migration/app/  # 注意:数据库需要特殊处理

# 创建迁移脚本
cat > docker-migration/scripts/migrate.sh << 'EOF'
#!/bin/bash
# 停止服务
systemctl stop apache2 nginx mysql

# 导出数据库
mysqldump -u root -p --all-databases > /backup/alldb.sql

# 备份用户和权限
mysql -u root -p -e "SELECT user, host FROM mysql.user" > /backup/mysql_users.txt
EOF

4. 数据库特殊处理

# 使用官方 MySQL 镜像或 MariaDB
FROM mysql:8.0

# 或使用 Docker Compose 多容器方案
# docker-compose.yml
version: '3.8'
services:
  app:
    build: .
    depends_on:
      - db
    volumes:
      - ./app:/var/www
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: your_password
    volumes:
      - mysql_data:/var/lib/mysql
      - ./backup:/docker-entrypoint-initdb.d

5. 构建和测试容器

# 构建镜像
docker build -t debian12-migrated .

# 运行测试容器
docker run -it --rm 
  --name test-migration 
  -p 8080:80 
  -v $(pwd)/app:/var/www 
  debian12-migrated

# 使用 Docker Compose(推荐)
docker-compose up -d

6. 网络和存储配置

# 创建 Docker 网络
docker network create app-network

# 使用命名卷持久化数据
docker volume create mysql_data
docker volume create app_data

# 运行带持久化存储的容器
docker run -d 
  --name myapp 
  --network app-network 
  -p 80:80 
  -v app_data:/var/www 
  -v mysql_data:/var/lib/mysql 
  debian12-migrated

7. 迁移策略建议

逐步迁移方案

  1. 阶段1:非关键服务容器化
  2. 阶段2:数据库容器化(先主从复制)
  3. 阶段3:核心应用容器化
  4. 阶段4:完全切换

反向XX配置

# Nginx 作为反向XX
upstream docker_app {
    server 172.17.0.2:80;
    server 172.17.0.3:80;
}

server {
    listen 80;
    location / {
        proxy_pass http://docker_app;
    }
}

8. 监控和日志

# 查看容器日志
docker logs -f container_name

# 使用 Docker 监控
docker stats
docker inspect container_name

# 配置日志驱动
docker run --log-driver=json-file --log-opt max-size=10m

9. 自动化脚本示例

#!/bin/bash
# auto-migrate.sh

# 导出系统状态
export_system_state() {
    dpkg --get-selections > packages.list
    crontab -l > cron.backup
    systemctl list-unit-files --type=service > services.list
}

# 生成 Docker Compose 配置
generate_docker_compose() {
    cat > docker-compose.yml << EOF
version: '3.8'
services:
  main:
    build: .
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./config:/etc/config
      - ./app:/var/app
    restart: unless-stopped
EOF
}

# 主流程
main() {
    echo "开始迁移 Debian 12 到 Docker..."
    export_system_state
    generate_docker_compose
    docker-compose build
    echo "迁移完成!使用 'docker-compose up -d' 启动"
}

重要注意事项

  1. 权限问题:容器内使用非 root 用户运行服务
  2. 数据持久化:重要数据必须使用 volumes 或 bind mounts
  3. 网络配置:合理规划容器网络和端口映射
  4. 安全加固:限制容器权限,使用安全配置
  5. 备份原系统:迁移前完整备份原系统

这种迁移需要根据具体应用调整,建议先在测试环境验证。

云服务器