mac上使用podman进行docker容器编译调试

623 阅读3分钟

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 hostpathhost_path container_id:$container_path

从容器复制目录/文件到宿主机

podman cp containerid:container_id: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就可以了。