🔧 阿川の電商水電行
Shopify 顧問、維護與客製化
💡
小任務 / 單次支援方案
單次處理 Shopify 修正/微調
⭐️
維護方案
每月 Shopify 技術支援 + 小修改 + 諮詢
🚀
專案建置
Shopify 功能導入、培訓 + 分階段交付

Docker以外的容器引擎完全指南:從初學者到實踐

最終更新: 2025年11月(已確認支持Kubernetes 1.34)

引言

「容器 = Docker」這種想法或許是許多人心中存在的認知。然而,實際上容器技術的世界還有許多其他選擇。本篇文章將從容器的基礎開始,詳細介紹除Docker以外的主要容器引擎。

2025年11月最新資訊

  • Kubernetes最新版本: v1.34(v1.35預定發佈)
  • 本文章已確認在最新的Kubernetes環境中運行

這篇文章能學到的內容

  • 容器技術的基本概念
  • Docker以外的主要容器引擎特點
  • 各引擎的使用區分
  • 實際的安裝步驟和使用範例

1. 容器技術的基礎知識

1.1 什麼是容器?

"將應用程式及其依賴包裝在一起,並在隔離的環境中運行的技術"。與虛擬機(VM)相比,它有以下特點:

項目 虛擬機 容器
啟動時間 幾分鐘 幾秒鐘
資源消耗 大(整個OS) 小(僅必要部分)
隔離等級 完全隔離 隔離於進程層級
可攜性

1.2 容器引擎是什麼?

"管理容器生命週期(創建、執行、停止和刪除)的軟體"。主要功能包括:

  • 映像管理: 創建、儲存和分發容器的基本映像
  • 容器執行: 從映像啟動和管理容器
  • 網路管理: 配置容器間的通訊
  • 儲存管理: 數據的持久化

1.3 容器的標準規範

  • OCI(開放容器倡議): "容器的執行格式和映像格式的標準"
    • OCI Runtime Spec: 容器執行方式的規範
    • OCI Image Spec: 容器映像的格式規範
  • CRI(容器執行介面): "Kubernetes與容器執行環境之間的介面"

2. 為什麼需要Docker以外的選擇?

Docker是一個很棒的工具,但因以下原因需要替代方案:

2.1 授權和成本問題

  • "Docker Desktop(自2021年9月後)對於大企業的商業用途需收費"
  • 對小型團隊免費,但根據組織的規模,可能產生年費用

2.2 架構挑戰

  • Docker需要守護進程(dockerd)
  • "守護進程以root權限運行的安全風險"
  • 當守護進程停止時,所有容器均會受到影響

2.3 用例的多樣化

  • 在Kubernetes環境中,輕量級執行環境更受歡迎
  • 在CI/CD環境中,無特權地執行會更安全
  • 在微服務架構中,針對特定用途的工具更有效

3. 主要容器引擎詳解

3.1 Podman(波段人)

概述

Podman是由Red Hat開發的,非常受歡迎的Docker替代容器引擎。

主要特點

1. 無守護進程架構

  • 不需要背景守護進程
  • 容器作為普通進程運行
  • 提高系統穩定性

2. Rootless執行

  • 可以在無root權限的情況下運行容器
  • "大幅降低安全風險"
  • 在多用戶環境中安全使用

3. 與Docker的兼容性

  • 只需將docker命令替換為podman即可運作
  • 可以直接使用Dockerfile
  • 與Docker Hub等註冊表兼容

4. Pod的概念

  • 支持與Kubernetes兼容的Pod(多容器組合)
  • 易於遷移到Kubernetes

優點

  • 高安全性
  • 簡單遷移自Docker
  • 擁有Red Hat的商業支持
  • 與systemd的整合優秀

缺點

  • 與Docker Compose的完全兼容性不足(可通過podman-compose應對)
  • Windows的原生支持有限
  • 生態系統不如Docker成熟

適用場景

  • 重視安全性的環境
  • 開發機器的Docker替代品
  • CI/CD流水線
  • Linux環境的生產運行

安裝與快速啟動

# macOS(使用Homebrew)
brew install podman

# Podman Machine(macOS/Windows用)初始化
podman machine init
podman machine start

# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y podman

# RHEL/CentOS/Fedora
sudo dnf install -y podman

# 確認版本
podman --version

# 運行Nginx容器
podman run -d -p 8080:80 --name web nginx

# 列出容器
podman ps

# 停止和刪除容器
podman stop web
podman rm web

與Docker命令的對應

# Docker命令 → Podman命令
docker run    → podman run
docker ps     → podman ps
docker build  → podman build
docker images → podman images

