我不使用docker的原因

参考内容:Podman 的特性概述

  1. podman安装和配置十分简便,而安装和使用docker时常常需要添加软件源,安装多个软件包的繁琐且令我恶心。
  2. podman不强制使用root权限运行容器
  3. podman不会在我查看ip link 的时候看到一堆该死的veth
  4. podman不比docker慢甚至可以更快
  5. podman兼容几乎所有docker的命令/操作方式并支持运行现有的标准的docker镜像
  6. podman 官方目前没有像docker一样做出过什么对普通用户来说糟糕的决定。

    安装

    sudo apt install podman

在云虚拟服务器上遇到如下警告
Processing triggers for initramfs-tools (0.140) ...
update-initramfs: Generating /boot/initrd.img-5.10.0-22-amd64
W: initramfs-tools configuration sets RESUME=UUID=ce6293d2-c011-4352-b2b9-d97e62080902
W: but no matching swap device is available.
I: The initramfs will attempt to resume from /dev/vda2
I: (UUID=ba3fb0ef-6939-4094-806f-0b60ed7d8f0f)
I: Set the RESUME variable to override this.
参考文章:update-initramfs warning: initramfs-tools configuration sets RESUME but no matching swap device is available
这是由于swap分区uuid变更过造成的。
lsblk -f #查看swap分区uuid,其实上面的log Info里已经给出了正确的uuid,复制即可。
sudo nano /etc/initramfs-tools/conf.d/resume #修改uuid
sudo update-initramfs -k all -u
sudo update-grub

必要的配置

你可能在使用podman run时遇到Error: short-name "newfuture/ddns" did not resolve to an alias and no unqualified-search registries are defined in "/etc/containers/registries.conf"
这是由于debian12 的podman默认没有设置缺省状态的容器仓库。
编辑/etc/containers/registries.conf 找到 unqualified-search-registries = ["example.com"]并取消注释
你可以使用docker.io或别的镜像。

当前由于未知原因,docker.io已被中国大陆互联网防火墙单方面污染屏蔽。至于国内的docker镜像,我只知道阿里云的还活着,但是已经停止同步docker.io ,其他似乎都关停了,真是滑稽又可悲。(如果你知道可用的国内镜像请留言告诉我。)
2023年8月20日更新:docker.io已被GFW黑名单释放。

开始使用

现在,像你平时使用docker命令一样使用podman!

#运行一个ddns服务,项目:[自动更新域名解析到本机IP(支持dnspod,阿里DNS,CloudFlare,华为云,DNSCOM...)][3]
podman run -d \
  -e DDNS_DNS=dnspod \
  -e DDNS_ID=12345 \
  -e DDNS_TOKEN=mytokenkey \
  -e DDNS_IPV4=ddns.newfuture.cc \
  -e DDNS_IPV6=ddns.newfuture.cc \
  --network host \
  newfuture/ddns

基础进阶

使用systemd管理和启动容器。参考:[借助 Podman 构建、运行和管理容器]
4[5]

首先按照预期参数运行容器。

创建容器相应systemd文件

podman generate systemd
可选参数:
--after (Add dependencies order to the generated unit file)
--container-prefix (Systemd unit name prefix for containers)
--env (Set environment variables to the systemd unit files)
-e (Set environment variables to the systemd unit files)
-f (Generate .service files instead of printing to stdout)
--files (Generate .service files instead of printing to stdout)
--format (Print the created units in specified format (json))
--name (Use container/pod names instead of IDs)
--new (Create a new container or pod instead of starting an existing one)
--no-header (Skip header generation)
-n (Use container/pod names instead of IDs)
--pod-prefix (Systemd unit name prefix for pods)
--requires (Similar to wants, but declares stronger requirement dependencies)
--restart-policy (Systemd restart-policy)
--restart-sec (Systemd restart-sec)
--separator (Systemd unit name separator between name/id and prefix)
--start-timeout (Start timeout override)
--stop-timeout (Stop timeout override)
--template (Make it a template file and use %i and %I specifiers. Working only for containers)
--wants (Add (weak) requirement dependencies to the generated unit file)

以甜糖docker为例

我创建好的容器名:J3160_Tiantang
需求: 通过systemd开机自启动并持续守护运行,停止后自动重启
podman generate systemd --restart-policy=always --files --name J3160_Tiantang
创建文件后复制/etc/systemd/system/并启用。
(记得systemctl daemon-reload)
非root用户应使用--user参数。

你并不是必须使用Systemd单独控制每个容器才能做到开机自启动

参见Podman --restart=policy
我之前对文档理解有误,实际按照官方文档的描述,只要podman-restart.service这个服务已经被启用,容器就可以在开机后被拉起。
同时,Podman也可以完全沿用docker的--restart参数,使用--restart=always即可保持进程开机自启动且任何非手动控制停止运行后的自动重启。

标签: none

添加新评论