尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
用Docker搭建Rocky Linux企业级基础镜像平台,从迁移到实践
以前做 Linux 服务器环境身边人最常问的一句话就是现在 RHEL 兼容环境到底用什么最省心我的第一反应就是 Rocky Linux 配合 Docker 做成基础镜像。我们团队从 CentOS 8 生命周期结束后就逐步切到了 Rocky Linux而把它放进容器里跑比什么虚拟机方案都轻RHEL 生态下的软件包该怎么装还怎么装镜像推到仓库里整个开发团队都能直接用。这篇就聊聊我怎么用 Docker 搭建 Rocky Linux 企业级基础镜像平台适合正在做系统迁移、容器化改造或者想省掉一堆测试虚拟机的朋友。1. 为什么我会把 Rocky Linux 放 Docker而不是直接装虚拟机1.1 先搞清楚 Rocky Linux 和 RHEL 的关系很多刚接触的人会被这几个名字绕晕RHEL、CentOS、CentOS Stream、Rocky Linux。说白了RHELRed Hat Enterprise Linux是红帽的商业企业版系统稳定性没话说但订阅是要花钱的。CentOS 曾经是它的免费重建版很长一段时间里大家都拿它当“免费的 RHEL”用。后来 CentOS 那边出了变故传统 CentOS 8 的支持周期被缩短社区里大量用户开始找替代品Rocky Linux 就是在这个背景下接棒的。它由 CentOS 创始人之一 Gregory Kurtzer 发起目标很直接做一个与 RHEL 完全二进制兼容的社区版本也就是“换了名字的 RHEL”。这里有个决策点容易被忽略为什么不直接用 CentOS Stream因为 CentOS Stream 变成了滚动发行版处在 RHEL 的“上游”更新节奏快今天能装的包明天可能就变了并不适合追求可复现、可追溯的生产环境。Rocky Linux 则是 RHEL 的“下游重建”版本节奏、包行为都尽量对齐 RHEL更适合做企业内部的基础设施底座。发行版与 RHEL 关系更新节奏适用场景RHEL官方商业发行稳定长期支持有订阅预算的核心生产CentOS StreamRHEL 上游滚动版滚动更新开发调试、尝鲜Rocky LinuxRHEL 下游重建稳定长期支持免费但需要 RHEL 兼容的环境AlmaLinuxRHEL 下游重建稳定长期支持与 Rocky 类似看团队偏好1.2 Docker 跑系统镜像和虚拟机的差别同样是跑一个操作系统虚拟机给人的感觉是“重”Docker 容器的感觉是“轻”。虚拟机动辄分配 2 核 4G 内存装完系统占几个 G 磁盘启动要等一分钟而一个 Rocky Linux 容器镜像才一百 MB 上下秒级启动跑多个实例也只需要一份镜像层。还不只是资源省。容器的最大价值是环境一致性开发、测试、生产都用同一份 Dockerfile 构建出来的镜像不会出现“在我电脑上是好的到你服务器就出问题”的经典扯皮。CI/CD 流水线里拉一个 Rocky Linux 容器做编译、打包、跑单测用完就销毁比维护一台长期运行的虚拟机省心得多。不过我也要说清楚边界容器不是万能的。需要加载内核模块、直接操作硬件、或者对安全隔离有极高要求的场景还是得回到虚拟机或者物理机。容器共享宿主机内核如果想测内核参数、调驱动就算用特权模式跑也很别扭。这个判断本身就是选型能力的一部分。2. 把 Rocky Linux 镜像拉下来先把基础平台跑通2.1 拉取镜像前先想清楚用哪个 tag很多人上来就是一句docker pull rockylinux:latest图省事但作为企业级平台我建议你先想清楚 tag 这件事。Rocky Linux 官方镜像的 tag 一般分为几类大版本号比如9、具体小版本比如9.3、9.4、以及latest。latest跟随最新版本走适合开发环境随时尝鲜生产环境则应该固定到具体小版本比如rockylinux:9.4这样你构建出来的镜像内容是可预测的过三个月重新构建也不会“静默升级”出问题。举个例子我拉一个 9 系列的镜像docker pull rockylinux:9.4拉完之后用docker image inspect可以看一下镜像的创建时间和架构信息。这里插一句Rocky Linux 官方默认镜像是最小化系统里面只有核心包很多常用工具比如vim、curl、tar都没装所以后面要做初始化。2.2 解决镜像下载慢配置 registry-mirrors如果你在国内拉 Docker Hub 官方镜像大概率会遇到一个很现实的问题慢。几十 MB 的镜像能下到怀疑人生大一点的镜像直接超时。这个问题的根源在从 Docker Hub 访问不稳定解决方案是给 Docker 配置镜像加速器。改/etc/docker/daemon.jsonWindows 上对应 Docker Desktop 的配置入口加上这么一段{ registry-mirrors: [ https://docker.m.daocloud.io, https://dockerproxy.com, https://docker.1panel.live ] }配置完执行systemctl restart dockerWindows/Mac 上在 Docker Desktop 里重启即可然后用docker info能看到 Registry Mirrors 列表确认已经生效。注意加速器的可用性会跟着网络环境变化今天能用不代表半年后还能用。我自己的习惯是配两三个备用的同时在拉大镜像时留意进度如果卡住就换源重试。3. 启动容器、搞定静态 IP 和基础配置3.1 先跑一个最小容器进去看看镜像拉下来之后先用最简单的交互方式验证基础环境能不能用docker run -it --name rocky-dev rockylinux:9.4 bash这个命令拆开来看-it是分配一个交互终端--name给容器起名bash是容器启动后执行的命令。进去之后第一件事看系统基本信息cat /etc/os-release你会看到ROCKY LINUX的标识。再执行dnf repolist看看软件源列表。这里补充一个容易踩的坑uname -r看到的不是 Rocky Linux 内核版本而是宿主机内核版本因为容器共享宿主机内核这是正常现象别误以为装错了系统。3.2 给容器设置固定 IP网络模式怎么选很多人在博客里搜“rocky linux 设置静态 ip”搜索结果大多是虚拟机里的配置方法。容器里设置静态 IP 的思路完全不一样核心在 Docker 网络层面。默认情况下Docker 会创建一个叫bridge的网络容器启动后自动从网段里分配 IP容器重启 IP 就可能变。如果多个容器之间要用固定 IP 互通我建议手动创建一个自定义 bridge 网络docker network create --subnet172.88.0.0/24 mynet docker run -it --name rocky-dev --network mynet --ip 172.88.0.10 rockylinux:9.4 bash--subnet指定子网--ip给容器分配一个固定的内网地址。后面启动其他容器、比如 MySQL 或者 Redis也加入mynet网络就能通过固定 IP 直接访问 Rocky 容器。这么做最直接的收益是容器重启后 IP 不会漂移业务配置不用跟着改。自定义网络还有一个隐藏优势容器之间可以通过容器名直接解析只要在同一个自定义网络里ping rocky-dev都能通。这对微服务架构来说比记 IP 地址舒服多了。3.3 容器要配 yum 源和时区最小化镜像装好之后第一轮初始化我一般做三件事换源、调时区、装基础工具。Rocky Linux 默认源指到官方源在国内访问速度不稳定我会把它替换成国内镜像源。方法很简单进入容器后编辑 Rocky Linux 的 repo 文件把mirrorlist注释掉启用baseurl并指向国内镜像站。比如用 sed 批量处理sed -e s|^mirrorlist|#mirrorlist|g \ -e s|^#baseurlhttp://dl.rockylinux.org/$contentdir|baseurlhttps://mirrors.aliyun.com/rockylinux|g \ -i.bak \ /etc/yum.repos.d/rocky*.repo然后清缓存、重建缓存dnf clean all dnf makecache时区设置也很重要。容器默认时区通常是 UTC日志时间容易让人看晕。改成上海时区ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime echo zoneAsia/Shanghai /etc/init.d/functions再装几个开发环境常用的工具dnf install -y vim tar gzip curl wget unzip tree重要提示跑进容器里手敲的这些配置只在当前容器有效。如果容器被删掉全部白干。正确做法是把初始化步骤全部写进 Dockerfile保证任何时刻从镜像重建都能拿到一样的初始环境。4. 用 Dockerfile 固化你的企业级基础镜像4.1 设计一份能直接进生产的基础镜像 Dockerfile既然容器的手工配置不可持久企业级做法就是把所有初始化逻辑沉淀成 Dockerfile。我以 Rocky Linux 9 为例给你一份可以直接抄作业的基础镜像模板FROM rockylinux:9.4 # 元数据信息方便镜像仓库识别归属 LABEL maintaineryour-teamexample.com \ version1.0.0 \ descriptionRocky Linux 9.4 base image for enterprise workloads # 全局环境变量时区、语言、编码 ENV TZAsia/Shanghai \ LANGen_US.UTF-8 \ LC_ALLen_US.UTF-8 # 替换为国内 yum 源 RUN sed -e s|^mirrorlist|#mirrorlist|g \ -e s|^#baseurlhttp://dl.rockylinux.org/$contentdir|baseurlhttps://mirrors.aliyun.com/rockylinux|g \ -i.bak \ /etc/yum.repos.d/rocky*.repo \ dnf clean all \ dnf makecache # 安装基础工具和常用调试命令 RUN dnf install -y \ vim \ tar \ gzip \ curl \ wget \ unzip \ tree \ procps-ng \ iproute \ which \ dnf clean all # 设置时区 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # 创建普通用户生产容器不建议直接用 root 跑应用 RUN useradd --create-home --shell /bin/bash appuser # 切换到普通用户 USER appuser CMD [/bin/bash]这个 Dockerfile 里有几个点值得展开说。第一dnf install后面紧跟dnf clean all这是为了清理 yum 缓存压缩镜像体积。很多新手在这一步偷懒结果镜像里塞了几百 MB 的 rpm 包缓存白白浪费存储和拉取时间。第二创建普通用户appuser并切换这是企业安全标准的常见要求。容器默认用 root 运行一旦应用被攻破攻击者直接是容器内最高权限切换成普通用户能降低一部分风险。第三CMD [/bin/bash]只适合做交互测试。真正常用的基础镜像应该根据业务覆盖这个 CMD比如做成编译镜像就挂编译器入口做成运行镜像就挂应用启动命令。4.2 systemd 到底要不要在容器里跑这是 Rocky Linux 容器化绕不开的话题。默认官方镜像把 PID 1 设置成bash或者你指定的命令不会启动 systemd。这意味着你没法在容器里用systemctl start nginx这种命令管理服务。有两条路线路线一不跑 systemd推荐容器应该是轻量、单进程优先的。假如你只需要一个 Rocky Linux 环境来跑某个 RPM 包可以用docker run直接执行目标程序或者用ENTRYPOINT把程序作为主进程。这样容器生命周期和应用绑定优雅停机也会更干净。路线二确实需要 systemd 的时候少数场景下你要验证某个软件的 RPM 包安装后能不能被systemctl正常拉起就需要在容器里启动 systemd。做法是启动时把/sbin/init作为主进程并挂载 cgroupdocker run -it \ --name rocky-systemd \ -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ --privileged \ rockylinux:9.4 \ /sbin/init然后另开一个终端docker exec -it rocky-systemd bash进去就能用systemctl了。注意--privileged给容器开了非常高权限有安全隐患只在本地验证、开发调试时用。生产环境尽量不要这样搞尤其是跑在 Kubernetes 上时systemd in container 的限制会更多。4.3 构建基础镜像并推送到企业私有仓库写完 Dockerfile构建镜像并打标签docker build -t registry.example.com/rockylinux-base:9.4-v1.0.0 .推送前和仓库认证打个招呼docker login registry.example.com docker push registry.example.com/rockylinux-base:9.4-v1.0.0在企业内部我强烈建议搭一个私有镜像仓库比如 Harbor 或者纯 Registry。基础镜像推到私有仓库后团队成员统一从这里拉取既保证“基础镜像只有平台组能改”也避免每个人本地构建出千奇百怪的环境。这一步做完整个团队就真正共享起了“基础镜像平台”。5. 在基础镜像上扩展你的常用应用5.1 MySQL 8.0直接用官方镜像还是自己动手装说一个我踩过的坑刚容器化时我一度想把 MySQL、Redis、Nginx 全部塞进 Rocky Linux 基础镜像觉得“一个容器啥都有”才完整结果镜像体积膨胀到几个 G启动变慢升级维护还要重新构建整套环境。后来团队定了个原则有官方应用镜像就优先用官方应用镜像不要在基础镜像里手工装应用依赖。比如 MySQL 8.0直接用官方镜像更合理docker run -d \ --name mysql8 \ --network mynet \ --ip 172.88.0.20 \ -e MYSQL_ROOT_PASSWORDyour_strong_password \ -e MYSQL_DATABASEappdb \ -p 3306:3306 \ -v /data/mysql:/var/lib/mysql \ mysql:8.0但如果你做的正是“验证 MySQL 8.0 在 RHEL 兼容环境下的行为”那就必须在 Rocky Linux 容器里手动装一遍这时候可以这样dnf install -y mysql-server mysqld --initialize-insecure mysqld --usermysql --daemonize这两种路径没有绝对对错取决于目标是跑业务还是做兼容性验证。企业基础镜像平台的意义就是给第二种场景提供可重复的基础底座。5.2 在容器里安装 LibreOffice 这类大型 RPM 包热点里有人搜“rocky linux 安装 libreoffice”大概率是要做文档转换服务比如把 Office 文件转 PDF。这类场景确实适合把 LibreOffice 预装进基础镜像因为依赖太庞大每次现装不现实。直接装完整版最省事但体积也最感人dnf install -y libreoffice我在实际构建时对体积做了优化只装核心和 writer、calc 这些常用模块dnf install -y \ libreoffice-core \ libreoffice-writer \ libreoffice-calc \ libreoffice-impress \ --setopttsflagsnodocs--setopttsflagsnodocs是个很实用的参数意思是跳过文档文件能省不少空间。装完观察一下镜像体积全量 LibreOffice 能增加 1.5GB 左右裁剪后大概能控制在 800MB 上下具体数字随版本变化。对只做文档转换的容器这点省下来的空间很值。5.3 Redis 主从顺带跑一遍“容器编排的基本动作”热搜里也有“docker 安装 redis 主从”这个用 Rocky Linux 基础镜像平台搭起来更直观。先建一个 Redis 主实例docker run -d \ --name redis-master \ --network mynet \ --ip 172.88.0.30 \ redis:7 redis-server --appendonly yes再启动一个从实例指定--replicaof连接主实例docker run -d \ --name redis-replica \ --network mynet \ --ip 172.88.0.31 \ redis:7 \ redis-server --replicaof 172.88.0.30 6379验证主从状态docker exec redis-master redis-cli INFO replication这个例子其实想说明一件事当你有 Rocky Linux 基础镜像平台之后Redis、MySQL、Nginx 都可以围绕它做灵活的“周边编排”而不是所有东西都要塞进同一个镜像。基础镜像保持精简应用镜像按需扩展才是容器化比较健康的方式。6. 实操中常见的坑与排查技巧6.1 镜像下载慢、超时的处理套路镜像下载慢是高频问题尤其在拉大镜像时最明显。我的排查顺序一般是先看docker info里 Registry Mirrors 是否生效再 curl 一下加速器地址看连通性最后确认 DNS 配置。配置没问题但还是慢可以把daemon.json里的max-concurrent-downloads调低一点避免并发下载太多层导致单个层超时{ registry-mirrors: [https://docker.1panel.live], max-concurrent-downloads: 3 }改完重启 Docker耐心看进度。6.2 systemd 起不来怎么办最典型的报错是Failed to connect to bus: No such file or directory原因就是容器里 PID 1 不是 systemd。如果你确实需要 systemd参考前面 4.2 小节的启动参数把/sbin/init作为主进程并挂载 cgroup。还有一种情况是 Docker Desktop 的 cgroup 版本和镜像要求不一致可以在 Docker Desktop 的 Settings 里切换 cgroup v2。6.3 Docker Desktop 虚拟化检测不到如果你在 Windows 上安装 Docker Desktop可能遇到 “virtualization support not detected” 这个报错。这大概率不是 Docker 的问题而是底层虚拟化没开。先到 BIOS 里确认 VT-x/AMD-V 开启然后在 Windows 功能里勾选“虚拟机平台”“Hyper-V”“适用于 Linux 的 Windows 子系统”这三项重启后再启动 Docker Desktop。如果依然报错检查电脑上有没有装其他虚拟化软件比如 VMware、VirtualBox。Docker Desktop 在 Windows 上依赖 Hyper-V/WHPX跟这两个软件偶尔会抢资源。这种问题很折腾我自己的处理习惯是重装之前先看 Windows 事件查看器里有没有虚拟化相关的错误记录往往比乱试快。6.4 容器里 yum 装包报错的常规解法容器里用 dnf 装包时最常碰到的是 DNS 解析问题Could not resolve host: mirrorlist.rockylinux.org先检查容器里/etc/resolv.conf如果是默认网络DNS 设置来自宿主机。宿主机 DNS 不好容器自然解析不了。启动容器时可以显式指定公共 DNSdocker run -it --dns 223.5.5.5 rockylinux:9.4 bash这个 223.5.5.5 是国内公共 DNS解析速度和连通性都更可靠。换了 yum 源之后记得清缓存dnf clean all dnf makecache还有一个很容易被忽略的细节如果在 Dockerfile 里改了 yum 源一定要确保构建时网络可用。很多 CI 环境有外网限制构建到一半源失效不是源配错而是环境本来就出不去。最后再分享一个小技巧。我现在的习惯是任何 Rocky Linux 容器第一件事先装procps-ng和iproute一个提供ps和top一个提供ip命令排查网络和进程时省下大量时间。基础镜像平台这种东西前期比谁功能全没意义后期比谁建得干净、跑得一致、升级不打架才是真正的价值所在。把这些细节一点一点固化进镜像模板整个团队的时间都会省出来。
RELATED

相关推荐

intf对接BPMN工作流引擎:权限校验与操作日志公共封装实践

intf对接BPMN工作流引擎:权限校验与操作日志公共封装实践

这个题目一看就是企业内部系统开发里绕不开的活儿。项目审核要过流程,流程引擎选了 bpmn,但权限怎么卡、操作怎么留痕,如果每个业务系统各写一套,后期维护绝对想骂人。所以标题里的“intf 对接 bpmn 与公共封装”其实是两件事&…

📅 2026/9/16 6:52:15
在 react-native-vision-camera 中使用 Barcode Scanner 扫码:安装、四种调用方式与 API 详解

在 react-native-vision-camera 中使用 Barcode Scanner 扫码:安装、四种调用方式与 API 详解

在 react-native-vision-camera 中使用 Barcode Scanner 扫码:安装、四种调用方式与 API 详解 【免费下载链接】react-native-vision-camera 📸 A powerful, high-performance React Native Camera library. 项目地址: https://gitcode.com/GitHub_Tre…

📅 2026/9/16 6:52:15
网络IO性能优化:从TCP到HTTP的全面调优策略

网络IO性能优化:从TCP到HTTP的全面调优策略

1. 网络IO性能优化概述在当今互联网应用中,网络IO性能往往是系统瓶颈的关键所在。一个典型的Web请求从客户端发出,到服务器响应返回,需要经历TCP连接建立、HTTP请求处理、业务逻辑执行、数据返回等多个环节。每个环节都可能成为性能瓶颈&…

📅 2026/9/16 6:52:15
MORE NEWS

更多资讯

📰

STM32燃气安防系统工程级设计与抗干扰实践

1. 这不是“又一个STM32项目”,而是一套可直接上电验证的安防工程原型你搜“STM32 智能安防”出来的结果,十有八九是带LED闪烁、蜂鸣器响两声、串口打印“Gas detected!”的Demo——它连传感器都没接稳,更别说在真实环境里扛住电磁干扰、电源…

📰

Pentagi:AI驱动的渗透测试代理架构解析

1. “Pentagi”不是工具名,而是渗透测试AI代理架构的代号级命名你搜“pentagi”,页面上全是Docker、Neo4j、安装教程、报错提示——没有官网、没有GitHub仓库、没有文档首页。这不是偶然,而是典型的技术概念在传播过程中被误当作产品名的缩略…

📰

Direct-LiNGAM算法:从观测数据中反推因果方向的确定性方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

AI辅助STM32开发:零基础搭建第一个工程并点亮LED

开头很多刚入行或者自学的朋友,第一次接触STM32的时候都卡在同一个地方:工程不知道该怎么建,代码不知道从哪下笔,遇到一个编译报错能查一下午。我最近刚好帮一个零基础的师弟从零搭了第一个STM32工程,从安装Keil、配置…

📰

STM32C5+LSM6DSV16X:SPI轮询读取陀螺仪数据详解

前阵子把一颗LSM6DSV16X接到了STM32C5的板子上,想快速验证陀螺仪能不能正常出数。折腾一圈下来发现,这套组合跟网上大多数教程用的老平台不太一样,寄存器表更新过,CubeMX配置也有几个容易忽略的细节。这篇文章是这个系列的第一篇&…

📰

微信API高可用实践:CompletableFuture异步优化

1. 项目背景与核心挑战微信生态在企业级应用和个人开发者中占据着重要地位,但官方API的稳定性问题一直是开发者面临的痛点。特别是在个人微信自动化场景中,接口超时、网络抖动和频率限制等问题频繁出现,直接影响业务连续性。传统同步阻塞式的…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