Hax机器安装Podman(某些无法安装docker的VPS可能有效的替代方案)

博客逐步迁移中,文章链接可能失效,但博客和文章不会丢(自己翻一下文章列表)

自行确保网络畅通,比如IPv6only的机器安装WARP等。

以下命令均使用root账户操作

安装Podman

#刷新软件包,之前执行过可以不用再次刷新
#apt update 

#安装Podman,Debian11的软件源中只有Podman3.x,Debian12的有Podman4.x
apt install podman 

#查看是否安装成功,以及Podman的一些
podman info

安装podman-compose(可选)

如果不需要podman-compose的话,可以不装pip和podman-compose
我测试觉得podman-compose并不太好用,和docker-compose的差别有点点大,特别是网络

Debian11的安装方法

apt install pip
pip3 install podman-compose
podman-compose --version

Debian12的安装方法

apt install podman-compose

挂载/sys/fs/目录为可读写,Hax机必做

#执行这条命令,挂载/sys/fs/目录为可读写,Hax机必做,
#否则无法启动任何容器 也无法在portainer中拉取容器
mount -o remount,rw /sys/fs/cgroup

#上面的命令重启会失效,所以需要把这条mount命令粘贴到开机自启文件/etc/rc.local中
#没有nano的,也可以用vi来编辑
nano /etc/rc.local

粘贴到exit 0 之前,然后Ctrl+X 按Y 按回车 保存并退出

#测试podman是否正常,--rm是容器停止后自动删除。正常来说是能pull这个镜像的。
#如果有WARN黄字警告不用管,没多大影响,我不知道怎么解决这个警告
podman run --rm hello-world

image-20240113012027247

解决无法拉取镜像的问题

可能是hax机器或者debian11中podman3.x的BUG,导致无法直接在命令行拉取容器,podman pull会失败!

拉取其他第三方镜像就会出现问题,无法拉取!但docker官方的docker.io/library/xxx的却可能可以拉取

image-20240113012332668

那么第三方镜像怎么拉取呢?我发现在Portainer这个docker管理面板中,可以正常拉取镜像

所以我们需要利用Portainer这个容器来拉取镜像,那么问题来了,Portainer容器的镜像就无法拉取啊,

当然有解决办法,docker为不能连接互联网的机器提供的解决方法是,从可以联网的docker机器,拉取镜像然后保存为文件,自行将文件拷贝到目标机器,在目标机器上读取文件为镜像,这样有了镜像就能创建容器了。

我拉取的是6053537的portainer-ce,他自带中文,你可以用官方的portainer然后自己打中文版补丁 官方portainer/portainer-ce:latest

方法1: 自行从别个docker环境pull save 上传到Hax机器

#可以使用其他docker保存的镜像,命令docker save 镜像名 -o 文件名.tar ,然后上传到hax机子然后  podman load -i 文件名.tar,读取为镜像

#另一个docker环境,可以正常docker pull的,保存镜像为归档文件
#拉取镜像
docker pull 6053537/portainer-ce:latest

#docker save 镜像名或ID -o 文件名.tar 例如:
docker save 6053537/portainer-ce:latest -o 6053537_portainer-ce_latest.tar

#查看镜像文件信息
ls -lh 6053537_portainer-ce_latest.tar

自行上传.tar文件到Hax机器上

方法2: 用Hax机器直接下载我提供的镜像

可以用我提供的Portainer镜像文件,不放心的自己用方法1,文件在hax,纯IPv6,随时可能失效!

#搭建在Hax机,链接是IPv6的,随时可能失效,请自行保存
wget http://c.umtx.eu.org:5244/d/guest/6053537_portainer-ce_latest.tar

读取文件为镜像

#查看Hax机器上的镜像文件信息
ls -lh 6053537_portainer-ce_latest.tar

#Hax机器,读取文件为镜像
#从归档文件读取为镜像,镜像名包含在tar包里了,无法自定义。需要自定义则用 docker tag自己标
podman load -i 6053537_portainer-ce_latest.tar

#查看镜像是否成功读取
podman images

#读取成功就可以删掉该文件了,我这里没删,留作存档
#rm 6053537_portainer-ce_latest.tar

部署Portainer容器

镜像搞定了,接下来部署镜像为容器

#创建Portainer的数据目录,因为Podman不像docker,他不会自动创建不存在目录
#portainer就是个管理面板,其数据即使丢失也不影响其他容器的数据,就是配置丢了得重新配置,所以也可以不用创建这个数据目录,后续也不加-v xxxx:/data \这个命令。 
#-p,允许直接创建多级目录
mkdir -p /docker/portainer/data

#容器都建议使用host网络,我测试bridge网络的容器可能无法联通互联网!
#要注意docker的/var/run/docker.sock在podman中的位置是/var/run/podman/podman.sock
podman run -d \
--restart=always \
--name=portainer \
--network=host \
-v /var/run/podman/podman.sock:/var/run/docker.sock \
-v /docker/portainer/data:/data \
6053537/portainer-ce:latest

#查看容器状态
podman ps -a

#有时候可能podman run部署后会启动失败,手动重启一下就星
podman restart portainer

Portainer的初始化超时机制,部署后请尽快登录并初始化,否则需要重启容器后才能初始化,重启容器命令 podman restart portainer

WebUI访问地址是 http://IP:9000

如果你也是IPv6only机器,请用IPv6地址访问,例如http://[2602:xxxx:xxxx:xxxx::xxxx]:9000 WARP本身只能出站,不能入站。
cloudflare的小云朵CDN只支持部分端口,80 443 8080 8443等,不包括9000,要访问9000请不要开启小云朵,另外用个二级域名开小云朵

初始化后就可以在portainer中可以拉取镜像了,portainer的使用教程自行百度。

image-20240113010722508

这样镜像的来源可以不依赖其他机器了,但在portainer中拉取镜像要加上前缀 docker.io/ 例如 docker.io/xhofe/alist:latest

能拉取到镜像,就可以自己玩耍了,尝试用Portainer拉取的镜像,搭建个alist容器

#创建目录
mkdir -p /docker/alist/data

#依然用的是host网络
podman run -d \
--name alist \
--restart always \
--network host \
-v /docker/alist/data:/opt/alist/data \
-e PUID=0 -e PGID=0 -e UMASK=000 \
xhofe/alist:latest

#alist的初始用户名 admin
#alist的初始密码,需要用命令查看,建议复制,防止手抖
podman logs alist

image-20240113011212326

WebUI访问地址是 http://IP:5244

登录后及时更改掉alist初始用户名密码,具体玩法/忘记密码的解决办法,详见 alist的官网 https://alist.nn.ci/zh/

后话

有可能debian11,机器重启后,设置自启的容器会自启失败,手动重启一下即可,有可以一并放入 /etc/rc.local开机自启的脚本文件,debian12好像不会出现这个问题

podman和docker差不多的,主要差在外部文件配置
这次折腾参考了很多资料,中文/外文的,也问了ChatGPT,充分证实了,通用领域问ChatGPT还行,过于专业的领域/过于深入的东西ChatGPT懂个锤子,就会瞎编,尽耽误人事。。

有群友反馈说,安装podman后,去安装1panel,结果莫名其妙安装上了docker,我没试过,不清楚具体情况