Fedora Silverblue 容器支持情况详解 从 Docker Podman 到 Kubernetes 的实践指南

引言:Fedora Silverblue 与容器技术的完美融合
Fedora Silverblue 是 Fedora 项目的一个创新变体,它采用不可变(immutable)操作系统设计,使用 rpm-ostree 作为其包管理系统。这种设计带来了极高的系统稳定性和安全性,特别适合容器化工作负载。Silverblue 的核心优势在于其原子更新机制、回滚能力以及与容器技术的天然亲和力。
在 Silverblue 上,容器化应用是首选的部署方式。系统本身不鼓励直接安装传统 RPM 包,而是推荐使用 Flatpak、Toolbox 或直接运行容器。本文将深入探讨 Silverblue 对 Docker、Podman 和 Kubernetes 的支持情况,并提供详细的实践指南。
一、Silverblue 的容器化基础
1.1 不可变系统的容器优势
Silverblue 的不可变性意味着:
系统分区只读
:核心系统文件无法被修改,防止意外破坏
原子更新
:系统更新要么完全成功,要么完全失败,不会处于中间状态
快速回滚
:如果更新出现问题,可以立即回滚到之前的版本
环境一致性
:所有开发者和生产环境使用相同的系统镜像
这些特性与容器技术的理念高度契合,容器同样强调环境一致性、隔离性和可重复性。
1.2 Toolbox:Silverblue 的开发环境容器
Toolbox 是 Silverblue 的核心工具,它创建了一个基于 DNF 的容器化开发环境:
# 创建一个新的 toolbox 容器
toolbox create myproject-toolbox

# 进入容器
toolbox enter myproject-toolbox

# 在容器内安装开发工具
sudo dnf install gcc python3-devel git
Toolbox 容器与主机共享网络、Home 目录和 USB 设备,但保持独立的软件环境。这解决了在不可变系统上进行开发的问题。
二、Docker 在 Silverblue 上的支持与实践
2.1 Docker 的安装与配置
虽然 Silverblue 推荐使用 Podman,但 Docker 仍然可以安装和运行。由于系统的不可变性,我们需要使用 rpm-ostree 安装 Docker:
# 安装 Docker(需要重启)
sudo rpm-ostree install docker docker-compose

# 重启系统以应用更改
systemctl reboot
安装后,Docker 服务需要手动启动:
# 启动 Docker 服务
sudo systemctl enable –now docker

# 将用户添加到 docker 组(避免每次使用 sudo)
sudo usermod -aG docker $USER
# 需要重新登录或使用 newgrp docker
2.2 Docker 在 Silverblue 上的限制
系统层安装
:Docker 作为系统层包安装,更新时需要重新部署
存储驱动问题
:建议使用 overlay2 驱动
性能考虑
:在 Silverblue 上,Docker 可能比 Podman 慢一些
2.3 Docker 实践示例
# 运行一个简单的 Nginx 容器
docker run -d -p 8080:80 –name web nginx

# 查看运行中的容器
docker ps

# 构建一个自定义镜像
# Dockerfile
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD [“python”, “app.py”]

# 构建命令
docker build -t myapp:latest .

# 使用 Docker Compose
# docker-compose.yml
version: ‘3’
services:
web:
image: nginx:alpine
ports:
– “8080:80″
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: example
2.4 Docker 数据持久化
# 创建命名卷
docker volume create mydata

# 使用卷运行容器
docker run -d -v mydata:/data –name app myimage

# 备份卷数据
docker run –rm -v mydata:/data -v $(pwd):/backup alpine tar czf /backup/mydata.tar.gz /data
三、Podman:Silverblue 的原生容器工具
3.1 Podman 的优势
Podman 是 Red Hat 推荐的容器工具,在 Silverblue 上具有以下优势:
无守护进程
:不需要后台服务,更安全
rootless 模式
:普通用户可以直接运行容器,无需 sudo
与 systemd 集成
:可以轻松管理容器服务
兼容 Docker CLI
:大多数 Docker 命令可以直接使用
3.2 Podman 安装与配置
Podman 在 Silverblue 上预装,但可能需要更新:
# 检查 Podman 版本
podman –version

# 如果需要更新
sudo rpm-ostree upgrade

# 配置 rootless 模式(通常已自动配置)
# 检查是否支持
podman info –format ‘{{.Host.Security.Rootless}}’

# 如果未配置,需要设置
sudo usermod –add-subuids 100000-165535 –add-subgids 100000-165535 $USER
# 重新登录
3.3 Podman 基本使用
# 运行容器(与 Docker 命令相同)
podman run -d -p 8080:80 –name web nginx

# 构建镜像
podman build -t myapp:latest .

# 查看容器
podman ps
podman images

# 管理容器生命周期
podman start/stop/restart mycontainer
podman rm mycontainer

# 查看容器日志
podman logs -f mycontainer
3.4 Podman Rootless 模式详解
# 以普通用户身份运行容器
podman run -d -p 8080:80 –name userweb nginx

