podman的使用流程可以概括为三个层次:首先创建虚拟机;然后在虚拟机基础上创建image;然后在image基础上创建容器;然后就可以进入容器进行操作。
一、安装podman
brew install podman
二、创建虚拟机
podman machine init
该命令将会创建一个缺省的虚拟机podman-machine-default,cpu个数1,内存2GB,磁盘10G。一般可以满足大部分image需求。如果预知需要更高配置的虚拟机,可以在一开始创建时即指定参数。比如:
podman machine init --cpus=2 --disk-size=20 --memory=3072
该命令将会创建2核,磁盘大小20G,内存3072M的虚拟机。
查看虚拟机的命令:
podman machine list
删除虚拟机的命令:
podman machine rm $machinename
三、启动虚拟机
podman machine start
该命令启动的是缺省的虚拟机,如果是其他虚拟机,需要专门再指定虚拟机名称。该命令必须在已经存在被创建好的虚拟机基础上才能执行。
停止虚拟机:
podman machine stop
该命令会将当前运行的虚拟机给停止。
四、创建image
podman build --tag name:tag -f dockerfile
name为虚拟机名称,tag为标签,dockerfile为dockerfile的路径。该命令将在当前运行的虚拟机上创建image。
列举当前运行的虚拟机上的imge:
podman images
删除image:
podman rmi $image_id
如上图,删除image时,如果有该image的容器,需要先删除容器才能删除image。容器也必须先停止然后再删除。当然,也可以用-f 选项强行删除,此时其上的容器会被停止并删除。
对于同一个项目工程,一般image创建完,就不必重复创建了,除非dockerfile内容做变化才需要重新创建image。
五、启动image与创建容器
podman run -dti image_id
此时会创建一个容器。注意如果需要端口转发。需要用option -p
podman run -p host_port:container_port -dti image_id
删除容器:
podman rm container_id
列举活跃的容器:
podman ps
列举所有容器(包含退出的容器)
podman ps -a
六、进入容器内部
podman exec -ti container_id bash
该命令将会进入容器bash里头,可以操作容器内部命令和数据。
注意容器一旦退出,其上的数据将会被销毁,下次重启,都回归到dockerfile配置的初始环境中。
七、容器和宿主机数据交互
podman不直接对宿主机目录直接mount,但提供cp命令在容器和宿主机之间进行文件复制,所以基本可以满足日常编译调试和部署需要。
从宿主机复制目录/文件到容器
podman cp container_id:$container_path
从容器复制目录/文件到宿主机
podman cp container_path $host_path
这样,可以将宿主机的项目工程复制到容器里头执行,执行完,可以将所需要的文件从容器里头再复制出来,就可以实现基本的编译调试需求。
八、调试线上镜像问题
ci/cd部署有时会失败,如果此时已经生成好image了,可以将image拉取下来,在本地执行。此时执行拉取命令,然后后续步骤和六、七完全一致。
九、其他问题
1,提示空间不够
此时一般是虚拟机空间过小,可以将一些没用的image给删除。也可以重新创建虚拟机,在创建时指定大一些的磁盘空间。
2,有时会提示failed to write to /proc/self/oom_score_adj: Permission denied
此时需要对podman进行升级,将其升级到4.2就可以了。