从标准 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:非关键服务容器化
- 阶段2:数据库容器化(先主从复制)
- 阶段3:核心应用容器化
- 阶段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' 启动"
}
重要注意事项
- 权限问题:容器内使用非 root 用户运行服务
- 数据持久化:重要数据必须使用 volumes 或 bind mounts
- 网络配置:合理规划容器网络和端口映射
- 安全加固:限制容器权限,使用安全配置
- 备份原系统:迁移前完整备份原系统
这种迁移需要根据具体应用调整,建议先在测试环境验证。
CLOUD技术笔记