openEuler 云原生容器基础搭建与Podman应用部署实操

前言

openEuler 是面向数字基础设施的开源操作系统,由开放原子开源基金会孵化,面向服务器、云计算、边缘计算与嵌入式等核心场景,致力于提供稳定、安全、可扩展的基础软件平台。其社区长期迭代,形成了完善的版本发布体系、工具链与文档生态,为开发者与企业在生产环境落地提供坚实支撑。

在架构支持方面,openEuler 面向多样性计算架构,覆盖 ARM、x86、RISC‑V、LoongArch、PowerPC、SW‑64 等,帮助用户在不同硬件平台上获得一致的体验与能力;在合规方面遵循木兰宽松许可证第 2 版(MulanPSL2),以开放协作的方式推动生态共建。综合来看,openEuler 在稳定性、性能、安全合规与云原生友好方面表现突出,适合在企业与个人的评测、试用与生产场景中进行系统性验证与应用。(产品页:www.openEuler.org/;文档中心:docs.openEuler.openatom.cn/zh/

核心特性与优势(概览):

  • 多架构支持与一致性体验:ARM、x86、RISC‑V、LoongArch、PowerPC、SW‑64 等主流架构均有良好适配。
  • 云原生友好:提供容器运行时与工具生态的完善支持,兼容 Podman、Buildah/Skopeo、Kubernetes 相关组件与镜像规范,支持 root 与 rootless 模式。
  • 安全与合规:SELinux、软件包签名、仓库源治理与防火墙策略配合,满足更高的安全与合规需求。
  • 稳定与性能:长期演进的内核与用户态软件栈,面向服务器与云场景的可靠性与性能优化。
  • 工具链与文档:文档中心覆盖安装、运维、云原生、虚拟化、边缘计算等,学习与落地路径清晰。
  • 社区生态:SIG 组织与贡献流程成熟,易于进行问题跟踪、反馈与协作。

本文聚焦 openEuler 20.03,在华为云弹性云服务器(ECS)环境下,以 Podman 为核心完成"从 0 到 1"的容器基础搭建与应用部署演示;同时给出网络故障修复、持久化挂载与镜像构建等关键实践,帮助读者快速上手并将流程迁移到真实评测与生产环境。

读者定位与收益:

  • 希望在云服务器上快速完成容器化应用的搭建与验证的工程师与爱好者
  • 参与评测活动、需要形成可复现技术材料与截图记录的作者
  • 需要在 openEuler 环境下对 Podman、镜像源与网络策略进行排错与优化的运维人员

快速入口:

下文将以"环境确认 → 安装与排错 → 启动 Nginx → 持久化与构建 → 网络与编排 → 常见问题"的顺序展开

测试与实操环境

  • 云服务提供商:华为云 ECS(弹性云服务器)
  • 操作系统:openEuler 20.03 64bit
  • 系统盘:40GiB
  • 网络:VPC 环境

一、准备工作

为保证后续安装顺利,先完成基础环境的确认与源加速

bash 复制代码
# 1) 查看系统与内核信息
cat /etc/os-release
uname -a

# 2) 刷新与加速软件源缓存(可选)
sudo dnf clean all
sudo dnf makecache

# 3) 安装常用工具(建议)
sudo dnf install -y vim tar curl wget net-tools

说明:openEuler 文档中心提供了安装、运维、容器、云原生等多类指南,建议在遇到问题时优先查阅对应章节以获取权威解决方案。

二、安装 Podman 与常用生态工具(兼容 20.03 环境)

Podman 是无守护进程的容器引擎,支持 root 与 rootless 模式;Skopeo 可用于镜像复制与校验。部分 openEuler 20.03 环境中可能没有 Buildah 包,本文采用 Podman 自带的构建能力替代(podman build

bash 复制代码
# 安装 Podman 与 Skopeo(优先保障核心功能可用)
sudo dnf install -y podman skopeo

# 确认版本与环境
podman version
podman info

# 如果使用普通用户(rootless)建议初始化容器目录
podman machine init 2>/dev/null || true

如果你在执行 dnf install -y podman buildah skopeo 时遇到如下错误:

  • Repository ... is listed more than once in the configuration
  • No match for argument: buildah / Unable to find a match: buildah

请按下列步骤排查与修复:

bash 复制代码
# 1) 查看当前启用的仓库,确认是否存在重复或失效条目
sudo dnf repolist all
ls -1 /etc/yum.repos.d/*.repo

# 2) 检查 repo 文件中是否存在重复的同名节(如 OS/everything/EPOL)
sudo grep -n "^\[" /etc/yum.repos.d/*.repo

# 3) 若确认重复,可将其中一个重复条目设置为禁用(enabled=0),再刷新缓存
sudo sed -i 's/^enabled=1/enabled=0/' /etc/yum.repos.d/<重复文件名>.repo
sudo dnf clean all && sudo dnf makecache

# 4) 再次搜索 buildah(可能 20.03 环境缺包,若仍不可用则使用 podman build)
sudo dnf search buildah || true

可选:如需尝试启用 EPOL 仓库(不同环境路径可能不同,请按实际架构 $basearch 调整),示例:

bash 复制代码
sudo tee /etc/yum.repos.d/openEuler-EPOL.repo <<'EOF'
[EPOL]
name=openEuler EPOL
baseurl=https://repo.openEuler.org/openEuler-20.03/EPOL/$basearch/
enabled=1
gpgcheck=0
EOF
sudo dnf makecache

三、运行第一个容器(Nginx 示例)

在云服务器上,最直观的实操是启动一个 Web 服务并通过公网/内网访问。

bash 复制代码
# 拉取官方 Nginx 镜像(优先尝试 Docker Hub)
podman pull docker.io/library/nginx:latest || true

# 如果 Docker Hub 不可达,使用备用镜像源之一(任选可达源):
# GitHub Container Registry(GHCR)
podman pull ghcr.io/nginxinc/nginx-unprivileged:stable || true
# Quay(Bitnami 维护的 Nginx)
podman pull quay.io/bitnami/nginx:latest || true

# 启动容器,将容器 80 端口映射到宿主机 8080 端口
# 按实际成功拉取的镜像名启动(示例以 ghcr.io 为例)
podman run -d --name my-nginx -p 8080:80 ghcr.io/nginxinc/nginx-unprivileged:stable

# 查看容器状态与端口映射
podman ps

如果使用了防火墙(firewalld),需要开放 8080/tcp

bash 复制代码
# 开放 8080 端口并永久生效
sudo firewall-cmd --add-port=8080/tcp
sudo firewall-cmd --add-port=8080/tcp --permanent
sudo firewall-cmd --reload

# 验证端口监听(任选其一)
ss -lntp | grep 8080 || sudo netstat -lntp | grep 8080

验证访问:在本地浏览器或终端访问 http://服务器IP:8080/,看到 Nginx 欢迎页即成功。

镜像源不可达的网络故障修复(Connection timed out / IPv6 unreachable)

如果 curl -I https://registry-1.docker.io/v2/ 出现 443 端口超时或 IPv6 不可达,请按照以下步骤处理:

bash 复制代码
# 1) 仅用 IPv4 进行连通性测试(确认是网络出口问题还是 DNS/IPv6 问题)
curl -4 -I https://registry-1.docker.io/v2/ || true

# 2) 测试备用镜像源连通性(任选其一,成功则优先使用该源)
curl -4 -I https://ghcr.io/ || true
curl -4 -I https://quay.io/ || true
curl -4 -I https://docker.m.daocloud.io/v2/ || true
curl -4 -I https://hub-mirror.c.163.com/ || true

# 3) 配置 containers/image 的 registries.conf(v2 语法示例)
sudo cp /etc/containers/registries.conf /etc/containers/registries.conf.bak
sudo tee /etc/containers/registries.conf <<'EOF'
unqualified-search-registries = ["docker.io", "quay.io", "ghcr.io"]

[[registry]]
prefix = "docker.io"
location = "registry-1.docker.io"
blocked = false
insecure = false

  [[registry.mirror]]
  location = "docker.m.daocloud.io"

  [[registry.mirror]]
  location = "hub-mirror.c.163.com"

  [[registry.mirror]]
  location = "docker.nju.edu.cn"

[[registry]]
prefix = "quay.io"
location = "quay.io"
blocked = false
insecure = false

[[registry]]
prefix = "ghcr.io"
location = "ghcr.io"
blocked = false
insecure = false
EOF

# 4) 刷新后再次拉取(会优先尝试可达的镜像地址)
podman pull nginx:latest || podman pull ghcr.io/nginxinc/nginx-unprivileged:stable || podman pull quay.io/bitnami/nginx:latest

说明:

  • registries.conf 不应填写软件仓库镜像站(如 repo.huaweicloud.com),该站点不是容器镜像仓库;应填写可用的容器镜像源或镜像站(如 GHCR/Quay 或第三方镜像)。
  • 若云侧或企业侧存在出口 443 限制,需要在安全策略中允许访问上述镜像源域名的 443 端口。
  • 如确因网络策略无法访问外部镜像源,可考虑在可联网主机上 podman pullpodman save 为 tar,再通过 scp 传至服务器后 podman load 使用。
bash 复制代码
# 在可联网主机
podman pull docker.io/library/nginx:latest
podman save -o nginx.tar docker.io/library/nginx:latest

# 传输到目标服务器后加载
podman load -i nginx.tar
podman run -d --name my-nginx -p 8080:80 nginx:latest

四、静态站点挂载与持久化

部分 openEuler 20.03 的 Podman 版本不包含 podman volume 子命令。为保证所有环境都可用,推荐使用目录绑定挂载(bind mount)

bash 复制代码
# 方式 A:绑定挂载(推荐,所有版本均可用)
sudo mkdir -p /srv/webdata
echo "<h1>Hello openEuler & Podman</h1>" | sudo tee /srv/webdata/index.html

# 使用你已成功拉取的 Nginx 镜像名(示例以 ECR Public 为例)
podman rm -f my-nginx 2>/dev/null || true
podman run -d --name my-nginx -p 8080:80 \
  -v /srv/webdata:/usr/share/nginx/html:Z \
  public.ecr.aws/docker/library/nginx:1.25-alpine

# 验证访问,页面应展示自定义内容
curl -I http://127.0.0.1:8080/

# 方式 B:--mount 语法(同样是绑定挂载)
podman rm -f my-nginx 2>/dev/null || true
podman run -d --name my-nginx -p 8080:80 \
  --mount type=bind,source=/srv/webdata,target=/usr/share/nginx/html,Z \
  public.ecr.aws/docker/library/nginx:1.25-alpine

# 如你的 Podman 版本支持 volume 子命令,也可以:
podman volume create webdata
podman run -d --name my-nginx -p 8080:80 \
  -v webdata:/usr/share/nginx/html:Z \
  public.ecr.aws/docker/library/nginx:1.25-alpine

说明与排错:

  • :Z 会自动设置 SELinux 上下文,确保容器可访问该目录;若系统未启用 SELinux,可去掉 :Z
  • 若仍提示权限问题,可检查标签与权限:
    • ls -Z /srv/webdata
    • sudo chcon -Rt svirt_sandbox_file_t /srv/webdata
    • 临时排查:sudo setenforce 0(测试后恢复 setenforce 1
  • 使用非 root 的 Nginx 镜像(如 nginx-unprivileged)时,确保目录可读:sudo chmod -R a+rX /srv/webdata

五、构建自定义镜像(Podman Build + Containerfile)

在评测活动中,构建简单镜像是很好的展示点。以下示例使用 Buildah 构建一个轻量化的 Nginx 镜像,将静态页打包进镜像。

bash 复制代码
# 创建工作目录
mkdir -p ~/demo-site && cd ~/demo-site

# 准备静态页
cat > index.html <<'EOF'
<!doctype html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8" />
    <title>openEuler + Podman Demo</title>
  </head>
  <body>
    <h1>openEuler 20.03 容器化部署演示</h1>
    <p>这是使用 Buildah 构建的示例镜像。</p>
  </body>
</html>
EOF

# 编写 Containerfile(与 Dockerfile 类似)
cat > Containerfile <<'EOF'
FROM ghcr.io/nginxinc/nginx-unprivileged:stable
COPY index.html /usr/share/nginx/html/index.html
EOF

# 使用 podman 构建镜像(在 20.03 未提供 buildah 包时的替代方式)
podman build -t demo-nginx:latest .

# 使用 podman 运行新镜像
podman run -d --name demo-nginx -p 8081:80 demo-nginx:latest

验证访问:http://服务器IP:8081。若 GHCR/Quay 也不可达,可先按上文"离线镜像导入"方式将基础镜像导入到本机再执行 podman build

六、容器网络与多容器编排(基础)

Podman 支持创建自定义网络与 Pod(容器组)。这里给出最基础的网络操作示例,便于在评测场景中展示多容器联动。

bash 复制代码
# 查看网络列表并创建新网络
podman network ls
podman network create demo-net

# 启动两个容器并加入同一网络
podman run -d --name demo-redis --network demo-net redis:alpine
podman run -d --name demo-app --network demo-net \
  -e REDIS_HOST=demo-redis \
  docker.io/library/busybox:latest \
  sh -c "ping -c 3 demo-redis && sleep 300"

# 查看网络连接情况
podman inspect demo-app | grep -A3 Networks

七、常见问题与建议

  • 权限与模式:root 与 rootless 模式在挂载、网络上有差异,建议先用 root 模式完成评测,再逐步迁移到 rootless。
  • SELinux:目录挂载时使用 :Z:z,避免访问权限问题。
  • 防火墙与端口:云服务器还需在安全组开放对应端口(如 8080/8081),确保公网访问。
  • 镜像拉取:采用国内镜像加速源(合规范围内)可减少拉取时间;Skopeo 可用于镜像检查与复制。

遇到 "No match for argument: buildah" 的处理

  • 在 openEuler 20.03 环境下,部分仓库不含 Buildah 包;优先使用 podman build 完成镜像构建。
  • 通过 dnf repolist all 与检查 /etc/yum.repos.d/*.repo,清理或禁用重复仓库条目后再刷新缓存。
  • 如需启用 EPOL 仓库,请参考上文"可选"配置,依据实际环境与架构($basearch)调整路径。

总结

本文从环境准备、工具安装、运行 Nginx、数据持久化、镜像构建与网络编排等几个关键步骤,完整演示了在 openEuler 20.03 云服务器上使用 Podman 的基础流程。结合官网与文档中心的信息,可以看出 openEuler 在云原生方向具有良好的生态与实践路径,openEuler 以"面向数字基础设施"的定位与"多架构支持、云原生友好、安全合规"的优势,为企业与个人的容器化实践提供了强有力的底座。

参考资料

相关推荐
倔强的石头_1 小时前
openEuler 在云服务器环境下的系统性能评测与优化实践
操作系统
Nturmoils4 小时前
openEuler 云原生实战:使用 Docker Compose 快速部署企业应用
服务器·操作系统
Nturmoils4 小时前
openEuler 云原生进阶:K3s 轻量级 Kubernetes 集群实战
服务器·操作系统
XPlaza信创开源广场7 小时前
麒麟操作系统 (kylinos) 从入门到精通 -高级教程 - 第85篇 网络服务部署简易教程
操作系统
列逍9 小时前
操作系统初识:从硬件架构到核心原理
运维·服务器·操作系统·硬件架构
zxy28472253011 天前
解决笔记本电脑进入操作系统黑屏只有鼠标的问题
操作系统·win10·鼠标·黑屏·突然
meadel1 天前
windows 系统触摸屏禁用左右滑动
操作系统
Kyle01231 天前
Cache缺失、缺页和TLB缺失的处理机制解析
操作系统·408·计组
REDcker2 天前
软件开发者需要关注CPU指令集差异吗?
linux·c++·操作系统·c·cpu·指令集·加密算法