Linux YUM、Docker 和源码编译

Linux 系统上通过 YUM、Docker 和源码编译这三种方式安装软件的相同与不同之处。

为了让对比更清晰,我们以安装 Nginx 这个具体的软件为例。


总结概览

特性维度 YUM 安装 Docker 容器 源码编译安装
核心哲学 使用系统包管理器,从官方仓库安装预编译的二进制包。 使用容器化技术,运行一个包含应用及其依赖的独立环境。 从源代码开始,手动编译生成可执行文件。
易用性 极高,一条命令即可完成。 ,一条命令拉取并运行。 ,步骤繁琐,需手动解决依赖。
依赖管理 自动解决,YUM 会自动安装所需依赖。 内置隔离,所有依赖已打包在镜像内,与宿主机无关。 手动解决,需自行安装所有开发库和工具。
性能 原生性能,与系统紧密集成。 近原生性能,有极小的开销。 最佳性能,可针对当前CPU架构进行优化。
灵活性/定制性 ,只能使用仓库提供的版本和模块。 ,可以选择不同版本的镜像,但定制需自己构建镜像。 极高,可以自定义任何模块和编译选项。
隔离性 ,软件安装在系统全局环境,可能产生依赖冲突。 极高,应用在隔离的容器中运行,与宿主机和其他容器隔离。 ,与 YUM 安装类似,安装在系统全局环境。
文件位置 符合 FHS 标准,文件分散在 /usr/bin/etc/var/log 等。 容器内部分文件系统,通常与镜像定义一致。可挂载外部卷。 可自定义(通常为 /usr/local 或自定义路径)。
升级与管理 非常方便yum update 即可平滑升级。 非常方便,拉取新镜像并重启容器即可。版本控制极佳。 麻烦,需重新编译并手动替换,易出错。
安全性 依赖发行版的安全更新和补丁。 镜像可能包含漏洞,需定期更新基础镜像。容器本身提供隔离安全性。 自己负责所有安全补丁,需跟踪上游更新。
适用场景 生产环境首选,追求稳定、简单、易于维护。 现代化部署,微服务、CI/CD、环境隔离、快速扩展。 特殊需求,需要特定功能、最新版本、或深度性能优化。

详细解析

1. YUM 安装

YUM(或 DNF)是 RHEL/CentOS/Fedora 等发行版的包管理器。

  • 命令示例:

    bash 复制代码
    sudo yum install nginx
    sudo systemctl start nginx
    sudo systemctl enable nginx
  • 相同点:

    • 与源码编译一样,最终都是在宿主机原生环境中运行一个可执行程序。

    • 与 Docker 一样,都属于"二进制"安装(无需从零开始编译)。

  • 不同点/优缺点:

    • 优点:

      • 极其简单快捷:一条命令完成安装、配置、依赖处理和系统集成。

      • 稳定可靠:仓库中的软件版本都经过发行版维护者的测试,与系统兼容性好。

      • 自动管理:方便的升级、卸载和依赖清理。

    • 缺点:

      • 版本滞后:仓库中的版本通常不是最新的。

      • 定制性差 :无法选择编译哪些模块。例如,你想用 --with-http_image_filter_module,但仓库版的 Nginx 没编译这个模块,你就无法使用。

2. Docker 容器

Docker 是一种容器化技术,它并不是在宿主机上直接"安装"软件,而是运行一个包含该软件的独立镜像

  • 命令示例:

    bash 复制代码
    # 拉取并运行 Nginx 官方镜像
    sudo docker run -d --name my-nginx -p 80:80 nginx:latest
  • 相同点:

    • 最终都能提供一个可用的 Nginx 服务。
  • 不同点/优缺点:

    • 优点:

      • 环境隔离:Nginx 运行在容器里,它的依赖(如 Libc、OpenSSL)与宿主机完全隔离,不会产生冲突。

      • 一致性:在任何支持 Docker 的机器上,运行结果都完全一致("一次构建,处处运行")。

      • 快速部署与回滚:秒级启动和停止,版本切换非常简单(只需换一个镜像标签)。

      • 资源高效:相比虚拟机,开销极小。

    • 缺点:

      • 学习曲线:需要理解 Docker 的概念(镜像、容器、卷、网络)。

      • 调试复杂:排查问题需要进入容器内部,或者查看容器日志。

      • 存储与网络:需要额外配置来管理持久化数据和网络端口映射。

3. 源码编译安装

从软件的源代码(通常是 .tar.gz 文件)开始,在自己的机器上编译成可执行文件。

  • 步骤示例:

    bash 复制代码
    wget http://nginx.org/download/nginx-1.24.0.tar.gz
    tar -zxvf nginx-1.24.0.tar.gz
    cd nginx-1.24.0
    ./configure --prefix=/usr/local/nginx --with-http_ssl_module # 这里可以加很多自定义参数
    make
    sudo make install
    /usr/local/nginx/sbin/nginx
  • 相同点:

    • 与 YUM 安装一样,在宿主机原生运行。
  • 不同点/优缺点:

    • 优点:

      • 极致灵活与定制:可以编译任何你需要的模块,禁用不需要的模块。

      • 最新版本:可以立即用上官方发布的最新版。

      • 性能优化 :编译时可以针对当前 CPU 架构进行优化(如指定 -march=native)。

    • 缺点:

      • 过程繁琐:步骤多,耗时长。

      • 依赖管理噩梦 :需要手动安装 gcc, make, pcre-devel, zlib-devel, openssl-devel 等开发工具和库。./configure 阶段经常因缺少依赖而报错。

      • 难以管理:没有统一的升级和卸载命令,需要手动操作,容易遗留文件。


如何选择?

  • 绝大多数情况,尤其是生产环境:

    • 优先使用 YUM/DNF/APT。稳定、省心、易于维护是首要考虑因素。
  • 需要环境隔离、快速扩展、微服务架构或CI/CD:

    • 选择 Docker。它是现代应用部署的事实标准。
  • 有非常特殊的定制需求,或需要最新版本,或进行性能研究:

    • 考虑 源码编译。例如,你需要为 Nginx 添加一个第三方模块,或者使用某个还在开发中的新特性。

一个有趣的组合:你甚至可以在 Dockerfile 里使用源码编译的方式来构建一个完全定制的 Nginx 镜像,这样既获得了定制性,又拥有了 Docker 的便携性和隔离性。这正体现了不同技术可以协同工作。

相关推荐
呼啦啦呼啦啦啦啦啦啦4 分钟前
推送docker镜像至私有 Docker 镜像仓库(附企业harbor实战)
运维·docker·容器
m0_485614676 分钟前
Docker基础
docker·容器·php
二等饼干~za89866813 分钟前
碰一碰发视频系统源码开发搭建--技术分享
java·运维·服务器·重构·django·php·音视频
June`21 分钟前
深入解析网络层与数据链路层
linux·服务器·网络
爱学大树锯22 分钟前
【Docker本地化超级实践】Docker 镜像离线构建方案
运维·docker·容器
老王熬夜敲代码25 分钟前
计算机网络--IP概念
linux·网络·笔记
熙丫 1338148238627 分钟前
CISAW-RM风险管理认证培训|2026年度课程计划全面发布:筑牢安全防线
运维·安全
默恋~微凉31 分钟前
Docker
运维·docker·容器
玥轩_52137 分钟前
防火墙技术-综合应用实验
运维·网络·网络协议·网络安全·智能路由器·路由器·防火墙
Lynnxiaowen43 分钟前
今天我们继续学习devops内容基于Jenkins构建CICD环境
linux·运维·学习·jenkins·devops