# 設定別名後即為完全兼容
alias docker=podman

3.2 containerd(容器d)

概述

"containerd最初是Docker的核心組件,現在是CNCF(雲原生計算基金會)的項目"。

2025年11月最新資訊

  • 最新版本: containerd 2.0.x(2024年發佈)
  • 穩定版: containerd 1.7.x(維護階段)
  • 推薦: 新建環境使用2.0.x,現階段環境也可用1.7.x
  • Ubuntu 24.04: 官方儲存庫是1.7.x,2.0.x可從GitHub發佈頁面獲得

主要特點

1. 輕量且簡單

  • 僅提供容器執行所需的最基礎功能
  • 提供低級API
  • 開銷小

2. Kubernetes標準執行環境

  • Kubernetes推薦的容器執行環境
  • 完全遵循CRI(容器執行介面)
  • 許多管理Kubernetes服務中被採用

3. 行業標準

  • "被Docker、Kubernetes、AWS ECS、Google Cloud Run等使用"
  • 遵循OCI標準
  • 高穩定性和可靠性

優點

  • 十分輕量化,性能高
  • 與Kubernetes的配合絕佳
  • 在生產環境有著穩定的實績
  • CNCF項目,保持中立性

缺點

  • CLI功能有限(較高級操作需使用nerdctl)
  • 不適合初學者
  • 無像Docker那樣的一體化開發體驗
  • 映像構建功能需其他工具(BuildKit)

適用場景

  • Kubernetes叢集的執行環境
  • 生產環境的輕量執行環境
  • 內嵌容器執行環境的產品開發
  • 雲原生架構

安裝與快速啟動

方法1: Ubuntu官方儲存庫(containerd 1.7.x)
# 在Ubuntu/Debian上安裝
# 安裝依賴
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release

# 添加Docker官方GPG密鑰
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 設定儲存庫
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安裝containerd
sudo apt-get update
sudo apt-get install -y containerd.io

# 確認版本
containerd --version
# containerd containerd.io 1.7.x

# 啟動containerd
sudo systemctl enable --now containerd
方法2: GitHub發佈頁面(containerd 2.0.x - 最新版)
# 安裝最新的containerd 2.0.x
# 確認版本: https://github.com/containerd/containerd/releases

CONTAINERD_VERSION="2.0.6"

# 下載二進制文件
wget https://github.com/containerd/containerd/releases/download/v${CONTAINERD_VERSION}/containerd-${CONTAINERD_VERSION}-linux-amd64.tar.gz

# 安裝
sudo tar Cxzvf /usr/local containerd-${CONTAINERD_VERSION}-linux-amd64.tar.gz

# 下載systemd服務文件
sudo wget -O /etc/systemd/system/containerd.service https://raw.githubusercontent.com/containerd/containerd/main/containerd.service

# 啟用並啟動服務
sudo systemctl daemon-reload
sudo systemctl enable --now containerd

# 確認版本
containerd --version
# containerd github.com/containerd/containerd v2.0.6

# 生成配置文件
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
轉移到containerd 2.0時的注意事項
  • 從v1.x到v2.0的配置文件格式已更改
  • 轉移前使用 containerd config migrate 命令進行配置驗證
  • CRI v1alpha2在2.0中已刪除(v1.6/v1.7繼續支持)
nerdctl(Docker兼容CLI)的安裝
# 安裝nerdctl(containerd 1.7/2.0通用)
NERDCTL_VERSION="1.7.6"
wget https://github.com/containerd/nerdctl/releases/download/v${NERDCTL_VERSION}/nerdctl-full-${NERDCTL_VERSION}-linux-amd64.tar.gz
sudo tar Cxzvf /usr/local nerdctl-full-${NERDCTL_VERSION}-linux-amd64.tar.gz

# 執行容器(使用nerdctl)
sudo nerdctl run -d -p 8080:80 --name web nginx

# 列出容器
sudo nerdctl ps

# 列出映像
sudo nerdctl images
配置containerd
# 生成默認配置
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml

# 編輯配置(使用systemd cgroup驅動) 
sudo nano /etc/containerd/config.toml
# [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
#   SystemdCgroup = true

# 重新啟動containerd
sudo systemctl restart containerd

3.3 CRI-O(驅動)

概述

"CRI-O是專為Kubernetes設計的輕量級容器執行環境",專注於與Kubernetes的整合。

主要特點

1. 專為Kubernetes設計

  • 專注於CRI(容器執行介面)的實現
  • 無Kubernetes不需要的功能
  • 完全隨Kubernetes版本更新