# 查看用户命名空间映射
cat /etc/subuid
cat /etc/subgid

# rootless 容器的数据存储位置
~/.local/share/containers/storage/

# 配置 rootless 容器的网络
# 编辑 ~/.config/containers/containers.conf
[containers]
netns=”bridge”

# 使用 slirp4netns(默认)或 pasta
podman run –network=pasta:–address,10.0.2.0 –name web nginx
3.5 Podman 与 Systemd 集成
这是 Silverblue 上部署服务的推荐方式:
# 生成 systemd 服务文件
podman generate systemd –new –name mycontainer > ~/.config/systemd/user/mycontainer.service

# 重新加载 systemd
systemctl –user daemon-reload

# 启用并启动服务
systemctl –user enable –now mycontainer.service

# 查看服务状态
systemctl –user status mycontainer.service

# 设置开机自启(需要启用 linger)
sudo loginctl enable-linger $USER

# 查看所有用户服务
systemctl –user list-unit-files
3.6 Podman 网络管理
# 创建自定义网络
podman network create mynet

# 查看网络
podman network ls

# 运行容器加入自定义网络
podman run -d –network mynet –name db postgres:13

# 查看网络详情
podman network inspect mynet

# 删除网络
podman network rm mynet

# 使用 Macvlan 网络(需要特权)
podman network create -d macvlan -o parent=eth0 macvlan_net
podman run -d –network macvlan_net –name app myapp
3.7 Podman 卷管理
# 创建命名卷
podman volume create myvolume

# 查看卷
podman volume ls

# 运行容器使用卷
podman run -d -v myvolume:/app/data –name app myimage

# 使用绑定挂载(主机目录)
podman run -d -v /host/path:/container/path –name app myimage

# 使用 tmpfs
podman run -d –tmpfs /tmp –name app myimage

# 备份和恢复卷
podman run –rm -v myvolume:/data -v $(pwd):/backup alpine tar czf /backup/volume.tar.gz /data
podman run –rm -v myvolume:/data -v $(pwd):/backup alpine sh -c “cd /data && tar xzf /backup/volume.tar.gz”
3.8 Podman 高级功能
3.8.1 Pod(Podman 的 Pod)
# 创建 Pod
podman pod create –name mypod -p 8080:80

# 查看 Pod
podman pod ps

# 在 Pod 中运行容器
podman run -d –pod mypod –name web nginx
podman run -d –pod mypod –name db postgres:13

# 查看 Pod 中的容器
podman pod inspect mypod

# 删除 Pod(会删除其中所有容器)
podman pod rm mypod
3.8.2 容器健康检查
# 在 Dockerfile 中定义健康检查
FROM nginx:alpine
HEALTHCHECK –interval=30s –timeout=3s –start-period=5s –retries=3 \
CMD curl -f http://localhost/ || exit 1

# 运行时指定健康检查
podman run -d \
–health-cmd=”curl -f http://localhost/ || exit 1″ \
–health-interval=30s \
–health-timeout=3s \
–health-retries=3 \
–name web nginx
3.8.3 容器资源限制
# 限制 CPU 使用
podman run -d –cpus=1.5 –name app myapp

# 限制内存使用
podman run -d –memory=512m –memory-swap=1g –name app myapp

# 限制 CPU 核心
podman run -d –cpuset-cpus=0,1 –name app myapp

# 设置优先级
podman run -d –cpu-shares=512 –name app myapp
3.9 Podman 与 Buildah 和 Skopeo
Podman 生态系统还包括:
Buildah
:专注于构建 OCI 镜像
Skopeo
:用于复制、检查和删除容器镜像
# 使用 Buildah 构建镜像(更灵活)
# 安装 Buildah
sudo rpm-ostree install buildah

# 构建镜像
container=$(buildah from alpine:latest)
buildah run $container apk add nginx
buildah config –cmd “nginx -g ‘daemon off;’” $container
buildah commit $container mynginx:latest

# 使用 Skopeo 检查镜像
skopeo inspect docker://nginx:alpine

# 复制镜像到不同位置
skopeo copy docker://nginx:alpine docker-archive:nginx.tar
skopeo copy docker-archive:nginx.tar docker://myregistry.example.com/nginx:latest
四、Silverblue 上的 Kubernetes 实践
4.1 Kubernetes 开发环境搭建
在 Silverblue 上搭建 Kubernetes 开发环境有多种选择:
4.1.1 Minikube
# 安装 Minikube(需要 Docker 或 Podman)
# 使用 Podman 驱动
sudo rpm-ostree install minikube

# 启动 Minikube
minikube start –driver=podman –container-runtime=containerd

# 查看状态
minikube status

# 进入 Minikube SSH
minikube ssh

# 停止集群
minikube stop

# 删除集群
minikube delete
4.1.2 Kind (Kubernetes in Docker)
# 安装 Kind
sudo rpm-ostree install kind

