1. 统信UOS离线环境Docker部署概述在企业内网或特殊网络环境下服务器往往无法直接连接互联网进行软件安装。统信UOS作为国产操作系统的代表其离线环境下的Docker部署成为很多运维人员面临的难题。我曾经在一个金融项目上遇到过类似场景整个机房完全隔离外网但业务又急需容器化部署当时花了三天时间才摸索出完整的解决方案。离线部署的核心思路很简单把需要在线获取的资源全部本地化。这包括系统依赖包、Docker安装包以及后续可能用到的容器镜像。实际操作中会遇到几个关键挑战如何构建可靠的本地YUM源、如何处理依赖关系、如何验证安装结果。下面我就结合多次实战经验带你一步步解决这些问题。2. 构建本地YUM源2.1 准备离线安装介质首先需要获取统信UOS的安装ISO文件这个通常可以从官方渠道获得。我建议使用与目标系统完全匹配的版本避免兼容性问题。将ISO文件挂载到临时目录mkdir -p /mnt/iso mount -o loop UOS-20-1060e-x86_64.iso /mnt/iso关键是要提取出ISO中的软件仓库目录。以统信UOS 1060e为例主要需要以下内容/AppStream基础软件仓库/BaseOS/Packages核心软件包/BaseOS/repodata仓库元数据2.2 配置本地仓库创建本地仓库目录结构建议放在/mnt/yum下便于统一管理mkdir -p /mnt/yum/{AppStream,BaseOS} cp -r /mnt/iso/AppStream/* /mnt/yum/AppStream/ cp -r /mnt/iso/BaseOS/Packages /mnt/yum/BaseOS/ cp -r /mnt/iso/BaseOS/repodata /mnt/yum/BaseOS/然后配置YUM源文件先清理原有配置cd /etc/yum.repos.d rm -f *.repo新建UnionTechOS.repo文件内容如下[AppStream] nameAppStream baseurlfile:///mnt/yum/AppStream enabled1 gpgcheck0 [BaseOS] nameBaseOS baseurlfile:///mnt/yum/BaseOS enabled1 gpgcheck02.3 验证仓库可用性执行以下命令更新缓存yum clean all yum makecache可以通过搜索测试仓库是否生效yum search container-selinux如果能看到相关软件包列表说明本地源配置成功。这里有个常见坑点有时候repodata元数据不完整会导致缓存失败这时需要重新生成仓库元数据可以使用createrepo工具。3. Docker离线安装实战3.1 处理系统依赖Docker运行需要几个关键依赖包通过本地源安装yum install -y container-selinux iptables libcgroup libseccomp特别提醒container-selinux的版本需要与系统内核匹配如果安装失败可能需要手动下载特定版本的rpm包。我曾经遇到过因为SELinux策略不兼容导致Docker无法启动的情况后来通过以下命令临时解决setenforce 0 sed -i s/SELINUXenforcing/SELINUXpermissive/g /etc/selinux/config3.2 获取Docker安装包在内网环境下需要提前下载好Docker的rpm安装包。虽然统信UOS基于CentOS但实测发现直接使用CentOS 8的Docker包兼容性最好。主要需要三个核心组件containerd.io容器运行时docker-ceDocker引擎docker-ce-cli命令行工具可以通过有网络的环境下载这些包例如使用wgetwget https://download.docker.com/linux/centos/8/x86_64/stable/Packages/containerd.io-1.6.21-3.1.el8.x86_64.rpm wget https://download.docker.com/linux/centos/8/x86_64/stable/Packages/docker-ce-24.0.5-1.el8.x86_64.rpm wget https://download.docker.com/linux/centos/8/x86_64/stable/Packages/docker-ce-cli-24.0.5-1.el8.x86_64.rpm建议下载较新的稳定版但不要追求最新版本避免兼容性问题。下载完成后将rpm包拷贝到目标服务器的/tmp目录下。3.3 安装Docker引擎按顺序安装三个rpm包cd /tmp rpm -ivh containerd.io-*.rpm rpm -ivh docker-ce-cli-*.rpm rpm -ivh docker-ce-*.rpm安装过程中可能会提示缺少依赖这时需要从本地YUM源中先安装这些依赖。常见的有libcgrouplibseccompiptables-legacy安装完成后启动Docker服务systemctl enable docker systemctl start docker验证安装是否成功docker version docker info如果能看到版本信息且没有报错说明Docker已经正常运行。第一次启动可能会比较慢因为需要初始化存储驱动等组件。4. 离线环境下的容器管理4.1 加载本地镜像在没有互联网连接的情况下可以通过以下方式获取镜像在其他机器上pull镜像后导出docker pull alpine:latest docker save -o alpine.tar alpine:latest将tar包拷贝到内网服务器后加载docker load -i alpine.tar验证镜像是否可用docker run --rm alpine echo Hello from offline Docker4.2 搭建本地镜像仓库对于长期使用的离线环境建议搭建本地registrydocker run -d -p 5000:5000 --restartalways --name registry registry:2然后可以将常用镜像推送到这个本地仓库docker tag alpine:latest localhost:5000/alpine:latest docker push localhost:5000/alpine:latest其他机器使用时需要修改Docker配置添加insecure-registrymkdir -p /etc/docker cat /etc/docker/daemon.json EOF { insecure-registries: [your-server-ip:5000] } EOF systemctl restart docker4.3 常见问题排查存储驱动问题如果使用devicemapper存储驱动需要预先创建thin pool。建议改用overlay2echo {storage-driver: overlay2} /etc/docker/daemon.jsoncgroup问题如果启动时报cgroup相关错误需要检查cgroup是否挂载mount -t cgroup -o none,namesystemd cgroup /sys/fs/cgroup/systemd防火墙冲突统信UOS的防火墙可能会阻止Docker网络可以临时关闭systemctl stop firewalld systemctl disable firewalld5. 生产环境优化建议在真实的离线生产环境中还需要考虑以下几个关键点资源隔离通过cgroups限制容器资源使用量避免单个容器耗尽系统资源。例如限制内存docker run -it --memory512m alpine sh日志管理配置日志轮转和大小限制防止日志占满磁盘cat /etc/docker/daemon.json EOF { log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 } } EOF数据持久化对于数据库等有状态服务务必使用volume或bind mountdocker run -d -v /data/mysql:/var/lib/mysql mysql:5.7安全加固虽然在内网环境仍建议定期更新镜像和基础软件使用非root用户运行容器限制容器能力--cap-drop最后提醒每次系统更新后建议重新测试Docker的兼容性。我曾经遇到过内核升级后导致容器网络异常的情况回滚内核版本后才解决。对于关键业务系统一定要先在测试环境验证。
统信UOS离线环境Docker部署全攻略:从本地源配置到容器启动
1. 统信UOS离线环境Docker部署概述在企业内网或特殊网络环境下服务器往往无法直接连接互联网进行软件安装。统信UOS作为国产操作系统的代表其离线环境下的Docker部署成为很多运维人员面临的难题。我曾经在一个金融项目上遇到过类似场景整个机房完全隔离外网但业务又急需容器化部署当时花了三天时间才摸索出完整的解决方案。离线部署的核心思路很简单把需要在线获取的资源全部本地化。这包括系统依赖包、Docker安装包以及后续可能用到的容器镜像。实际操作中会遇到几个关键挑战如何构建可靠的本地YUM源、如何处理依赖关系、如何验证安装结果。下面我就结合多次实战经验带你一步步解决这些问题。2. 构建本地YUM源2.1 准备离线安装介质首先需要获取统信UOS的安装ISO文件这个通常可以从官方渠道获得。我建议使用与目标系统完全匹配的版本避免兼容性问题。将ISO文件挂载到临时目录mkdir -p /mnt/iso mount -o loop UOS-20-1060e-x86_64.iso /mnt/iso关键是要提取出ISO中的软件仓库目录。以统信UOS 1060e为例主要需要以下内容/AppStream基础软件仓库/BaseOS/Packages核心软件包/BaseOS/repodata仓库元数据2.2 配置本地仓库创建本地仓库目录结构建议放在/mnt/yum下便于统一管理mkdir -p /mnt/yum/{AppStream,BaseOS} cp -r /mnt/iso/AppStream/* /mnt/yum/AppStream/ cp -r /mnt/iso/BaseOS/Packages /mnt/yum/BaseOS/ cp -r /mnt/iso/BaseOS/repodata /mnt/yum/BaseOS/然后配置YUM源文件先清理原有配置cd /etc/yum.repos.d rm -f *.repo新建UnionTechOS.repo文件内容如下[AppStream] nameAppStream baseurlfile:///mnt/yum/AppStream enabled1 gpgcheck0 [BaseOS] nameBaseOS baseurlfile:///mnt/yum/BaseOS enabled1 gpgcheck02.3 验证仓库可用性执行以下命令更新缓存yum clean all yum makecache可以通过搜索测试仓库是否生效yum search container-selinux如果能看到相关软件包列表说明本地源配置成功。这里有个常见坑点有时候repodata元数据不完整会导致缓存失败这时需要重新生成仓库元数据可以使用createrepo工具。3. Docker离线安装实战3.1 处理系统依赖Docker运行需要几个关键依赖包通过本地源安装yum install -y container-selinux iptables libcgroup libseccomp特别提醒container-selinux的版本需要与系统内核匹配如果安装失败可能需要手动下载特定版本的rpm包。我曾经遇到过因为SELinux策略不兼容导致Docker无法启动的情况后来通过以下命令临时解决setenforce 0 sed -i s/SELINUXenforcing/SELINUXpermissive/g /etc/selinux/config3.2 获取Docker安装包在内网环境下需要提前下载好Docker的rpm安装包。虽然统信UOS基于CentOS但实测发现直接使用CentOS 8的Docker包兼容性最好。主要需要三个核心组件containerd.io容器运行时docker-ceDocker引擎docker-ce-cli命令行工具可以通过有网络的环境下载这些包例如使用wgetwget https://download.docker.com/linux/centos/8/x86_64/stable/Packages/containerd.io-1.6.21-3.1.el8.x86_64.rpm wget https://download.docker.com/linux/centos/8/x86_64/stable/Packages/docker-ce-24.0.5-1.el8.x86_64.rpm wget https://download.docker.com/linux/centos/8/x86_64/stable/Packages/docker-ce-cli-24.0.5-1.el8.x86_64.rpm建议下载较新的稳定版但不要追求最新版本避免兼容性问题。下载完成后将rpm包拷贝到目标服务器的/tmp目录下。3.3 安装Docker引擎按顺序安装三个rpm包cd /tmp rpm -ivh containerd.io-*.rpm rpm -ivh docker-ce-cli-*.rpm rpm -ivh docker-ce-*.rpm安装过程中可能会提示缺少依赖这时需要从本地YUM源中先安装这些依赖。常见的有libcgrouplibseccompiptables-legacy安装完成后启动Docker服务systemctl enable docker systemctl start docker验证安装是否成功docker version docker info如果能看到版本信息且没有报错说明Docker已经正常运行。第一次启动可能会比较慢因为需要初始化存储驱动等组件。4. 离线环境下的容器管理4.1 加载本地镜像在没有互联网连接的情况下可以通过以下方式获取镜像在其他机器上pull镜像后导出docker pull alpine:latest docker save -o alpine.tar alpine:latest将tar包拷贝到内网服务器后加载docker load -i alpine.tar验证镜像是否可用docker run --rm alpine echo Hello from offline Docker4.2 搭建本地镜像仓库对于长期使用的离线环境建议搭建本地registrydocker run -d -p 5000:5000 --restartalways --name registry registry:2然后可以将常用镜像推送到这个本地仓库docker tag alpine:latest localhost:5000/alpine:latest docker push localhost:5000/alpine:latest其他机器使用时需要修改Docker配置添加insecure-registrymkdir -p /etc/docker cat /etc/docker/daemon.json EOF { insecure-registries: [your-server-ip:5000] } EOF systemctl restart docker4.3 常见问题排查存储驱动问题如果使用devicemapper存储驱动需要预先创建thin pool。建议改用overlay2echo {storage-driver: overlay2} /etc/docker/daemon.jsoncgroup问题如果启动时报cgroup相关错误需要检查cgroup是否挂载mount -t cgroup -o none,namesystemd cgroup /sys/fs/cgroup/systemd防火墙冲突统信UOS的防火墙可能会阻止Docker网络可以临时关闭systemctl stop firewalld systemctl disable firewalld5. 生产环境优化建议在真实的离线生产环境中还需要考虑以下几个关键点资源隔离通过cgroups限制容器资源使用量避免单个容器耗尽系统资源。例如限制内存docker run -it --memory512m alpine sh日志管理配置日志轮转和大小限制防止日志占满磁盘cat /etc/docker/daemon.json EOF { log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 } } EOF数据持久化对于数据库等有状态服务务必使用volume或bind mountdocker run -d -v /data/mysql:/var/lib/mysql mysql:5.7安全加固虽然在内网环境仍建议定期更新镜像和基础软件使用非root用户运行容器限制容器能力--cap-drop最后提醒每次系统更新后建议重新测试Docker的兼容性。我曾经遇到过内核升级后导致容器网络异常的情况回滚内核版本后才解决。对于关键业务系统一定要先在测试环境验证。