2. 遵循OCI標準

  • "完全遵循開放容器倡議標準"
  • 支持多種執行環境,如runc、crun、Kata
  • 靈活的架構

3. 強調安全性

  • 最小權限原則
  • 與SELinux、AppArmor整合
  • 支持Seccomp配置文件

優點

  • 在Kubernetes環境中優化的性能
  • 強化的安全性
  • 在Red Hat OpenShift中作為默認選擇
  • 保證Kubernetes與版本的同步

缺點

  • 不預期在Kubernetes以外使用
  • 不適合Standalone的開發用途
  • 文檔基於Kubernetes的假設
  • 學習資源有限

適用場景

  • Kubernetes叢集(特別重視安全性)
  • Red Hat OpenShift環境
  • 企業Kubernetes環境
  • 合規性要求高的環境

安裝(Kubernetes節點範例)

# 在Ubuntu 20.04上安裝
# 前提條件
sudo apt-get update
sudo apt-get install -y software-properties-common curl

# 添加CRI-O儲存庫(版本1.30用 - 支持Kubernetes 1.34)
export OS=xUbuntu_20.04
export VERSION=1.30

echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.list

curl -L https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$VERSION/$OS/Release.key | sudo apt-key add -
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/Release.key | sudo apt-key add -

# 安裝
sudo apt-get update
sudo apt-get install -y cri-o cri-o-runc

# 啟動CRI-O
sudo systemctl enable --now crio

# 確認狀態
sudo systemctl status crio

# 使用crictl(CRI-O CLI)
sudo crictl version
sudo crictl images
sudo crictl ps

與Kubernetes的整合

Kubernetes 1.34支持的設定範例
以下配置已確認在Kubernetes 1.34環境運行。

# kubeadm配置範例(/etc/kubernetes/kubeadm-config.yaml)
# Kubernetes 1.34支持 - 使用v1beta4
apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
nodeRegistration:
  criSocket: unix:///var/run/crio/crio.sock
---
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
networking:
  podSubnet: 10.244.0.0/16
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd

3.4 LXC/LXD(Linux容器)

概述

"LXC是Linux容器的先驅,而LXD則是其上層介面"。提供類似虛擬機和容器的「系統容器」。

主要特點

1. 系統容器

  • 運行完整的Linux系統
  • 包含init系統(systemd)
  • 使用感受上接近虛擬機

2. 為長時間運行最優化

  • 適合狀態保持的工作負載
  • 可以用作虛擬機的替代
  • 支持遷移功能

3. LXD特有功能

  • RESTful API
  • 映像伺服器
  • 叢集功能
  • 快照與備份

優點

  • 相比虛擬機更輕量和快速
  • 提供完整的Linux環境
  • 靈活的網路與儲存管理
  • 擁有Canonical的支持

缺點

  • 與應用容器(如Docker)有不同的思想
  • 映像生態系統較小
  • 不適合雲原生用途
  • 學習曲線稍高

適用場景

  • 開發與測試環境
  • 輕量虛擬機替代
  • 狀態保持的應用
  • 多租戶環境

安裝與快速啟動

# 在Ubuntu/Debian上安裝
sudo apt-get update
sudo apt-get install -y lxd

# 初始設置(交互式)
sudo lxd init
# 沒有特別需求的話按Enter鍵即可

# 將用戶加入lxd組
sudo usermod -aG lxd $USER
newgrp lxd

# 查看可用映像
lxc image list images: | grep ubuntu

# 創建並啟動Ubuntu 22.04容器
lxc launch images:ubuntu/22.04 my-ubuntu

# 列出容器
lxc list

# 登入容器
lxc exec my-ubuntu -- /bin/bash

# 停止容器
lxc stop my-ubuntu

# 刪除容器
lxc delete my-ubuntu

實踐例:建立Web伺服器

# 在Ubuntu 22.04中建立Nginx伺服器
lxc launch images:ubuntu/22.04 webserver

# 進入容器
lxc exec webserver -- bash

# 在容器內安裝Nginx
apt update
apt install -y nginx
systemctl enable nginx
exit

# 設定端口轉發
lxc config device add webserver myport80 proxy listen=tcp:0.0.0.0:8080 connect=tcp:127.0.0.1:80

# 在瀏覽器中訪問localhost:8080

3.5 Buildah(構建工具)

概述

"Buildah是一個專注於構建容器映像的工具"。可以通過腳本構建映像,無需使用Dockerfile。

主要特點

1. 專注於構建

  • 僅聚焦於映像構建
  • 執行由Podman等其他工具來進行
  • 單一責任原則

