这是一个非常经典且实际的生产环境问题。虽然 Docker 的核心原理在大多数 Linux 发行版上是通用的,但在 openEuler(欧拉) 和 CentOS 这两个系统上部署,细节上的差异主要体现在包管理、内核模块加载以及源配置上。
简单来说:操作逻辑一致,但命令和依赖处理不同。 CentOS 偏向于传统的 RHEL 体系,而 openEuler 是华为主导的开源操作系统,更强调自主可控和高性能优化。
以下是详细的对比和操作步骤解析:
一、 核心差异点概览
| 维度 | CentOS (7/8) | openEuler (20.03/22.03 LTS SP1+) |
|---|---|---|
| 包管理器 | yum / dnf |
yum / dnf (兼容 RHEL 风格) |
| Docker 官方源 | 使用 docker-ce 仓库 |
通常直接使用系统源或华为云镜像源,不推荐直接混用 Docker 官方 repo(可能冲突) |
| 内核模块 | 需手动安装 kernel-devel 等依赖以支持 overlay2 |
默认集成度高,部分版本已预装必要内核头文件 |
| 防火墙 | firewalld + iptables |
firewalld + iptables (默认策略类似) |
| SELinux | 默认 Enforcing,常需设为 Permissive 或调整策略 | 默认 Enforcing,建议保持开启并正确配置上下文 |
注意:从 CentOS 8 开始,CentOS 项目重心转向 CentOS Stream,传统 CentOS 8 已停止维护。如果你是在新服务器上部署,建议优先考虑 openEuler 或 Rocky/AlmaLinux。以下对比基于 CentOS 7/8 与 openEuler 22.03 LTS SP1 的典型场景。
二、 在 CentOS 上部署 Docker 的标准步骤
1. 卸载旧版本(如有)
sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
2. 安装依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
3. 添加 Docker 官方仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
4. 安装 Docker CE
sudo yum install -y docker-ce docker-ce-cli containerd.io
5. 启动并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
6. 验证
sudo docker run hello-world
三、 在 openEuler 上部署 Docker 的步骤
openEuler 对 Docker 的支持更加“原生”,通常可以直接通过系统包管理器安装,或者使用华为云提供的优化镜像。
方案 A:使用 openEuler 官方源安装(推荐,简单稳定)
openEuler 22.03 LTS SP1 及以上版本已将 Docker 纳入官方软件库,无需添加第三方源。
1. 更新系统缓存
sudo dnf makecache
# 或者
sudo yum makecache
2. 安装 Docker 及相关组件
sudo dnf install -y docker-ce docker-ce-cli containerd.io
关键点:这里直接使用
dnf或yum即可,因为 openEuler 的 base 仓库中已经包含了经过适配的 Docker 包。
3. 启动服务
sudo systemctl start docker
sudo systemctl enable docker
4. 验证
sudo docker run hello-world
方案 B:使用华为云镜像源提速(适用于国内生产环境)
如果官方源下载速度慢,可以配置华为云的 YUM/DNF 源镜像。
1. 备份原配置文件
sudo cp /etc/yum.repos.d/openEuler.repo /etc/yum.repos.d/openEuler.repo.bak
2. 修改源地址为华为云镜像
编辑 /etc/yum.repos.d/openEuler.repo,将 baseurl 中的域名替换为 mirrors.huaweicloud.com。
例如:
[BaseOS]
name=BaseOS
baseurl=https://repo.huaweicloud.com/openeuler/openEuler-22.03-LTS-SP1/os/$basearch/
enabled=1
gpgcheck=1
gpgkey=https://repo.huaweicloud.com/openeuler/openEuler-22.03-LTS-SP1/os/$basearch/RPM-GPG-KEY-openEuler
3. 重新生成缓存并安装
sudo dnf clean all
sudo dnf makecache
sudo dnf install -y docker-ce docker-ce-cli containerd.io
四、 关键注意事项与常见坑
1. 内核参数差异
- CentOS: 有时需要手动调整
/etc/sysctl.conf中的net.ipv4.ip_forward=1和net.bridge.bridge-nf-call-iptables=1。 - openEuler: 默认内核配置通常已经优化了这些参数,尤其是针对容器化场景。但如果遇到网络问题,仍需检查:
sysctl net.bridge.bridge-nf-call-iptables # 如果返回 0,需手动设置为 1 echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf sysctl -p
2. SELinux 配置
- CentOS: 很多用户为了省事直接
setenforce 0,但这在生产环境中是不安全的。 - openEuler: 强烈建议保持 SELinux 为 Enforcing 模式。Docker 在 openEuler 上对 SELinux 的支持更好,会自动创建正确的安全上下文。如果确实遇到权限问题,应使用
semanage fcontext进行精细控制,而非关闭 SELinux。
3. cgroup 驱动一致性
- 无论是 CentOS 还是 openEuler,都需要确保 systemd 和 Docker 使用相同的 cgroup 驱动。
- 检查方式:
cat /proc/self/cgroup | head -n 1 # 如果显示 "memory:/docker/..." 或类似,说明是 cgroupfs # 如果显示 "name=systemd:/...",说明是 systemd - 最佳实践:在
/etc/docker/daemon.json中指定"exec-root"和"cgroup-driver": "systemd"(取决于你的 init 系统)。openEuler 默认使用 systemd,因此建议 Docker 也使用 systemd cgroup 驱动,以避免资源统计不一致。
4. 防火墙规则
- 两者都使用
firewalld。 - 开放端口示例:
sudo firewall-cmd --permanent --add-port=2375/tcp # 如果使用远程 API sudo firewall-cmd --reload - 注意:Docker 容器内部的网络转发依赖于 iptables 的规则。如果
firewalld和iptables规则冲突,可能导致容器无法访问网络。建议在启动 Docker 后,检查iptables -L -n是否有 Docker 自动插入的规则。
5. 镜像提速器
- CentOS: 通常配置阿里云、腾讯云等镜像提速器。
- openEuler: 除了通用提速器,还可以考虑使用华为云镜像提速器,特别是对于企业内部使用华为云基础设施的场景,内网拉取速度更快。
五、 总结建议
- 如果是新项目:推荐使用 openEuler。它在内核调度、网络栈(如 eBPF 支持)、安全特性(如 KVM 虚拟化结合)方面有更深的优化,尤其适合云原生场景。
- 如果是迁移项目:如果原有应用是基于 CentOS 开发的,且依赖特定的 RPM 包,可以先评估兼容性。openEuler 的二进制兼容性较好,大部分 CentOS 7/8 的应用可以无缝迁移。
- 避免踩坑:
- 不要在 openEuler 上随意添加 Docker 官方 Linux 仓库,优先使用系统自带源。
- 注意内核版本匹配,Docker 新版本可能需要较新的内核(>= 4.4),openEuler 22.03 LTS SP1 默认内核为 5.10+,完全满足要求。
- 始终关注
journalctl -u docker.service日志,排查启动失败的原因。
通过以上步骤,你可以在两个系统上顺利部署 Docker,并根据实际需求选择最适合的平台。
云技术博客