最終更新: 2025年11月(已確認支持Kubernetes 1.34)
「容器 = Docker」這種想法或許是許多人心中存在的認知。然而,實際上容器技術的世界還有許多其他選擇。本篇文章將從容器的基礎開始,詳細介紹除Docker以外的主要容器引擎。
2025年11月最新資訊
"將應用程式及其依賴包裝在一起,並在隔離的環境中運行的技術"。與虛擬機(VM)相比,它有以下特點:
| 項目 | 虛擬機 | 容器 | 
|---|---|---|
| 啟動時間 | 幾分鐘 | 幾秒鐘 | 
| 資源消耗 | 大(整個OS) | 小(僅必要部分) | 
| 隔離等級 | 完全隔離 | 隔離於進程層級 | 
| 可攜性 | 低 | 高 | 
"管理容器生命週期(創建、執行、停止和刪除)的軟體"。主要功能包括:
Docker是一個很棒的工具,但因以下原因需要替代方案:
Podman是由Red Hat開發的,非常受歡迎的Docker替代容器引擎。
1. 無守護進程架構
2. Rootless執行
3. 與Docker的兼容性
docker命令替換為podman即可運作4. Pod的概念
# 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命令 → Podman命令
docker run    → podman run
docker ps     → podman ps
docker build  → podman build
docker images → podman images
# 設定別名後即為完全兼容
alias docker=podman
"containerd最初是Docker的核心組件,現在是CNCF(雲原生計算基金會)的項目"。
2025年11月最新資訊
1. 輕量且簡單
2. Kubernetes標準執行環境
3. 行業標準
# 在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
# 安裝最新的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 config migrate 命令進行配置驗證# 安裝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
# 生成默認配置
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
"CRI-O是專為Kubernetes設計的輕量級容器執行環境",專注於與Kubernetes的整合。
1. 專為Kubernetes設計
2. 遵循OCI標準
3. 強調安全性
# 在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 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
"LXC是Linux容器的先驅,而LXD則是其上層介面"。提供類似虛擬機和容器的「系統容器」。
1. 系統容器
2. 為長時間運行最優化
3. LXD特有功能
# 在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
# 在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
"Buildah是一個專注於構建容器映像的工具"。可以通過腳本構建映像,無需使用Dockerfile。
1. 專注於構建
2. 無需Dockerfile
3. 層控制
# 在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
| 功能 | Docker | Podman | containerd | CRI-O | LXC/LXD | Buildah | 
|---|---|---|---|---|---|---|
| 無守護進程 | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | 
| Rootless執行 | △ | ✅ | △ | △ | ❌ | ✅ | 
| Docker兼容CLI | ✅ | ✅ | △※ | ❌ | ❌ | △ | 
| Kubernetes整合 | △ | ✅ | ✅ | ✅ | ❌ | ❌ | 
| 映像構建 | ✅ | ✅ | △ | ❌ | ✅ | ✅ | 
| Pod支援 | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | 
| 系統容器 | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | 
| 商業支持 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 
※若使用nerdctl則可達到Docker兼容性
| 指標 | Docker | Podman | containerd | CRI-O | LXC/LXD | 
|---|---|---|---|---|---|
| 啟動時間 | 普通 | 稍快 | 快 | 快 | 快 | 
| 記憶體使用量 | 普通 | 少 | 最小 | 最小 | 普通 | 
| 映像拉取速度 | 普通 | 普通 | 快 | 快 | 普通 | 
| 構建速度 | 普通 | 稍慢 | - | - | 普通 | 
| 用例 | 推薦引擎 | 理由 | 
|---|---|---|
| 本地開發(Docker替代) | Podman | "Docker兼容的CLI,易於移行,rootless執行安全" | 
| Kubernetes叢集 | containerd / CRI-O | 輕量且優化 | 
| CI/CD流水線 | Podman + Buildah | rootless安全,構建優化 | 
| 虛擬機替代 | LXD | 提供完整的OS環境 | 
| 映像構建優化 | Buildah | 提供細緻控制,大小優化 | 
| 企業生產環境 | Docker Enterprise / Podman | 商業支持,實績 | 
| 多租戶托管 | LXD | 高分離性 | 
| 邊緣計算 | containerd | 輕量,最小資源 | 
# 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
# 設定別名(bash的情況下)
echo "alias docker=podman" >> ~/.bashrc
source ~/.bashrc
# 或者,安裝podman-docker包(僅限Linux)
sudo apt-get install -y podman-docker
# 從Docker導出映像
docker save -o myimage.tar myimage:latest
# 在Podman中導入
podman load -i myimage.tar
# 或者,從Docker Hub直接拉取
podman pull docker.io/library/nginx:latest
# 安裝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:
# 從容器生成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
# 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 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
:::note warn
重要事項:Kubernetes 1.32-1.34 中棄用的API
以下API已棄用或刪除:
:::
flowcontrol.apiserver.k8s.io/v1beta3 
FlowSchema 和 PriorityLevelConfiguration 請使用 v1Endpoints API,請遷移至 EndpointSlices kubectl api-resources確認正在使用的API版本kubectl convert命令將清單轉換為最新版本詳細資訊: Kubernetes API棄用指南
# 原因: rootless模式下的存儲權限問題
# 解決方案: 檢查subUID/subGID的設定
cat /etc/subuid
cat /etc/subgid
# 如果用戶不存在,則添加
sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 $USER
# 重置Podman配置
podman system reset
# 原因: 映像名稱不明
# 解決方案: 指定完整的註冊表路徑
podman pull docker.io/library/nginx:latest
# 或者,在registries.conf中設定優先註冊表
sudo nano /etc/containers/registries.conf
# unqualified-search-registries = ["docker.io"]
# 原因: 在rootless模式中,1024以下的端口需要特權
---
原文出處:https://qiita.com/keitah/items/fb7fc280e49f4408ca63