2. 無需Dockerfile

  • 使用Bash腳本構建映像
  • 提供更細緻的控制
  • 也可使用Dockerfile

3. 層控制

  • 可控制創建層的時機
  • 優化映像大小
  • 靈活的緩存策略

優點

  • 容易優化映像大小
  • 無需root權限進行構建
  • 透過腳本自動化簡單
  • 能夠發揮現有的Shell腳本資源

缺點

  • 學習曲線高於Dockerfile
  • 容器執行需要另行工具
  • 社區規模小於Docker
  • 文檔有限

適用場景

  • CI/CD流水線
  • 對映像大小優化至關重要的場景
  • 複雜的構建過程
  • 在Dockerfile中難以表達的構建

安裝與快速啟動

# 在Ubuntu/Debian上安裝
sudo apt-get update
sudo apt-get install -y buildah

# RHEL/CentOS/Fedora
sudo dnf install -y buildah

# 確認版本
buildah --version

# 基本用法:從Dockerfile構建
cat << 'EOF' > Dockerfile
FROM alpine:latest
RUN apk add --no-cache nginx
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
EOF

buildah bud -t my-nginx .

# 使用腳本映像構建(無Dockerfile)
#!/bin/bash

# 創建基礎容器
container=$(buildah from alpine:latest)

# 安裝包
buildah run $container apk add --no-cache nginx

# 複製配置文件
buildah copy $container ./nginx.conf /etc/nginx/nginx.conf

# 開放端口
buildah config --port 80 $container

# 設定啟動命令
buildah config --cmd "nginx -g 'daemon off;'" $container

# 以映像提交
buildah commit $container my-nginx:custom

# 清理
buildah rm $container

# 列出映像
buildah images

# 使用Podman運行映像
podman run -d -p 8080:80 my-nginx:custom

高級範例:多階段構建

#!/bin/bash

# 構建階段
builder=$(buildah from golang:1.21-alpine)
buildah run $builder apk add --no-cache git
buildah copy $builder . /app
buildah config --workingdir /app $builder
buildah run $builder go build -o myapp .

# 獲取構建成果
buildah mount $builder
container_path=$(buildah mount $builder)
cp $container_path/app/myapp ./myapp
buildah umount $builder

# 執行階段
runtime=$(buildah from alpine:latest)
buildah run $runtime apk add --no-cache ca-certificates
buildah copy $runtime ./myapp /usr/local/bin/myapp
buildah config --entrypoint '["/usr/local/bin/myapp"]' $runtime
buildah commit $runtime myapp:latest

# 清理
buildah rm $builder $runtime
rm ./myapp

4. 容器引擎比較表

4.1 功能比較

功能 Docker Podman containerd CRI-O LXC/LXD Buildah
無守護進程
Rootless執行
Docker兼容CLI △※
Kubernetes整合
映像構建
Pod支援
系統容器
商業支持

※若使用nerdctl則可達到Docker兼容性

4.2 性能比較

指標 Docker Podman containerd CRI-O LXC/LXD
啟動時間 普通 稍快
記憶體使用量 普通 最小 最小 普通
映像拉取速度 普通 普通 普通
構建速度 普通 稍慢 - - 普通

4.3 用例推薦

用例 推薦引擎 理由
本地開發(Docker替代) Podman "Docker兼容的CLI,易於移行,rootless執行安全"
Kubernetes叢集 containerd / CRI-O 輕量且優化
CI/CD流水線 Podman + Buildah rootless安全,構建優化
虛擬機替代 LXD 提供完整的OS環境
映像構建優化 Buildah 提供細緻控制,大小優化
企業生產環境 Docker Enterprise / Podman 商業支持,實績
多租戶托管 LXD 高分離性
邊緣計算 containerd 輕量,最小資源

5. 實踐篇:從Docker到其他引擎的遷移

5.1 從Docker遷移到Podman

步驟1: 安裝Podman

# macOS
brew install podman
podman machine init
podman machine start

# Linux
sudo apt-get install -y podman  # Ubuntu/Debian
sudo dnf install -y podman      # RHEL/Fedora

步驟2: 替換Docker命令

# 設定別名(bash的情況下)
echo "alias docker=podman" >> ~/.bashrc
source ~/.bashrc

# 或者,安裝podman-docker包(僅限Linux)
sudo apt-get install -y podman-docker

步驟3: 遷移現有映像和容器

# 從Docker導出映像
docker save -o myimage.tar myimage:latest

# 在Podman中導入
podman load -i myimage.tar