# 创建集群配置文件
cat > kind-config.yaml < deployment.yaml < k8s-layer.yaml < Tiltfile < skaffold.yaml < ~/bin/cleanup-containers.sh <<'EOF' #!/bin/bash podman system prune -a --volumes -f echo "Cleanup completed at $(date)" EOF chmod +x ~/bin/cleanup-containers.sh 5.2 安全最佳实践 5.2.1 Rootless Podman 安全配置 # 限制容器 capabilities podman run --cap-drop=ALL --cap-add=NET_BIND_SERVICE --name app myapp # 只读根文件系统 podman run --read-only --tmpfs /tmp --name app myapp # 禁用特权模式 podman run --security-opt=no-new-privileges --name app myapp # 使用 SELinux 标签 podman run --security-opt label=type:container_t --name app myapp 5.2.2 镜像安全扫描 # 使用 Trivy 扫描镜像漏洞 # 安装 Trivy sudo rpm-ostree install trivy # 扫描本地镜像 trivy image myapp:latest # 扫描远程镜像 trivy image nginx:alpine # 生成报告 trivy image --format json -o report.json myapp:latest 5.3 性能优化 5.3.1 Podman 性能调优 # 使用 cgroup v2 # 检查是否启用 stat -fc %T /sys/fs/cgroup/ # 配置资源限制 cat > ~/.config/containers/containers.conf < Dockerfile <<'EOF' FROM python:3.9-slim as builder WORKDIR /app COPY requirements.txt . RUN pip install --user -r requirements.txt FROM python:3.9-slim COPY --from=builder /root/.local /root/.local COPY . /app WORKDIR /app ENV PATH=/root/.local/bin:$PATH CMD ["python", "app.py"] EOF # 使用 distroless 镜像 FROM gcr.io/distroless/base-debian11 COPY myapp /myapp CMD ["/myapp"] 5.4 与 CI/CD 集成 5.4.1 GitLab CI 示例 # .gitlab-ci.yml stages: - build - test - deploy variables: CONTAINER_REGISTRY: "myregistry.example.com" build: stage: build script: - podman build -t $CONTAINER_REGISTRY/myapp:$CI_COMMIT_SHA . - podman push $CONTAINER_REGISTRY/myapp:$CI_COMMIT_SHA only: - main test: stage: test script: - podman run --rm $CONTAINER_REGISTRY/myapp:$CI_COMMIT_SHA pytest deploy: stage: deploy script: - kubectl set image deployment/myapp myapp=$CONTAINER_REGISTRY/myapp:$CI_COMMIT_SHA only: - main 5.4.2 GitHub Actions 示例 # .github/workflows/deploy.yml name: Build and Deploy on: push: branches: [ main ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Build and Push run: | podman build -t myregistry.example.com/myapp:${{ github.sha }} . podman push myregistry.example.com/myapp:${{ github.sha }} - name: Deploy to Kubernetes run: | kubectl set image deployment/myapp myapp=myregistry.example.com/myapp:${{ github.sha }} 5.5 故障排除 5.5.1 Podman 常见问题 # 问题:rootless 容器无法绑定 80 端口 # 解决:使用 authbind 或配置端口转发 podman run -d -p 8080:80 --name web nginx # 或者使用 setcap sudo setcap 'cap_net_bind_service=+ep' /usr/bin/podman # 问题:存储空间不足 # 查看使用情况 podman system df # 清理 podman system prune -a --volumes # 问题:容器启动失败 # 查看详细日志 podman logs --tail 100 mycontainer # 检查容器配置 podman inspect mycontainer # 进入失败容器调试 podman run --rm -it --entrypoint=/bin/sh myimage 5.5.2 Kubernetes 相关问题 # 问题:kubectl 无法连接集群 # 检查配置 kubectl config view # 检查集群状态 kubectl cluster-info dump # 问题:Pod 无法启动 kubectl describe pod mypod kubectl logs mypod --previous # 问题:节点 NotReady kubectl describe node $(hostname) sudo journalctl -u kubelet -f 六、总结 Fedora Silverblue 通过其不可变设计为容器技术提供了理想平台。Podman 作为原生工具提供了最佳集成和安全性,而 Docker 和 Kubernetes 也完全可用。关键要点: 优先使用 Podman :rootless 模式、无守护进程、与 systemd 集成 使用 Toolbox 进行开发 :保持主机系统纯净 利用 rpm-ostree :在需要时安装系统级工具 遵循安全最佳实践 :rootless、最小权限、定期扫描 优化存储和性能 :合理配置存储驱动和资源限制 通过这些实践,您可以在 Silverblue 上构建安全、高效、可维护的容器化工作流,无论是本地开发还是生产部署。 参考资源: Fedora Silverblue 官方文档: https://silverblue.fedoraproject.org/ Podman 官方文档: https://podman.io/docs/ Kubernetes 官方文档: https://kubernetes.io/docs/home/ Red Hat 容器安全指南: https://www.redhat.com/en/topics/containers/containers-security