前言
最近要玩点东西,所以为了省事儿想起了docker,但docker有几个点让我想找找平替,一是想用普通用户使用(docker需要再另安装rootless的东西才行),二是不想有后台deamon在运行;
然后我就关注到了podman,天生的就是普通用户运行的(也可以使用rootful来使用root方式使用,坑还少很多),podman本来也是没有后台服务的;
但docker确实有他存在的必要,确实坑要少很多,教程也多很多,就像自动档的汽车;podman就像手动档的汽车性能很好,但我也从此走上了踩坑出坑的路;
本文仅为就我所踩到的坑及出坑方法进行记录,以便于之后查询之用;
一、安装
1 操作系统:Windows 11 25h2
这个就不详细讲了,这个版本只是我用的系统而已,只要有WSL2的应该都行;
2 WLS
2.1 WSL2安装:
要使用podman就必须要安装wsl,最好能连网安装,就是最新版的了,要不然有时版本太老还得 让你升级,用下面的命令安装可以仅安装wsl引擎,不安装系统(默认是ubuntu,也用不上,你要是想用可以后面另安也行)
wsl --install --no-distribution
安装完成后可以看看版本,就完成了
wsl --version
2.2 WSL2设置:
第一个你后面要遇到的坑要来了,设置WSL的网络,去开始菜单里,打开 wsl setting,下面是主要设置
2.2.1 设置里面的网络模式为 mirrored (网上都说只有win11有这个模式,但我感觉应该只要是wsl2最新版了都应该有,有win10的小朋友可以帮看看),如果使用默认的nat模式,后期运行的容器只能使用wsl系统里的172打头IP才能访问(127.0.0.1都无法访问),局域网内其他设备就不能访问这个容器的服务了,mirrored是镜像了主机的ip所以网络就通了;
2.2.2 (可选,另测试一下)为了省事可以把hyper-v防火墙关了,防止他捣乱,反正只是对WSL有影响,弊大于利;
3 podman
3.1 podman 下载
我当前使用的版本:version 5.8.1
使用就是podman,没有使用podman-desktop,手动档嘛,就不要再加个AMT了
下载地址:
# podman 官网
https://podman.io/
# github 位置 https://github.com/containers/podman/releases/
https://github.com/containers/podman/releases/download/v5.8.1/podman-installer-windows-amd64.exe
# podman-desktop 有想用带图形端的,可以下载这个,官网上的下载的连接也是这个的
https://github.com/podman-desktop/podman-desktop/releases
3.2 podman 安装
就是双击运行安装就行了,要注意的是会让你选使用wsl还是hyper-v的虚拟机,当然wsl了这个又小又快,安装很快就完成了,比安装docker-desktop可快多了,毕竟这个没有desktop,纯命令操作,这样的好处就是到了linux也能操作得了;
安装完默认的位置应该是 C:\Program Files\RedHat\Podman ,记住这个目录,就要是还要下载一下compose程序放在这里,至于你看到的RedHat,就是那个著名的linux厂家,详细的自己去找资料看吧;
# github 下载地址
https://github.com/docker/compose/releases
# 下载这一个文件就好了,其他的同名不同扩展名的不用管
https://github.com/docker/compose/releases/download/v5.1.0/docker-compose-windows-x86_64.exe
需要的操作是,把docker-compose-windows-x86_64.exe改名成docker-compose.exe并放到C:\Program Files\RedHat\Podman就好了
这时就可以看看版本号了,正常应该是能看到了,因为安装程序会自动把程序目录加到系统的path环境变量中
podman --version
docker-compose --version
说明:其实podman也有podman-compose,但这个玩意儿要先装python,python这玩意儿版本差一点都不对付,所以太麻烦,直接用现成的docker-compose更省心省事儿,而且就算是使用podman-desktop里扩展安装的其实也是这个docker-compose;
3.3 podman 初始化(自动下载)
使用下面命令就好了,会自动在wsl中安装一个linux环境,以fedora为基础的
podman machine init
# 查看wsl中的虚拟机
wsl -l -v
NAME STATE VERSION
* podman-machine-default Running 2
如果自动下载初始化成功了,就不用看下面的3.4了,此时podman就可以使用了,继续下面的使用部分了。
3.4 podman 手动初始化
如果你网络没问题,也不慢,那这段可以跳过
这里有个问题就是初始化有可能会需要上网下载那个machine-os再安装到wsl,但因为网络太慢或连接不上,所以就没有办法初始成功,就要用到第二种办法,手工下载
# 下载地址,去这里找对应的位置
https://github.com/containers/podman-machine-os/releases
# 要下的文件
https://github.com/containers/podman-machine-os/releases/download/v5.8.1/podman-machine.x86_64.wsl.tar.zst
需要解压出来用,虽然Windows可以直接打开,但打开了就直接进入tar的包里了,但我们要的是里面的machine.x86_64.wsl.tar包,所以建议使用解压软件来操作,我使用的是7-zip
我是给放到了d:\Podman目录里,为了以后要是再需要重新安装时省着再下载了,下一次挺费劲的
然后要运行以下命令初始化
D:\Podman>podman machine init --image podman-machine.x86_64.wsl.tar
Extracting compressed file: podman-machine-default-amd64: done
Importing operating system into WSL (this may take a few minutes on a new WSL install)...
操作成功完成。
Configuring system...
Machine init complete
To start your machine run:
podman machine start
其实到这就已经安装完podman了,下面就开始各种设置使用了,以及问题处理了;
二、开始使用前准备
1 配置国内源
首先就是要先改成国内源,要不然docker hub(也就是docker.io)现在根本就连接不上(你要是能科学上网了当我没说)
1.1 创建配置文件
我是在 D:\podman 下建立了配置文件 registries.conf,保存时要注意保存字符集是utf-8,下面是文件内容
# registries.conf
# 1. 定义非完整路径镜像的搜索范围
# 当你只输入 "nginx" 而不是 "docker.io/library/nginx" 时,Podman 会按此列表顺序查找
unqualified-search-registries = ["docker.io", "quay.io", "docker.1ms.run"]
# 2. 配置 docker.io 的加速器集群
[[registry]]
prefix = "docker.io"
location = "docker.io"
# 下面是你提供的加速地址,Podman 会按顺序尝试
# 如果第一个挂了,它会自动尝试第二个,非常稳健
[[registry.mirror]]
location = "registry.cn-hangzhou.aliyuncs.com"
[[registry.mirror]]
location = "docker.m.daocloud.io"
[[registry.mirror]]
location = "docker.1ms.run"
[[registry.mirror]]
location = "docker.xuanyuan.me"
[[registry.mirror]]
location = "docker-0.unsee.tech"
[[registry.mirror]]
location = "docker.hlmirror.com"
[[registry.mirror]]
location = "lispy.org"
# 为 quay.io 配置镜像加速
[[registry]]
prefix = "quay.io"
location = "quay.io"
# 添加多个镜像站作为备选,按顺序尝试
[[registry.mirror]]
location = "quay.nju.edu.cn"
# insecure = true # 加了就可以使用http的,不加就必须是https的
[[registry.mirror]]
location = "quay.mirrors.ustc.edu.cn"
# insecure = true
# 3. (可选) 如果某些私有库不需要 HTTPS 校验,可以在下面添加
# [[registry]]
# location = "192.168.1.100:5000"
# insecure = true
1.2 设置到machine-os中
# 启动
podman machine start
# 进入系统
podman machine ssh
# 此时已经进入到machine-os中
# 创建软件链接,因为wsl自动映射了windows的盘符,所以可以直接用就行
[user@DESKTOP-6UH0CM6 ~]$ mkdir -p .config/containers
[user@DESKTOP-6UH0CM6 containers]$ ln -s /mnt/d/Podman/registries.conf registries.conf
[user@DESKTOP-6UH0CM6 containers]$ ll
total 0
lrwxrwxrwx 1 user user 29 Mar 13 21:17 registries.conf -> /mnt/d/Podman/registries.conf
[user@DESKTOP-6UH0CM6 containers]$ exit
logout
# 此时退出了machine-os回到了windows命令行,要重启一下虚拟机
podman machine stop
# Machine "podman-machine-default" stopped successfully
podman machine start
# Starting machine "podman-machine-default"
# 这时就可以使用 podman 进行 pull 或search 了
# 需要说明的是因为docker.io无法使用,所以加这个源会搜索到docker.1ms.run这个里的列表
podman search dpanel
# 拉镜像要说明的是下面的操作因为没有前头内容,所以会自动补全为docker.io/dpanel/dpanel:lite
podman pull dpanel/dpanel:lite
# 所以在查已经下载的镜像里显示的是docker.io/dpanel/dpanel是正常的,因为在源里自动将docker.io的源跳转到国内源下载了,所以如果你不想混乱,可以直接按照搜索出来的内容拉镜像,比如下面命令
podman pull docker.1ms.run/dpanel/dpanel:lite
ps:dpanel 是管理docker的web工具,之所以使用web工具,反正也得用,所以就以这个举例了,没选podman-desktop就是为了省事儿,因为desktop是应用程序,在别处用还得再安装。
2 配置文件存储位置
目的:原因是wsl的系统默认都在系统盘C盘,而且podman下载的镜像和运行的容器都在wsl中的podman machine-os系统里面,随着镜像和容器越来越多,C盘容易太满,到时不好清理,所以就想能不能把这两个大头给移出虚拟机,然后就出现了到现在为止最麻烦的一个大坑,下面方法二选一就可以(如果你对系统盘的空间无所谓的话不动最好最省事儿),往下看吧:
2.1 配置文件修改存储位置
首先说一下,Windows不建议使用这种方法,因为我就出现了下面说问题,而且还没解决
原是想通过配置文件中修改将镜像存储的位置和容器运行的位置都移到/mnt/d/Podman目录中的Run和Storage两个目录中(配置文件字符集一定要utf-8),内容如下,文件名是storage.conf
#storage.conf
[storage]
driver = "overlay"
graphroot = "/mnt/d/Podman/Storage" # 镜像路径,但在Windows版中设置会容器启动报错
runroot = "/mnt/d/Podman/Run" # 看名应该是容器运行的临时目录位置
[storage.options]
mount_program = "/usr/bin/fuse-overlayfs"
问题就来了:下载完镜像,在启动容器时就会报错,容器无法运行,下面是错误内容
>podman run -d --name dpanel --restart=always -p 8807:8080 -e APP_NAME=dpanel -v /run/user/1000/podman/podman.sock:/var/run/docker.sock -v /mnt/d/Podman/Data/dpanel:/dpanel dpanel/dpanel:lite
# 上面是运行的docker命令,下面就是错误
Error: container create failed (no logs from conmon): conmon bytes "": readObjectStart: expect { or n, but found , error found in #0 byte of ...||..., bigger context ...||...
问题解决方法:就是发现只要把配置文件中的 graphroot 这行删掉或是注释掉就好了,也就是镜像不能放在Wsl系统的外面了,但这段我还要留着是为了要是在linux或macOS里时有可能会有用。
2.2 wsl 虚拟机搬家
因为podman日后下载的镜像和运行的容器都在wsl的虚拟机里,所以直接把这个从系统盘里搬走就好了,下面是操作步骤
# 先关闭wsl的虚拟机
podman machine stop
wsl --shutdown
# 看看虚拟机的名,下面要用
wsl -l -v
NAME STATE VERSION
* podman-machine-default Stopped 2
# 导出虚拟机
wsl --export podman-machine-default D:\WSL\podman-backup.tar
# 注销虚拟机
wsl --unregister podman-machine-default
# 导入虚拟机
wsl --import podman-machine-default D:\WSL\podman-machine-default D:\WSL\podman-backup.tar --version 2
# 启动虚拟机
podman machine start
# 看看是否好用
podman ps -a
# 没有错误就是正常了,就可以删掉导出时临时的文件了,你要留着也无所谓,就当备份了
del d:\wsl\podman-backup.tar
这个虚拟机搬家过程就完成了,测试成功,其实真挺大的,就拉了这么一个镜像就把虚拟机磁盘文件撑到了1.2G,学会这个的好处是以后除了可以带着程序的数据文件和yaml配置文件走了之外还可以带个导出的这个虚拟机到时连镜像和容器都不用再重新拉和生成了;
三、日常使用
这个操作基本是完全同docker一样,我只是列出来自己看,当手册了,就不详细说明了
1 容器操作
1.1 操作示例
先以之前拉取的dpanel镜像启动命令为例,然后对照后面的内容进行理解参数含义:
podman 单启动
podman run -d --name dpanel --restart=always -p 8807:8080 -e APP_NAME=dpanel -v /run/docker.sock:/var/run/docker.sock -v /mnt/d/Podman/Data/dpanel:/dpanel dpanel/dpanel:lite
podman compose 使用 docker-compose.yaml(yml扩展名一样)批量启动
# docker-compose.yaml 文件内容(起这个名命令中就不用指定文件名了)
services:
dpanel:
image: docker.io/dpanel/dpanel:lite
container_name: dpanel
restart: always
ports:
- "8807:8080"
environment:
- APP_NAME=dpanel
volumes:
# 映射 Socket,注意路径必须是 WSL 里的实际路径
- /run/docker.sock:/var/run/docker.sock
# 映射 D 盘数据目录,:Z 会自动处理 SELinux/UID 权限标签
- /mnt/d/Podman/Data/dpanel:/etc/dpanel
这里的目录最后都没有加 :Z,如果有权限问题出错的话,可以尝试加上看看,下面是加上的样子
/run/docker.sock:/var/run/docker.sock:Z
/mnt/d/Podman/Data/dpanel:/etc/dpanel:Z
# 文件名为docker-compose.yaml时
podman compose up -d
# 文件名为其他任意名称时,例如 dev.yaml,必须要指明路径,要不然就会批程序所在位置的路径
podman compose --file d:\dev.yaml up -d
# -d 是在后台运行,up 启动运行必须加,down 关闭就不用加了
# --file 可以写成 -f,-f 也可多个同时使用
podman compose -f docker-compose.yaml -f docker-compose.dev.yaml up -d
# 默认文件优先级:如果不指定 -f,Podman Compose 会依次查找:podman-compose.yaml → podman-compose.yml → docker-compose.yaml → docker-compose.yml,找到第一个就使用
1.2 生命周期管理
运行容器
podman run -d --name myapp nginx # 后台运行
podman run -it --name myapp ubuntu bash # 交互式运行
podman run -p 8080:80 nginx # 端口映射
容器的启停
podman start myapp # 启动已存在的容器
podman stop myapp # 停止容器
podman restart myapp # 重启容器
删除容器
podman rm myapp # 删除已停止的容器
podman rm -f myapp # 强制删除运行中的容器
podman container prune # 删除所有已停止的容器
1.3 查看与调试
podman ps # 查看运行中的容器
podman ps -a # 查看所有容器(包括已停止的)
podman logs myapp # 查看容器日志
podman logs -f myapp # 实时跟踪日志
podman exec -it myapp bash # 进入容器内部
podman inspect myapp # 查看容器详细信息
2 镜像操作
2.1 镜像管理
拉取/搜索镜像
podman pull nginx:alpine # 拉取镜像
podman search nginx # 搜索镜像
查看镜像
podman images # 列出本地镜像
podman image ls # 同上
podman inspect nginx # 查看镜像详细信息
删除镜像
podman rmi nginx # 删除镜像
podman image prune # 删除未被使用的镜像
podman image prune -a # 删除所有未使用的镜像
2.2 构建与标签
podman build -t myapp:v1 . # 从 Dockerfile 构建镜像
podman tag myapp:v1 myapp:latest # 给镜像打标签,这个有用,可以用个短名称引用长名称的镜像
3 machine操作
3.1 基础管理
podman machine init myvm # 创建新 machine(可选名称,一般到init就行)
podman machine start # 启动 machine
podman machine stop # 停止 machine
3.2 配置与查看
podman machine list # 查看所有 machine 状态
podman machine inspect # 查看 machine 详细信息
podman machine set --rootful=false # 设置 rootless 模式(需要在停机时执行)
podman machine set --cpus 4 # 修改 CPU 核数(需要在停机时执行)
podman machine set --memory 4096 # 修改内存大小(MB)(需要在停机时执行)
podman machine ssh # SSH 进入 machine 虚拟机内部
3.3 删除
podman machine rm myvm # 删除 machine
podman machine rm -f myvm # 强制删除
4 其他命令
清理所有未使用资源(容器、镜像、网络)
podman system prune
清理所有资源(包括已停止的容器、未使用的镜像等)
podman system prune -a
查看 Podman 环境信息
podman info
查看当前是否 rootless 模式
podman info --format '{{.Host.Security.Rootless}}'