由于docker desktop商业化限制,导致在公司办公不能免费使用。所以就找podman desktop做下替换,容器需要平稳切换,且不能丢失数据,研究了一天,碰到了好几个坑,so 做下记录:方便他人、提高自己。

目录

坑一:其他几个牛逼大佬一时图方便,直接在容器内装了插件(开发环境),所以此次切换需要将docker的容器导出为镜像再导入podman内。

坑二:安装podman检查界面一直报错:WSL version should be >= 1.2.5.Call 'wsl --update' and 'wsl --version' in a terminal to check your wsl version.

坑三:访问【宿主机IP】+【端口】无法直接访问到容器。

坑四:Vmmem占用内存过高,最高占用了70%的内存空间

坑一:其他几个牛逼大佬一时图方便,直接在容器内装了插件(开发环境),所以此次切换需要将docker的容器导出为镜像再导入podman内。

1、先从docker中导出容器为镜像

docker commit -a "作者" -m "备注" 容器ID 镜像名:Tag

例:docker commit -a "zsh" -m "create new" 028ed49db22a test:1.0


2、导出镜像到本地

docker save 镜像ID -o 名称.tar

docker save 034162c5df77 -o test.tar


3、导入到podman

podman load -i test.tar


4、给导入的test镜像命名、打tag

podman tag 034162c5df77 test:1.0


5、以此镜像运行容器(与docker命令相同,只需要把docker改为podman即可)

podman run -d --name test -p 5010:5010 -p 8001:8000 -v D:\test\www:/var/www 034162c5df77 /bin/bash -c "tail -f /dev/null" 

坑二:安装podman检查界面一直报错:WSL version should be >= 1.2.5.
Call 'wsl --update' and 'wsl --version' in a terminal to check your wsl version.

这个报错,给我恶心半天。。。给出的提示'wsl --version' 是无法运行的,不能识别此命令,使用管理员权限运行cmd,执行'wsl --update'后更新了一次,重启电脑还是这个报错,再次执行显示已经无更新。然后将wsl升到2试了还是不行。

查了下发现也有很多人遇到此问题,(一般情况下用这里提到的方法都可以解决)如下:"WSL version should be >= 1.2.5" when installing Podman via Podman Desktop, but fully up to date · Issue #26837 · containers/podman

但是我这里情况比较特殊,按照这里面的方式试了一遍都不行。后来看了下原因:是由于开发环境电脑系统是windows专业版本,前几年更新的太烦人,我就给更新服务禁掉了,导致系统有点问题。。。。。。算是“自食其果”,打开更新服务,更新了下系统后,再次安装就成功了...

坑三:访问【宿主机IP】+【端口】无法直接访问到容器。

原因:podman在Windows/WSL2 环境下为了安全性和与Linux环境的一致性,其端口映射的默认行为与Docker Desktop不同‌。它默认只绑定到localhost/127.0.0.1。

对比 Docker Desktop:Docker 默认会自动将容器端口映射到宿主机的 localhost,并通过 Windows 防火墙规则开放外部访问,因此无需额外配置即可通过宿主机 IP 访问。

然后按照网上说的,绑定端口时加上 0.0.0.0:端口 映射 到docker端口,如:

podman run --name 容器 -p 0.0.0.0:8080:80 -d 镜像

这样搞了还是不行,重启podman也不行,折腾了好久。。。

解决方法1:停下来想了下podman 其实是安装到 windows 的 linux 子系统中的,所以使用子系统的ip+端口应该就能访问。试了下果然可行。

先在wsl中使用ifconfig命令查询下子系统的ip:

然后在windows上做一次端口映射转发(需要管理员权限---以管理员权限运行cmd),我要转发88 89端口,则执行如下命令即可

netsh interface portproxy add v4tov4 listenport=88 listenaddress=0.0.0.0 connectport=88 connectaddress=172.19.212.228

netsh interface portproxy add v4tov4 listenport=89 listenaddress=0.0.0.0 connectport=89 connectaddress=172.19.212.228

解决方法2:后来又想了下,如果只是在宿主机上做开发,那么直接在外面再加一层代理呗,把【宿主机ip:端口 】映射到【127.0.0.1:端口】应该也可以了。

在宿主机上安装代理服务,然后做下代理配置即可。

我这里做尝试,图方便直接使用phpstudy中的nginx,在phpstudy_pro\Extensions\Nginx1.15.11\conf\vhost目录下增加一个test.conf配置文件,配置重定向到本地:

server {
    listen 89;
    server_name "";
    rewrite ^/(.*)$ http://127.0.0.1:89/$1 permanent;    #跳转
}

然后启动nginx即可。

我这里是本地开发使用。如果需要别人能访问的话,可以这样配置下,如

server {
    listen 89;
    server_name "";
    # rewrite ^/(.*)$ http://127.0.0.1:89/$1 permanent;    #跳转
    location ^~ / {
    	proxy_pass http://127.0.0.1:89/;
    }
}

坑四:Vmmem占用内存过高,最高占用了70%的内存空间

windows键+R打开运行,输入 %UserProfile% 打开用户文件夹

新建一个文件:Vmmem.wslconfig,配置下占用内存(视自己电脑情况而定)

#.wslconfig
[wsl2]
memory=8GB
swap=4GB
localhostForwarding=true

然后在PowerShell中执行wsl --shutdown命令,重启podman就能看到内存占用降低了

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