想要创建一个容器,就首先得有镜像,而镜像怎么来呢,我们可以通过 podman build 的命令去构建基础镜像,
类似这样
podman build -t myapp:base <dockerfile的路径>
这里的 -t myapp:base 是镜像名和标签名,如果你知道 docker 的话,dockerfile 就不展开说了,而 podman 可以兼容 docker 的构建文件(非常强大)。
执行完后接下来在 podman images 就可以发现新增了自己的镜像,这是其中一种镜像导入方式。
还有一种可以通过 podman commit 来将已有的容器做成一个新镜像
podman commit <container> <image>:<tag>
执行完后可在 podman images 可以看到
那么还有呢?也就是已经导出到本地的镜像,再导入回去,这里又分两种情况。
1)一种情况是只导入 rootfs 但没有任何环境变量、挂载信息、命令启动信息的导入。
也就是通过 podman export <container> -o ./test.tar 命令导出的容器,或自己手动制作的 tar 包,再通过 podman import 的方式去导入
podman import test.tar myimage:base
此时就会多一个新镜像,这里 myimage:base 也是镜像名和标签名的意思。
2)而另一种情况呢,是通过 save / load 去导入导出,这种方式是比较推荐的做法。因为保留了容器/镜像相关的信息(如环境变量、挂载点、命令启动等信息)。
save 保存到本地
podman save -o myimage.tar myimage:base
load 从本地导入
podman load -i myapp_base.tar
这里可以看到 save 的是一个镜像,那么如果想迁移容器,那很简单,配合前面说的 podman commit 来做就好。
有时候想用 podman 将已经下载好的镜像导出文件。我们可以用下面一种方法。
在输入 podman images 时我们可以得知已经下载好的镜像信息,包括镜像id和名称 这里我以导出 fedora 镜像为参考例子,首先基于镜像创建一个临时容器比如叫 tmp (按自己的想法来) 这里我直接指定了镜像名称 fedora:latest,而这里也可以是镜像id
podman create --name tmp fedora:latest
创建容器后,将这个临时的容器在当前目录导出一个叫 rootfs.tar 的压缩包
podman export tmp -o rootfs.tar
此时可以删除临时容器了
podman rm tmp
接下来把 rootfs.tar 进行解压,解压路径自己定。至于为什么需要用到 sudo 是因为像这种 rootfs 可能默认只有 root 用户,如果不提权解压出来的文件可能影响后续使用,只是为了让文件所有者为 root 用户
sudo tar -xf rootfs.tar -C <解压路径>