跳到主要内容

手动将旧系统制作成Docker镜像

本教程将详细介绍如何将RedHat 4.9等旧系统手动制作成Docker镜像,包括系统提取、环境适配、镜像构建等完整流程。

🎯 学习目标

  • 理解传统系统到容器的迁移原理
  • 掌握旧系统文件系统提取方法
  • 学会Docker镜像的分层构建技术
  • 了解系统兼容性问题的解决方案

📋 前置条件

系统要求

  • Linux操作系统(推荐Ubuntu 20.04+)
  • Docker环境已安装并运行
  • 至少10GB可用磁盘空间
  • 管理员权限

必需工具

# 安装必要工具
sudo apt update
sudo apt install -y debootstrap rsync squashfs-tools
sudo apt install -y docker.io docker-compose
sudo systemctl start docker
sudo systemctl enable docker

# 添加用户到docker组
sudo usermod -aG docker $USER
newgrp docker

🔧 详细步骤

步骤1: 准备旧系统环境

方法1: 从ISO镜像提取

# 创建工作目录
mkdir -p ~/legacy-docker/rhel4.9
cd ~/legacy-docker

# 下载RedHat 4.9 ISO(示例)
wget http://archive.example.com/rhel-4.9-server-i386-dvd.iso

# 挂载ISO
sudo mkdir -p /mnt/rhel-iso
sudo mount -o loop rhel-4.9-server-i386-dvd.iso /mnt/rhel-iso

# 提取系统文件
mkdir -p rhel4.9-rootfs
sudo rsync -av /mnt/rhel-iso/Server/ rhel4.9-rootfs/

# 卸载ISO
sudo umount /mnt/rhel-iso

方法2: 从现有系统复制

# 如果有运行的旧系统,使用tar打包
ssh root@old-system "tar -czpf - --one-file-system --exclude=/proc/* --exclude=/sys/* --exclude=/dev/* --exclude=/run/* --exclude=/tmp/* /" > rhel4.9-rootfs.tar.gz

# 解压到工作目录
mkdir -p rhel4.9-rootfs
tar -xzf rhel4.9-rootfs.tar.gz -C rhel4.9-rootfs --strip-components=1

步骤2: 清理和优化根文件系统

cd rhel4.9-rootfs

