努力
加油

轻量应用服务器上运行Docker,该选哪个基础镜像(如Ubuntu 22.04、CentOS Stream 9、Debian 12)?

在轻量应用服务器(Lighthouse)这种资源相对受限、追求开箱即用体验的平台上跑 Docker,选基础镜像的核心逻辑其实就两点:社区生态兼容性 和 系统资源开销。

直接给结论:如果你没有特殊的遗留业务依赖,首选 Debian 12 (Bookworm),其次是 Ubuntu 22.04/24.04 LTS。CentOS Stream 9 目前不建议作为生产环境的首选,除非你有强相关的 RHEL/CentOS 8 迁移需求。

下面从实际运维角度拆解一下为什么这么选,以及各个选项的真实体感:

1. Debian 12:最被低估的“性价比之王”

很多新手会下意识觉得 Ubuntu 才是 Linux 界的标准答案,但在云服务器场景下,Debian 往往更香。

  • 资源占用极低:Debian 默认不带 systemd-journald 等大量后台服务,初始内存占用通常在 50MB-80MB 左右。对于 1核2G 或 2核4G 的轻量服务器来说,每一兆内存都很珍贵。留给 Docker 容器的空间更大。
  • Docker 官方支持度极高:Docker 官方文档对 Debian 的支持非常完善,安装脚本(get.docker.com)对 Debian 的适配几乎零报错。
  • 稳定性与简洁性:Debian 的软件包更新节奏比 Ubuntu 慢一点,但极其稳定。它不像 Ubuntu 那样捆绑太多桌面环境风格的元数据包(metapackages),系统更加纯净。
  • 痛点:部分国内开发者习惯 apt-get 后跟 update,Debian 的源速度在国内偶尔需要手动配置阿里云或清华源提速,但这属于基本操作,不难解决。

2. Ubuntu 22.04/24.04 LTS:生态兼容性的安全牌

如果你是从个人电脑转过来,或者你的教程、文档大部分是基于 Ubuntu 编写的,那选 Ubuntu 没错。

  • 教程覆盖率最高:你在网上搜到的 90% 的 Docker 部署教程,默认都是基于 Ubuntu 的。遇到坑时,搜索到的解决方案也是最多的。
  • 云厂商优化好:国内主流云厂商(阿里云、腾讯云等)对 Ubuntu 的镜像优化做得比较早,内核参数、网络栈通常都有针对云环境的微调。
  • 代价:稍微臃肿。预装的 snapd、landscape-client 等服务会占用一定的 CPU 和内存。虽然现代硬件不介意这点,但在轻量机上,你会感觉“开机变慢了”,因为后台启动项确实多。
  • 注意版本:务必选 LTS(长期支持版)。不要碰非 LTS 版本,因为 Docker 的新特性可能会快速跟进,而非 LTS 版本生命周期短,容易陷入频繁升级的麻烦。

3. CentOS Stream 9 / Rocky Linux / AlmaLinux:谨慎入场

以前大家说“CentOS 7 是神”,但现在 CentOS 7 已停止维护,CentOS Stream 变成了滚动更新的测试版分支,定位发生了变化。

  • RPM 系的复杂性:使用 yum 或 dnf 安装 Docker 时,你需要关注是否启用了 docker-ce 仓库。相比 Debian 系的 apt,RPM 系的依赖解析在某些复杂场景下更容易出现冲突。
  • SELinux 的困扰:这是新手最大的坑。CentOS 系列默认开启 SELinux,而 Docker 容器内的进程如果上下文不对,会被 SELinux 拦截,导致权限错误(Permission denied)。虽然可以关闭 SELinux,但这降低了安全性;如果不关,你需要学习 chcon 或编写 policy,增加了运维成本。
  • 适用场景:如果你的业务代码强依赖 RHEL 系的环境(比如某些商业数据库、Java 中间件明确声明只支持 RHEL/CentOS),那就选它。否则,为了一个简单的 Web 服务去折腾 SELinux 和 yum 源,得不偿失。

4. 关键建议:别只看主机 OS,要看 Dockerfile

很多人纠结主机装什么系统,但其实更重要的是你的应用运行在什么系统里。

  • 最佳实践:主机用 Debian 12 或 Ubuntu 22.04,保持宿主机的精简和稳定。
  • 容器内隔离:在你的 Dockerfile 中,根据应用需求选择容器基础镜像。
    • 跑 Node.js/Python/Go?直接用对应的 slim 或 alpine 镜像。
    • 跑 Java?用 Eclipse Temurin 或 Amazon Corretto 的 Alpine/Debian 镜像。
    • 跑 Nginx/Apache?用官方的 nginx:alpine 或 nginx:debian 镜像。

这样,宿主机的发行版差异对上层应用的影响被降到最低。你只需要确保宿主机能流畅运行 Docker 引擎即可。

5. 针对轻量服务器的特别注意事项

  1. Swap 分区:轻量服务器内存小,强烈建议在初始化磁盘时划分 Swap 分区,或者在系统中创建 swapfile。Docker 在内存紧张时会优先清理缓存,但如果物理内存耗尽且无 Swap,容器可能被 OOM Kill。Debian/Ubuntu 下设置 swap 很简单:
    fallocate -l 2G /swapfile
    chmod 600 /swapfile
    mkswap /swapfile
    swapon /swapfile
    echo '/swapfile none swap sw 0 0' >> /etc/fstab
  2. 存储驱动:确认 Docker 使用的是 overlay2 驱动,这是 Linux 内核原生支持的,性能最好。轻量服务器通常默认就是,但检查一下 docker info | grep Storage Driver 更安心。
  3. 防火墙:轻量服务器自带的安全组(Security Group)和系统内部的 ufw (Ubuntu) 或 firewalld (CentOS) 要分清。通常我们只配置云平台的安全组,系统内部防火墙可以关闭以简化调试,但生产环境建议开启并仅放行必要端口。

总结

  • 追求极致轻量、稳定、低资源占用 -> Debian 12
  • 追求教程丰富、云厂商支持好、不想折腾源 -> Ubuntu 22.04 LTS
  • 有特定 RHEL 系软件依赖 -> Rocky Linux 9 / AlmaLinux 9(比 CentOS Stream 更稳定)

对于大多数个人开发者和小微团队,我推荐从 Debian 12 开始尝试。一旦你习惯了它的简洁,就不会想回去了。