引言: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 <