# 清理不必要的文件
sudo rm -rf var/cache/yum/*
sudo rm -rf var/log/*
sudo rm -rf tmp/*
sudo rm -rf root/.bash_history

# 创建必要的目录结构
sudo mkdir -p dev proc sys mnt
sudo mkdir -p var/lib/rpm
sudo mkdir -p etc/yum.repos.d

# 创建基础设备文件
sudo mknod dev/null c 1 3
sudo mknod dev/zero c 1 5
sudo mknod dev/random c 1 8
sudo mknod dev/urandom c 1 9
sudo chmod 666 dev/null dev/zero dev/random dev/urandom

步骤3: 修复系统配置

修复网络配置

# 创建网络配置
cat > etc/sysconfig/network << EOF
NETWORKING=yes
HOSTNAME=legacy-container
EOF

# 创建ifcfg-eth0
cat > etc/sysconfig/network-scripts/ifcfg-eth0 << EOF
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
EOF

修复init系统

# 创建简化的init脚本
cat > sbin/init << 'EOF'
#!/bin/bash
# 简化的init脚本用于容器环境

# 挂载必要的文件系统
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t devtmpfs devtmpfs /dev

# 启动基本服务
echo "Starting legacy system in container..."
exec /bin/bash
EOF

chmod +x sbin/init

修复YUM配置

# 创建YUM配置文件
cat > etc/yum.conf << EOF
[main]
cachedir=/var/cache/yum
debuglevel=2
logfile=/var/log/yum.log
pkgpolicy=newest
distroverpkg=redhat-release
tolerant=1
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
metadata_expire=1800
EOF

# 创建仓库配置(使用CentOS 4的归档源)
cat > etc/yum.repos.d/centos4.repo << EOF
[base]
name=CentOS-4 - Base
baseurl=http://vault.centos.org/4.9/os/i386/
gpgcheck=0
enabled=1

[updates]
name=CentOS-4 - Updates
baseurl=http://vault.centos.org/4.9/updates/i386/
gpgcheck=0
enabled=1
EOF

步骤4: 创建Dockerfile

cd ~/legacy-docker
cat > Dockerfile << 'EOF'
FROM scratch

# 设置标签
LABEL maintainer="your-email@example.com"
LABEL description="RedHat 4.9 Legacy System Container"
LABEL version="1.0"

# 复制根文件系统
COPY rhel4.9-rootfs/ /

# 设置环境变量
ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ENV TERM=xterm
ENV LANG=C
ENV LC_ALL=C

# 设置工作目录
WORKDIR /root

# 暴露常用端口
EXPOSE 22 80 443

# 设置默认命令
CMD ["/sbin/init"]
EOF

步骤5: 构建Docker镜像

# 构建基础镜像
docker build -t legacy/rhel4.9:base .

# 验证镜像
docker images | grep legacy/rhel4.9

# 测试运行容器
docker run -it --rm legacy/rhel4.9:base /bin/bash

步骤6: 优化和定制镜像

创建优化版本的Dockerfile

cat > Dockerfile.optimized << 'EOF'
FROM legacy/rhel4.9:base

# 更新系统包管理器
RUN yum update -y && \
yum clean all

# 安装常用工具
RUN yum install -y \
wget \
curl \
vim-minimal \
tar \
gzip && \
yum clean all

# 创建启动脚本
RUN echo '#!/bin/bash' > /start.sh && \
echo 'echo "Starting Legacy RedHat 4.9 Container..."' >> /start.sh && \
echo 'exec "$@"' >> /start.sh && \
chmod +x /start.sh

# 设置入口点
ENTRYPOINT ["/start.sh"]
CMD ["/bin/bash"]
EOF

# 构建优化版本
docker build -f Dockerfile.optimized -t legacy/rhel4.9:latest .

步骤7: 创建Docker Compose配置

cat > docker-compose.yml << 'EOF'
version: '3.8'

services:
rhel4.9:
image: legacy/rhel4.9:latest
container_name: rhel4.9-legacy
hostname: rhel4.9-container
stdin_open: true
tty: true
volumes:
- ./data:/root/data
- ./logs:/var/log
ports:
- "2222:22"
- "8080:80"
environment:
- TERM=xterm
networks:
- legacy-net

networks:
legacy-net:
driver: bridge
EOF

✅ 验证和测试

基础功能测试

# 启动容器
docker run -it --name rhel4.9-test legacy/rhel4.9:latest

# 在容器内测试
rpm -qa # 检查安装的包
uname -a # 检查系统信息
cat /etc/redhat-release # 检查版本信息
service network status # 检查网络服务

网络连接测试

# 启动带网络的容器
docker run -it --rm -p 8080:80 legacy/rhel4.9:latest

# 在容器内启动简单HTTP服务
python -m SimpleHTTPServer 80 &
# 或者
echo "Hello from RHEL 4.9" > /var/www/html/index.html
httpd -D FOREGROUND

数据持久化测试

# 创建数据卷
docker volume create rhel4.9-data

# 使用数据卷启动容器
docker run -it --rm -v rhel4.9-data:/root/data legacy/rhel4.9:latest

# 在容器内创建文件
echo "Test data" > /root/data/test.txt

# 重新启动容器验证数据持久性
docker run -it --rm -v rhel4.9-data:/root/data legacy/rhel4.9:latest cat /root/data/test.txt

🚀 高级技巧

多阶段构建优化

# 第一阶段:提取和清理
FROM alpine:3.18 as extractor
WORKDIR /extract
COPY rhel4.9-rootfs.tar.gz .
RUN tar -xzf rhel4.9-rootfs.tar.gz && \
rm -rf var/cache/yum/* var/log/* tmp/* && \
rm -f root/.bash_history

# 第二阶段:构建最终镜像
FROM scratch
LABEL maintainer="your-email@example.com"
COPY --from=extractor /extract/ /
ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
CMD ["/bin/bash"]

自动化构建脚本

#!/bin/bash
# build-legacy-image.sh

set -e

SYSTEM_NAME="rhel4.9"
SOURCE_ISO="rhel-4.9-server-i386-dvd.iso"
IMAGE_TAG="legacy/${SYSTEM_NAME}:latest"

echo "Building ${SYSTEM_NAME} Docker image..."

# 创建工作目录
mkdir -p ${SYSTEM_NAME}-build
cd ${SYSTEM_NAME}-build

# 挂载ISO并提取文件
sudo mkdir -p /mnt/iso
sudo mount -o loop ../${SOURCE_ISO} /mnt/iso
sudo rsync -av /mnt/iso/Server/ rootfs/
sudo umount /mnt/iso

# 清理和优化
sudo chown -R $USER:$USER rootfs/
cd rootfs
rm -rf var/cache/yum/* var/log/* tmp/* root/.bash_history

# 返回构建目录
cd ..

# 构建Docker镜像
docker build -t ${IMAGE_TAG} .

echo "Build completed: ${IMAGE_TAG}"

容器监控和管理

# 创建监控脚本
cat > monitor-legacy.sh << 'EOF'
#!/bin/bash

CONTAINER_NAME="rhel4.9-legacy"

# 检查容器状态
docker ps -a --filter name=${CONTAINER_NAME}

# 显示资源使用情况
docker stats --no-stream ${CONTAINER_NAME}

# 显示容器日志
docker logs --tail 50 ${CONTAINER_NAME}
EOF

chmod +x monitor-legacy.sh

⚠️ 注意事项

安全考虑

  1. 旧版本漏洞: 旧系统可能包含已知安全漏洞
  2. 权限管理: 避免在生产环境以root用户运行
  3. 网络隔离: 使用适当的网络策略隔离容器

兼容性问题

  1. glibc版本: 可能需要兼容性库
  2. 系统调用: 某些系统调用在新内核中可能不可用
  3. 架构支持: 注意32位和64位架构兼容性

性能优化

  1. 镜像大小: 使用多阶段构建减小镜像体积
  2. 启动时间: 优化启动脚本和服务
  3. 内存使用: 监控和限制容器资源使用

📚 相关资源

🎉 总结

通过本教程,你已经学会了:

  1. ✅ 从旧系统提取文件系统的方法
  2. ✅ 修复和适配系统配置的技巧
  3. ✅ 构建和优化Docker镜像的流程
  4. ✅ 测试和验证容器功能的方法

这些技能可以应用于:

  • 遗留应用的容器化迁移
  • 开发环境的快速搭建
  • 系统兼容性测试
  • 历史系统的现代化改造

现在你可以将各种旧系统成功转换为现代化的Docker容器了!