前言

openEuler 是面向數字基礎設施的開源操作系統,由開放原子開源基金會孵化,面向服務器、雲計算、邊緣計算與嵌入式等核心場景,致力於提供穩定、安全、可擴展的基礎軟件平台。其社區長期迭代,形成了完善的版本發佈體系、工具鏈與文檔生態,為開發者與企業在生產環境落地提供堅實支撐。 image.png

在架構支持方面,openEuler 面向多樣性計算架構,覆蓋 ARM、x86、RISC‑V、LoongArch、PowerPC、SW‑64 等,幫助用户在不同硬件平台上獲得一致的體驗與能力;在合規方面遵循木蘭寬鬆許可證第 2 版(MulanPSL2),以開放協作的方式推動生態共建。綜合來看,openEuler 在穩定性、性能、安全合規與雲原生友好方面表現突出,適合在企業與個人的評測、試用與生產場景中進行系統性驗證與應用。(產品頁:https://www.openEuler.org/;文檔中心:https://docs.openEuler.openatom.cn/zh/) image.png

核心特性與優勢(概覽):

  • 多架構支持與一致性體驗: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、鏡像源與網絡策略進行排錯與優化的運維人員

快速入口:

  • 產品地址:https://www.openEuler.org/
  • 評測地址:https://www.openEuler.org/
  • 使用説明(文檔中心):https://docs.openEuler.openatom.cn/zh/

下文將以“環境確認 → 安裝與排錯 → 啓動 Nginx → 持久化與構建 → 網絡與編排 → 常見問題”的順序展開

測試與實操環境

  • 雲服務提供商:華為雲 ECS(彈性雲服務器)
  • 操作系統:openEuler 20.03 64bit
  • 系統盤:40GiB
  • 網絡:VPC 環境

image.png

一、準備工作

為保證後續安裝順利,先完成基礎環境的確認與源加速

# 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

059a0865d02b767e17f9ee214d03a1e2.png

説明:openEuler 文檔中心提供了安裝、運維、容器、雲原生等多類指南,建議在遇到問題時優先查閲對應章節以獲取權威解決方案。 image.png

二、安裝 Podman 與常用生態工具(兼容 20.03 環境)

Podman 是無守護進程的容器引擎,支持 root 與 rootless 模式;Skopeo 可用於鏡像複製與校驗。部分 openEuler 20.03 環境中可能沒有 Buildah 包,本文采用 Podman 自帶的構建能力替代(podman build

# 安裝 Podman 與 Skopeo(優先保障核心功能可用)
sudo dnf install -y podman skopeo

# 確認版本與環境
podman version
podman info

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

image.png

如果你在執行 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

請按下列步驟排查與修復:

# 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 調整),示例:

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 服務並通過公網/內網訪問。

# 拉取官方 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

# 開放 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 歡迎頁即成功。

image.png

鏡像源不可達的網絡故障修復(Connection timed out / IPv6 unreachable)

如果 curl -I https://registry-1.docker.io/v2/ 出現 443 端口超時或 IPv6 不可達,請按照以下步驟處理: image.png

# 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 使用。
# 在可聯網主機
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)

# 方式 A:綁定掛載(推薦,所有版本均可用)
sudo mkdir -p /srv/webdata
echo "Hello openEuler & Podman" | 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 鏡像,將靜態頁打包進鏡像。

# 創建工作目錄
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>
    openEuler 20.03 容器化部署演示
    <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(容器組)。這裏給出最基礎的網絡操作示例,便於在評測場景中展示多容器聯動。

# 查看網絡列表並創建新網絡
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 以“面向數字基礎設施”的定位與“多架構支持、雲原生友好、安全合規”的優勢,為企業與個人的容器化實踐提供了強有力的底座。

參考資料

  • [ ] openEuler 官網(產品地址):https://www.openEuler.org/
  • [ ] openEuler 文檔中心(使用説明):https://docs.openEuler.openatom.cn/zh/