Podman
Podman
参考连接:http://www.yunweipai.com/40798.html
Podman
是一个开源的容器运行时项目,可在大多数 Linux
平台上使用。Podman
提供与 Docker
非常相似的功能。正如前面提到的那样,它不需要在你的系统上运行任何守护进程
,并且它也可以在没有 root
权限的情况下运行。
Podman
可以管理和运行任何符合 OCI(Open Container Initiative)
规范的容器和容器镜像。Podman
提供了一个与 Docker
兼容的命令行前端来管理 Docker
镜像
podman是什么
podman系列主要包含三个命令podman、buildah、skopeo,其中podman本身负责运行、停止、管理容器,buildah负责构建容器镜像、skopeo负责与remote repo交互,拉取或推送镜像。但我们使用时不必这么麻烦,redhat为了方便用户从docker迁移到podman,在podman上几乎实现了大多数docker的常用命令,podman会替你转调buildah和skopeo,你甚至可以直接 alias docker=podman,然后像使用docker一样使用podman。
Podman
Podman可以替换Docker中了大多数子命令(RUN,PUSH,PULL等)。Podman不需要守护进程,而是使用用户命名空间来模拟容器中的root,无需连接到具有root权限的套接字保证容器的体系安全。Podman专注于维护和修改OCI镜像的所有命令和功能,例如拉动和标记。它还允许我们创建,运行和维护从这些图像创建的容器。
Buildah
Buildah用来构建OCI图像。虽然Podman也可以用户构建Docker镜像,但是构建速度超慢,并且默认情况下使用vfs存储驱动程序会耗尽大量磁盘空间。 buildah bud(使用Dockerfile构建)则会非常快,并使用覆盖存储驱动程序。Buildah专注于构建OCI镜像。 Buildah的命令复制了Dockerfile中的所有命令。可以使用Dockerfiles构建镜像,并且不需要任何root权限。 Buildah的最终目标是提供更低级别的coreutils界面来构建图像。Buildah也支持非Dockerfiles构建镜像,可以允许将其他脚本语言集成到构建过程中。 Buildah遵循一个简单的fork-exec模型,不以守护进程运行,但它基于golang中的综合API,可以存储到其他工具中。
Skopeo
Skopeo是一个工具,允许我们通过推、拉和复制镜像来处理Docker和OC镜像。
使用
1)安装
[root@dev ~]# yum -y install podman
2、配置镜像加速
podman的配置文件
# 配置镜像像仓库
[root@dev ~]# vim /etc/containers/registries.conf
# 取消从默认地址搜索的仓库域名
#unqualified-search-registries = ["registry.fedoraproject.org", "registry.access.redhat.com", "docker.io", "quay.io"]
unqualified-search-registries = ["docker.io"]
# 自定义搜索器
[[registry]]
# 仓库前缀
prefix = "docker.io"
# 加速器地址
location = "hub.local.com"
# 镜像别名
[root@localhost containers]# ls registries.conf.d/
000-shortnames.conf 001-rhel-shortnames.conf 002-rhel-shortnames-overrides.conf
# 配置镜像仓库和运行时目录
[root@localhost containers]# vim storage.conf
[storage]
# Default Storage Driver, Must be set for proper operation.
driver = "overlay"
# root 用户运行时目录
# Temporary storage location
runroot = "/run/containers/storage"
# Primary Read/Write location of container storage
# When changing the graphroot location on an SELINUX system, you must
# ensure the labeling matches the default locations labels with the
# following commands:
# semanage fcontext -a -e /var/lib/containers/storage /NEWSTORAGEPATH
# restorecon -R -v /NEWSTORAGEPATH
# root 用户镜像仓库目录
graphroot = "/var/lib/containers/storage"
# Storage path for rootless users
#
# rootless_storage_path = "$HOME/.local/share/containers/storage"
3、podman常用命令
容器
podman run #创建并启动容器
podman start #启动容器
podman ps #查看容器
podman stop #终止容器
podman restart #重启容器
podman attach #进入容器
podman exec #进入容器
podman export #导出容器
podman import #导入容器快照
podman rm #删除容器
podman logs #查看日志
镜像
podman search #检索镜像
docke pull #获取镜像
podman images #列出镜像
podman image Is #列出镜像
podman rmi #删除镜像
podman image rm #删除镜像
podman save #导出镜像
podman load #导入镜像
podmanfile #定制镜像(三个)
podman build #构建镜像
podman run #运行镜像
podmanfile #常用指令(四个)
COPY #复制文件
ADD #高级复制
CMD #容器启动命令
ENV #环境变量
EXPOSE #暴露端口
4、使用podman
使用 Podman 非常的简单,Podman 的指令跟 Docker 大多数都是相同的。下面我们来看几个常用的例子:
[root@localhost ~]# podman run -d --name httpd docker.io/library/httpd
Trying to pull docker.io/library/httpd...
Getting image source signatures
Copying blob e5ae68f74026 done
Copying blob d3576f2b6317 done
Copying blob bc36ee1127ec done
Copying blob f1aa5f54b226 done
Copying blob aa379c0cedc2 done
Copying config ea28e1b82f done
Writing manifest to image destination
Storing signatures
0492e405b9ecb05e6e6be1fec0ac1a8b6ba3ff949df259b45146037b5f355035
//查看镜像
[root@localhost ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/httpd latest ea28e1b82f31 11 days ago 148 MB
[root@localhost ~]# podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0492e405b9ec docker.io/library/httpd:latest httpd-foreground About a minute ago Up About a minute ago httpd
查看容器里的进程
[root@localhost ~]# podman top httpd
USER PID PPID %CPU ELAPSED TTY TIME COMMAND
root 1 0 0.000 15m38.599711321s ? 0s httpd -DFOREGROUND
www-data 7 1 0.000 15m38.599783256s ? 0s httpd -DFOREGROUND
www-data 8 1 0.000 15m38.599845342s ? 0s httpd -DFOREGROUND
www-data 9 1 0.000 15m38.599880444s ? 0s httpd -DFOREGROUND
停止容器,删除
[root@localhost ~]# podman stop --latest
2f3edf712621d3a41e03fa8c7f6a5cdba56fbbad43a7a59ede26cc88f31006c4
[root@localhost ~]# podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]# podman rm --latest
2f3edf712621d3a41e03fa8c7f6a5cdba56fbbad43a7a59ede26cc88f31006c4
[root@localhost ~]# podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
创建systemd服务
[root@localhost ~]# podman generate systemd nginx > /etc/systemd/system/nginx-docker.service
[root@localhost ~]# cat /etc/systemd/system/nginx-docker.service
# container-26ce342439d6ca634e209711b12fd0653537912bdd0351800a293a7900967237.service
# autogenerated by Podman 4.0.2
# Fri Apr 22 15:44:38 CST 2022
[Unit]
Description=Podman container-26ce342439d6ca634e209711b12fd0653537912bdd0351800a293a7900967237.service
Documentation=man:podman-generate-systemd(1)
Wants=network-online.target
After=network-online.target
RequiresMountsFor=/run/containers/storage
[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n
Restart=on-failure
TimeoutStopSec=70
ExecStart=/usr/bin/podman start 26ce342439d6ca634e209711b12fd0653537912bdd0351800a293a7900967237
ExecStop=/usr/bin/podman stop -t 10 26ce342439d6ca634e209711b12fd0653537912bdd0351800a293a7900967237
ExecStopPost=/usr/bin/podman stop -t 10 26ce342439d6ca634e209711b12fd0653537912bdd0351800a293a7900967237
PIDFile=/run/containers/storage/overlay-containers/26ce342439d6ca634e209711b12fd0653537912bdd0351800a293a7900967237/userdata/conmon.pid
Type=forking
[Install]
WantedBy=default.target
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl enable nginx-docker