前言
三年前,我写过一篇 使用 Podman 代替 docker-compose。那时候 podman 发展还不成熟,还只能使用 podman-compose 实现对 docker-compose 的桥接。现在 Podman 已经发展到 v5 这个大版本了,其引入的 Podman Quadlet 可以很好的实现 systemd 集成。
安装
现在,大部分发行版应该都已经内置的 podman 软件包。只需要从软件源中安装即可:
apt-get install podman
配置
默认配置存放于下面的几个目录中,podman 会按顺序读取:
- /usr/share/containers/
- /etc/containers/
- $HOME/.config/containers/
根据 podman.1 的说法,这个目录下有几个不同的配置文件:
- containers.conf: 主配置文件
- mounts.conf: 决定挂载逻辑的配置文件
- policy.json: 签名验证配置
- registries.conf: 自定义私有库配置
- storage.conf: 存储后端配置
常见的想要修改的配置有:
– 数据存储路径: storage.conf -> storage.graphroot
– 自定义短名称 alias: registries.conf -> aliases
Podman quadlet
Podman Quadlet 是将 podman 与 systemd 结合的脚本。它的名字来源于 k8s 的 kubelet,希望能像 kubelet 一样使用配置文件管理 pod。
它的用法非常简单。只需要像编写 systemd 的脚本那样编写服务即可:
[Unit]
Description=Test alpine image
After=local-fs.target
[Container]
Image=alpine:latest
Exec=sleep 1000
[Install]
# Start by default on boot
WantedBy=multi-user.target default.target
将上述文件放置于 $HOME/.config/containers/systemd/alpine.container 文件下,然后使用下面的命令即可使用 systemd 启动对应的容器:
systemctl --user daemon-reload
systemctl --user start alpine.service
然后你可以使用 podman ps 查看这个容器是否启动:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1845b3732130 docker.io/library/alpine:latest sleep 1000 15 seconds ago Up 15 seconds systemd-alpine
看着是不是很简洁明了?同时它还与 systemd 完美结合,使得管理这些容器不再是一件难事。对于系统级别的服务,需要放置在 /etc/containers/systemd/ 目录下。
如果在运行了 systemd daemon-reload 之后,找不到生成的服务,那么可能是你的配置文件写的有问题。你可以使用 systemd-analyze --user --generators=true verify alpine.service 命令尝试获取更多信息。
这里我总结了一些常见的参数供各位参考:
| 用途 | Docker Compose | Podman Quadlet |
|---|---|---|
| 容器命名 | container_name: name | ContainerName=name |
| 挂载目录 | volumes: [ /source:/dest ] | Volume=/source:/dest |
| 端口映射 | ports: [ 8080:80 ] | PublishPort=8080:80 |
| 环境变量 | environment: foo: bar | Environment=foo=bar |
| 环境变量文件 | env_file: [ /tmp/env ] | EnvironmentFile=/tmp/env |
| 自动升级 | 无 | AutoUpdate=registry |
除容器之外,Quadlet 还支持其他不同类型的声明:
- .volume: 声明卷
- .network: 创建网络
- .build: 镜像构建
- .pod: Pod
- .kube: K8s 配置文件启动(podman kube play /kube.yaml)
- .image: 镜像拉取策略
如果不想手动转换 compose 文件到 quadlet 格式的话,Podlet 是一个转换工具,可以帮你将已经写好的 compose 文件转换为 quadlet 文件。
只需要运行下面的命令,就能直接帮你转换并且复制到目标目录:
podlet -u compose ./compose.yaml
多容器之间的通信互联
正如之前的文章所提到的,compose 对应的并非是 Podman 中的 Container,而是 Pod。如果你的一个 compose 里面包含了多个容器,且这些容器之间需要互相通信的话,那么你就需要将它们放置到同一个 Pod 中。
首先声明一个 pod 文件(service.pod)
[Pod]
PublishPort=8080:8080
然后在容器中声明需要使用这个 Pod:
[Container]
Name=redis
Pod=service.pod
[Container]
Name=backend
Pod=service.pod
# 如果你需要暴露端口,那么需要在 Pod 级别声明,而不是在 Container 级别声明
Podman 会自动在创建的容器的 hosts 文件中添加上对应的解析:
127.0.0.1 redis
127.0.0.1 backend
这样就可以保持原有的配置不变,直接连接上了。
自动升级镜像
在上方的 Container 的配置中,只要声明了 AutoUpdate,就能使用 podman auto-update 命令自动升级。
AutoUpdate 有两个选项:
- registry: 从远端拉取镜像,然后更新;
- local: 使用本地已有的镜像更新;
如果你不想每次“手动”自动升级,你可以启用 podman-auto-update.timer。它会每天调用 podman-auto-update.service,自动升级镜像。
0 条评论