# 或者,從Docker Hub直接拉取
podman pull docker.io/library/nginx:latest

步驟4: Docker Compose的替代

# 安裝podman-compose
pip3 install podman-compose

# 使用方式與Docker Compose相同
podman-compose up -d
podman-compose ps
podman-compose down

docker-compose.yml範例

version: '3'
services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
  db:
    image: postgres:14
    environment:
      POSTGRES_PASSWORD: example
    volumes:
      - db-data:/var/lib/postgresql/data

volumes:
  db-data:

步驟5: 使用systemd設定自動啟動

# 從容器生成systemd單元檔
podman generate systemd --new --name web > ~/.config/systemd/user/container-web.service

# 啟用服務
systemctl --user enable container-web.service
systemctl --user start container-web.service

# 確認狀態
systemctl --user status container-web.service

5.2 在Kubernetes中使用containerd

在現有叢集中從Docker遷移到containerd

# 1. 安裝containerd(所有節點)
sudo apt-get install -y containerd.io

# 2. containerd配置
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml

# 3. 啟用systemd cgroup驅動
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml

# 4. 啟動containerd
sudo systemctl enable --now containerd

# 5. kubelet配置變更
sudo nano /var/lib/kubelet/kubeadm-flags.env
# --container-runtime=remote
# --container-runtime-endpoint=unix:///run/containerd/containerd.sock

# 6. 重新啟動kubelet
sudo systemctl restart kubelet

# 7. 確認節點狀態
kubectl get nodes -o wide
# 確認CONTAINER-RUNTIME列為containerd

新建Kubernetes叢集(使用containerd)

Kubernetes 1.34支持的配置(kubeadm v1beta4)
以下為Kubernetes 1.34環境的推薦配置。

# kubeadm配置檔(v1beta4 - 支持Kubernetes 1.34)
cat << EOF > kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
nodeRegistration:
  criSocket: unix:///run/containerd/containerd.sock
  imagePullSerial: false  # v1beta4: 默認並行拉取映像
---
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
networking:
  podSubnet: 10.244.0.0/16
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
EOF

# 初始化叢集
sudo kubeadm init --config=kubeadm-config.yaml

# 配置kubeconfig
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 安裝CNI插件(例如:Calico)
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

# 確認節點
kubectl get nodes

6. 最新Kubernetes API的棄用資訊(2025年版)

:::note warn
重要事項:Kubernetes 1.32-1.34 中棄用的API
以下API已棄用或刪除:
:::

Kubernetes v1.32(2025年初)

  • 刪除了 flowcontrol.apiserver.k8s.io/v1beta3
    • FlowSchemaPriorityLevelConfiguration 請使用 v1
    • 自v1.29可用

Kubernetes v1.33(2025年4月發佈)

  • Endpoints API已棄用
    • 如果直接從工作負載或腳本使用 Endpoints API,請遷移至 EndpointSlices
  • 狀態.nodeInfo.kubeProxyVersion字段已刪除
    • 自v1.31棄用,v1.33完全刪除

遷移的推薦事項

  1. 使用kubectl api-resources確認正在使用的API版本
  2. 使用kubectl convert命令將清單轉換為最新版本
  3. 更新CI/CD流水線的Kubernetes API客戶端

詳細資訊: Kubernetes API棄用指南


7. 疑難排解

7.1 與Podman相關

問題: "permission denied"錯誤

# 原因: rootless模式下的存儲權限問題
# 解決方案: 檢查subUID/subGID的設定
cat /etc/subuid
cat /etc/subgid

# 如果用戶不存在,則添加
sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 $USER

# 重置Podman配置
podman system reset

問題: "Error: short-name resolution"

# 原因: 映像名稱不明
# 解決方案: 指定完整的註冊表路徑
podman pull docker.io/library/nginx:latest

# 或者,在registries.conf中設定優先註冊表
sudo nano /etc/containers/registries.conf
# unqualified-search-registries = ["docker.io"]

問題: 8080端口無法使用


# 原因: 在rootless模式中,1024以下的端口需要特權

---

原文出處:https://qiita.com/keitah/items/fb7fc280e49f4408ca63

精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝22   💬4   ❤️6
679
🥈
我愛JS
📝1   💬4   ❤️2
45
🥉
酷豪
1
#5
1
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
🔧 阿川の電商水電行
Shopify 顧問、維護與客製化
💡
小任務 / 單次支援方案
單次處理 Shopify 修正/微調
⭐️
維護方案
每月 Shopify 技術支援 + 小修改 + 諮詢
🚀
專案建置
Shopify 功能導入、培訓 + 分階段交付