《OpenShift 4.x HOL教程汇总》

文章目录

  • 安装Podman环境
  • 运行配置文件
  • 登录/登出Container Registry
  • 利用登录凭证免密操作
  • 查询镜像
  • pull/push 镜像
  • 访问非安全的Registry
  • 查看镜像分层目录
  • 保存镜像-恢复镜像
  • 运行容器,并观察对应进程和使用的存储
  • 查看容器日志
  • 查看容器运行实时状态
  • 运行停止的容器
  • 删除容器
  • Podman运行环境管理
    • 查看运行环境信息
    • 删除所有不用的容器、镜像和本地存储卷
  • 参考

说明

  • 由于本文会使用本地的Container Registry,因此在开始本章前,建议先完成《容器入门(1) - 安装和使用Docker Registry》

安装Podman环境

在配置好RedHat的Yum即可安装Podman。

$ yum install podman

运行配置文件

Podman使用了/etc/containers/registries.conf和/etc/containers/storage.conf文件保存运行环境配置。其中registries.conf定义了podman能够访问到的container registry服务器的信息,而storage.conf定义了podman保存在本地的容器镜像和其运行容器的文件目录。我们可以通过执行“podman info”查看这些配置是否生效。

$ podman info
host:BuildahVersion: 1.9.0Conmon:package: podman-1.4.4-4.el7.x86_64path: /usr/libexec/podman/conmonversion: 'conmon version 0.3.0, commit: unknown'Distribution:distribution: '"rhel"'version: "7.7"MemFree: 1084551168MemTotal: 2096144384OCIRuntime:package: runc-1.0.0-65.rc8.el7.x86_64path: /usr/bin/runcversion: 'runc version spec: 1.0.1-dev'SwapFree: 2145644544SwapTotal: 2147479552arch: amd64cpus: 1hostname: registrykernel: 3.10.0-1062.el7.x86_64os: linuxrootless: falseuptime: 19h 40m 40.17s (Approximately 0.79 days)
registries:blocked: nullinsecure:- registry.domain.comsearch:- docker.io- registry.fedoraproject.org- quay.io- registry.access.redhat.com- registry.centos.org- registry.domain.com
store:ConfigFile: /etc/containers/storage.confContainerStore:number: 2GraphDriverName: overlayGraphOptions: nullGraphRoot: /var/lib/containers/storageGraphStatus:Backing Filesystem: xfsNative Overlay Diff: "true"Supports d_type: "true"Using metacopy: "false"ImageStore:number: 2RunRoot: /var/run/containers/storageVolumePath: /var/lib/containers/storage/volumes

系统全局的配置文件位于/etc/containers/registries.conf和/etc/containers/storage.conf,用户也可以使用“~/.config/containers/registries.conf”、“~/.config/containers/storage.conf”覆盖系统全局的配置。
在registries.conf文件中“[registries.search]”是podman搜索镜像的目标registry,而“[registries.insecure]”定义了可以不通过TLS访问的registry。

[registries.search]
registries = ['registry.access.redhat.com', 'registry.redhat.io', 'docker.io'][registries.insecure]
registries = [][registries.block]
registries = []

在storage.conf文件中,“graphroot”参数是用来定义存放Image和容器可写内容的目录(其下面对应相关的子目录);而“runroot”参数是用来定义存放容器临时可写内容的目录;“VolumePath”参数指定了“podman volume create”命令创建的目录位置。

另外如果podman访问的Container Registry需要访问证书,还需要在/etc/containers/policy.json中提供安全访问策略。

登录/登出Container Registry

podman login”命令将登录指定的Registry服务器。如果命令没有指定Registry服务器,podman命令将使用“registries.conf”文件中在“[registries.search]”配置的第一个Registry。“podman login”命令可以使用用户名和密码、也可用证书登录Registry。
如果不指定“–authfile”参数,podman在首次成功登陆Registry后会将登录凭证存放到缺省为 ${XDG_RUNTIME_DIR}/containers/auth.json的认证文件中,登录凭证的内容是“USERNAME:PASSWORD”,但是是以base64格式记录的。我们也可以使用“–authfile”参数指定podman使用的认证文件。podman只有在对Registry操作的时候才使用“–authfile”指定的认证文件(或缺省的认证文件)中的身份凭证,这些操作包括“podman loginpodman pullpodman pushpodman searchpodman run”等。

  1. 用podman登录Container Registry,Podman会自动将登录认证写到auth.json中。其中“auth”中的内容是“user1:password1”字符串的base64编码。注意:本环境中${XDG_RUNTIME_DIR}指向的是“/run/user/0”目录。
$ podman login ${REGISTRY_DOMAIN}:5000 -u user1 -p password1
Login Succeeded
$ more /run/user/0/containers/auth.json
{"auths": {"registry.domain.com:5000": {"auth": "dXNlcjE6cGFzc3dvcmQx"}}
}
  1. 对以上base64字符串进行反编码。
$ echo -n "dXNlcjE6cGFzc3dvcmQx" | base64 -d
user1:password1
  1. 如果此时在第二个Terminal中再次用podman登录Container Registry,podman会缺省使用当前有效的认证文件auth.json进行登录。
$ podman login ${REGISTRY_DOMAIN}:5000
Authenticating with existing credentials...
Existing credentials are valid. Already logged in to registry.domain.com:5000
  1. 执行命令登出Container Registry,可以发现此时缺省认证文件auth.json中已经没有认证信息了。
$ podman logout ${REGISTRY_DOMAIN}:5000
$ more /run/user/0/containers/auth.json
{"auths": {}
}
  1. 此时再进行登录,系统会提示输入用户名和密码。
$ podman login ${REGISTRY_DOMAIN}:5000
Username:

利用登录凭证免密操作

Podman允许用户通过免明文密码的方式对Container Registry操作(其实是先做免密登录,再做操作)。

  1. 先用podman登录,同时在keyfree.json文件中记录可以免密操作的Token。
$ podman login ${REGISTRY_DOMAIN}:5000 -u user1 -p password1 --authfile keyfree.json
Login Succeeded
  1. 查看
$ cat /keyfree.json
{"auths": {"registry.domain.com:5000": {"auth": "dXNlcjE6cGFzc3dvcmQx"}}
}
  1. 登出Container Registry
$ podman logout ${REGISTRY_DOMAIN}:5000
  1. 用免密文件对Container Registry中的Image进行操作,确认无需密码,只需免密文件即可运行。
$ podman pull ${REGISTRY_DOMAIN}:5000/busybox:latest --authfile /keyfree.json
Trying to pull registry.domain.com:5000/busybox:latest...Getting image source signatures
Copying blob 91f30d776fb2 done
Copying config c7c37e472d done
Writing manifest to image destination
Storing signatures
c7c37e472d31c1685b48f7004fd6a64361c95965587a951692c5f298c6685998

查询镜像

  1. podman默认是搜索/etc/containers/registries.conf文件中“[registries.search]”中配置的registry。
  2. 查询“docker.io/busybox”镜像,只返回3个结果。
$ podman search docker.io/busybox --limit 3
INDEX       NAME                              DESCRIPTION                                       STARS   OFFICIAL   AUTOMATED
docker.io   docker.io/library/busybox         Busybox base image.                               1931    [OK]
docker.io   docker.io/radial/busyboxplus      Full-chain, Internet enabled, busybox made f...   31                 [OK]
docker.io   docker.io/yauritux/busybox-curl   Busybox with CURL                                 8
  1. 查本地Registry上的busybox镜像。
$ podman search ${REGISTRY_DOMAIN}:5000/busybox --limit 3
INDEX             NAME                               DESCRIPTION   STARS   OFFICIAL   AUTOMATED
domain.com:5000   registry.domain.com:5000/busybox                 0

pull/push 镜像

  1. 将busybox镜像从docker.io拉到本地缓存。注意“Storing signatures”后面的字符创。
$ podman pull busybox
Trying to pull docker.io/library/busybox...Getting image source signatures
Copying blob 91f30d776fb2 done
Copying config c7c37e472d done
Writing manifest to image destination
Storing signatures
c7c37e472d31c1685b48f7004fd6a64361c95965587a951692c5f298c6685998
  1. 查看本地镜像缓存。注意“IMAGE ID”的内容是上面““Storing signatures”的一部分。
$ podman images
REPOSITORY                  TAG      IMAGE ID       CREATED      SIZE
docker.io/library/busybox   latest   c7c37e472d31   2 days ago   1.44 MB
  1. 设置podman在本地存放镜像的目录。
$ PODMAN_DATA_DIR=/var/lib/containers/storage
  1. 查看镜像的存储目录,确认有上面有对应“IMAGE ID”的“c7c37e472d31c1685b48f7004fd6a64361c95965587a951692c5f298c6685998”目录。
$ ll ${PODMAN_DATA_DIR}/overlay-images
total 8
drwx------.  2 root root  244 Jul  2 13:55 c7c37e472d31c1685b48f7004fd6a64361c95965587a951692c5f298c6685998
-rw-------.  1 root root 1134 Jul  2 13:55 images.json
-rw-------.  1 root root   64 Jul  2 13:55 images.lock

访问非安全的Registry

当podman访问Registry的时候进行build、commit、pull或push操作的时候,如果所访问的Registry在“[registries.insecure]”中,那么podman缺省用“–tls-verify=false”发起请求。如果访问其它Registry(没有在registries.conf中定义或在registries.conf中定义为“[registries.search]”),podman缺省用“–tls-verify=true”发起请求。如果需要不使用上述缺省访问,可以在命令中会用“–tls-verify”。

查看镜像分层目录

$ podman image tree busybox
Image ID: c7c37e472d31
Tags:    [docker.io/library/busybox:latest]
Size:    1.444MB
Image Layers
└──  ID: 50761fe126b6 Size: 1.442MB Top Layer of: [docker.io/library/busybox:latest]

保存镜像-恢复镜像

  1. 执行命令,确认本地有busybox镜像。
$ podman images
REPOSITORY                  TAG      IMAGE ID       CREATED      SIZE
docker.io/library/busybox   latest   c7c37e472d31   4 days ago   1.44 MB
  1. 执行命令,将本地docker.io/library/busybox:latest镜像保存到文件中。
$ podman save --quiet -o busybox.tar docker.io/library/busybox:latest
Getting image source signatures
Copying blob 50761fe126b6 done
Copying config c7c37e472d done
Writing manifest to image destination
Storing signatures$ ll busybox.tar
-rw-r--r--. 1 root root 1451008 Jul  3 16:08 busybox.tar
  1. 将本地docker.io/library/busybox:latest镜像删除。
$ podman rmi docker.io/library/busybox:latest
c7c37e472d31c1685b48f7004fd6a64361c95965587a951692c5f298c6685998$ podman images
REPOSITORY   TAG   IMAGE ID   CREATED   SIZE
  1. 从busybox.tar文件加载busybox镜像,然后确认镜像已经加载成功。
$ podman load --quiet -i busybox.tar
Loaded image(s): docker.io/library/busybox:latest$ podman images
REPOSITORY                  TAG      IMAGE ID       CREATED      SIZE
docker.io/library/busybox   latest   c7c37e472d31   4 days ago   1.44 MB

运行容器,并观察对应进程和使用的存储

  1. 在Terminal 1中运行busybox容器,然后在其中创建1个目录和hello.txt,然后查看容器内的主机名。注意不要退出。
$ podman run --name busybox-local -it ${REGISTRY_DOMAIN}:5000/busybox
/ # mkdir mydir1
/ # echo hello > mydir1/hello.txt
/ # hostname
84625108be74
  1. 在Terminal 2中运命令,查看运行的容器。其中“CONTAINER ID”为“84625108be74”,和容器内的主机名相同。
$ podman ps
CONTAINER ID  IMAGE                                    COMMAND  CREATED         STATUS             PORTS  NAMES
84625108be74  registry.domain.com:5000/busybox:latest  sh       1 minutes ago   Up 1 minutes ago         busybox-local
  1. 在Terminal 2中运命令,查看系统进程,确认能看到容器是通过“/usr/libexec/podman/conmon”进程运行起来的,运行的容器就是一个系统进程。另外,其中的“/var/lib/containers/storage/overlay-containers/xxxxxxxxxx/userdata”中的“xxxxxxxxxx”就是该容器的ID。
$ ps -ef | grep busybox
root      5340     1  0 13:52 ?        00:00:00 /usr/libexec/podman/conmon -s -c 84625108be74a36b64e24edec59483c5340d0f768d7355a3c64ec7660dd80686 -u 84625108be74a36b64e24edec59483c5340d0f768d7355a3c64ec7660dd80686 -n busybox-local -r /usr/bin/runc -b /var/lib/containers/storage/overlay-containers/84625108be74a36b64e24edec59483c5340d0f768d7355a3c64ec7660dd80686/userdata -p /var/run/containers/storage/overlay-containers/84625108be74a36b64e24edec59483c5340d0f768d7355a3c64ec7660dd80686/userdata/pidfile --exit-dir /var/run/libpod/exits --exit-command /usr/bin/podman --exit-command-arg --root --exit-command-arg /var/lib/containers/storage --exit-command-arg --runroot --exit-command-arg /var/run/containers/storage --exit-command-arg --log-level --exit-command-arg error --exit-command-arg --cgroup-manager --exit-command-arg systemd --exit-command-arg --tmpdir --exit-command-arg /var/run/libpod --exit-command-arg --runtime --exit-command-arg runc --exit-command-arg --storage-driver --exit-command-arg overlay --exit-command-arg container --exit-command-arg cleanup --exit-command-arg 84625108be74a36b64e24edec59483c5340d0f768d7355a3c64ec7660dd80686 --socket-dir-path /var/run/libpod/socket -t -l k8s-file:/var/lib/containers/storage/overlay-containers/84625108be74a36b64e24edec59483c5340d0f768d7355a3c64ec7660dd80686/userdata/ctr.log --log-level error$ more /var/run/containers/storage/overlay-containers/84625108be74a36b64e24edec59483c5340d0f768d7355a3c64ec7660dd80686/userdata/pidfile
5340$ more /var/run/containers/storage/overlay-containers/84625108be74a36b64e24edec59483c5340d0f768d7355a3c64ec7660dd80686/userdata/hostname
84625108be74  $ more /var/run/containers/storage/overlay-containers/84625108be74a36b64e24edec59483c5340d0f768d7355a3c64ec7660dd80686/userdata/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.6     registry.domain.com
10.88.0.21      84625108be74
  1. 执行命令,列出所有已挂载容器挂载点。返回结果包括容器ID和其挂载点目录。
$ podman mount
84625108be74  /var/lib/containers/storage/overlay/8a1697a77a6f7acc87a6ce5042c7b890b30260bf8d64c31f01105af5adf3cf12/merged
  1. 在Terminal 2中运命令,查找名为“hello.txt”的文件。确认可以查到2个名为“hello.txt”的文件,一个是在“xxxxxxxxxxxxxxxxxx/diff/mydir1”目录中,另一个在“xxxxxxxxxxxxxxxxxx/merged/mydir1”中。
$ find / -name hello.txt
/var/lib/containers/storage/overlay/8a1697a77a6f7acc87a6ce5042c7b890b30260bf8d64c31f01105af5adf3cf12/diff/mydir1/hello.txt
/var/lib/containers/storage/overlay/8a1697a77a6f7acc87a6ce5042c7b890b30260bf8d64c31f01105af5adf3cf12/merged/mydir1/hello.txt
  1. 在Terminal 1中运命令,从“busybox”容器中退出。
/ # exit
  1. 再次在Terminal 2中运命令,查找名为“hello.txt”的文件。确认只能在“xxxxxxxxxxxxxxxxxx/diff/mydir1”目录中查到1个名为“hello.txt”的文件了。
$ find / -name hello.txt
/var/lib/containers/storage/overlay/8a1697a77a6f7acc87a6ce5042c7b890b30260bf8d64c31f01105af5adf3cf12/diff/mydir1/hello.txt
  1. 执行命令,查看busybox-local容器的文件系统变化情况。
$ podman diff busybox-local
C /etc
A /mydir1
A /mydir1/hello.txt
C /root
A /root/.ash_history

查看容器日志

  1. 在Terminal 1中执行命令,查看所有运行的容器,其中有刚刚运行并退出的“busybox-local”容器。此时该容器的环境还在,只不过没有运行。
$ podman ps -a
CONTAINER ID  IMAGE                                    COMMAND  CREATED         STATUS                      PORTS  NAMES
84625108be74  registry.domain.com:5000/busybox:latest  sh       48 seconds ago  Exited (0) 30 seconds ago          busybox-local
  1. 执行命令,查看名为 busybox-local的容器日志。
$ podman logs busybox-local
/ # mkdir mydir1
/ # echo hello > ./mydir1/hello.txt
/ # exit

查看容器运行实时状态

  1. 在Terminal 1中运行命令,继续运行busybox-local容器。
$ podman start -ia busybox-local
  1. 执行命令,查看容器运行运行的实施消耗资源情况。
$ podman stats --all
ID             NAME            CPU %   MEM USAGE / LIMIT   MEM %   NET IO        BLOCK IO   PIDS
e8193ad15aee   busybox-local   --      53.25kB / 2.096GB   0.00%   698B / 656B   -- / --    1

运行停止的容器

  1. 在Terminal 1中执行命令,查看所有运行的容器,其中有刚刚运行并退出的“busybox-local”容器。此时该容器的环境还在,只不过没有运行。
$ podman ps -a
CONTAINER ID  IMAGE                                    COMMAND  CREATED         STATUS                      PORTS  NAMES
84625108be74  registry.domain.com:5000/busybox:latest  sh       48 seconds ago  Exited (0) 30 seconds ago          busybox-local
  1. 在Terminal 1中再次执行以下命令,将报错,提示已经名为“busybox-local”的容器已经在本地存储中了。
$ podman run --name busybox-local -ai ${REGISTRY_DOMAIN}:5000/busybox
Error: error creating container storage: the container name "busybox-local" is already in use by "84625108be74a36b64e24edec59483c5340d0f768d7355a3c64ec7660dd80686". You have to remove that container to be able to reuse that name.: that name is already in use
  1. 在Terminal 1中执行命令,根据在本地已有的“busybox-local”容器重新运行。在进入“busybox-local”容器内部后再次退出。
$ podman start -ai busybox-local
/ # exit

删除容器

  1. 在Terminal 1中执行命令,查看所有运行的容器,其中有刚刚运行并退出的“busybox-local”容器。此时该容器的环境还在,只不过没有运行。
$ podman ps -a
CONTAINER ID  IMAGE                                    COMMAND  CREATED            STATUS                       PORTS  NAMES
84625108be74  registry.domain.com:5000/busybox:latest  sh       44 minutes ago     Exited (0) 7 minutes ago            busybox-local
  1. 在Terminal 1中执行命令,删除busybox-local容器。
$ podman rm busybox-local
84625108be74a36b64e24edec59483c5340d0f768d7355a3c64ec7660dd80686
  1. 或者在Terminal 1中执行以下命令,将所有不运行的容器全部删除,
$ podman container prune
84625108be74a36b64e24edec59483c5340d0f768d7355a3c64ec7660dd80686
  1. 在Terminal 1中执行命令,已经找不到“hello.txt”了。
$ find / -name hello.txt

Podman运行环境管理

查看运行环境信息

$ podman system df
TYPE            TOTAL   ACTIVE   SIZE     RECLAIMABLE
Images          1       0        1.44MB   1.44MB (100%)
Containers      0       0        0B       0B (0%)
Local Volumes   1       0        0B       0B (0%)

删除所有不用的容器、镜像和本地存储卷

$ podman system prune --all --volumes

参考

https://fossies.org/linux/libpod/troubleshooting.md
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux_atomic_host/7/html/getting_started_with_containers/index
https://www.redhat.com/sysadmin/manage-container-registries
https://www.redhat.com/sysadmin/how-run-skopeo-container

容器入门(2) - podman相关推荐

  1. Tomcat容器入门介绍

    Tomcat容器入门介绍 Tomcat环境配置 PS:JDK的安装这里就不讲了,找到安装包直接下一步下一步就行了. 1.配置JDK 在Windows10下,找到环境变量 在环境变量中添加JDK主目录 ...

  2. 容器入门(6) - 获取访问Docker Registry的公钥证书

    <OpenShift 4.x HOL教程汇总> 获取问Docker Registry的证书 在根据<容器入门(1) - 安装和使用Docker Registry>,我们可以使用 ...

  3. 容器入门(3) - docker

    <OpenShift 4.x HOL教程汇总> 文章目录 安装Docker客户端 客户端配置文件 登录/登出Container Registry 登录身份凭证 查询镜像 pull/push ...

  4. 容器入门(4) - skopeo

    <OpenShift 4.x HOL教程汇总> 文章目录 对独立的Docker Registry操作 查看Registry上的Image信息 在2个Registry之间复制Image 对O ...

  5. Docker容器入门及网易最佳实践

    文章目录 第一节 Docker容器入门 1.1.1 基础概念 1. Docker是什么 2. Docker和传统虚拟机的对比 3. 为什么要使用Docker 4. Docker架构 5. Docker ...

  6. RHCSA_8、容器管理,podman

    系列文章目录 RHCSA_5.逻辑卷管理 RHCSA_6.SELinux管理 RHCSA_7.Firewalld.NTP.Crontab 文章目录 系列文章目录 前言 一.podman docker与 ...

  7. 亚马逊云科技——云原生主题容器入门笔记

    嗨,大家好,我是异星球的小怪同志 一个想法有点乱七八糟的小怪 如果觉得对你有帮助,请支持一波. 希望未来可以一起学习交流. 目录 一.容器入门课程 二.容器入门课堂笔记 1.容器背后的发展历史 2.区 ...

  8. 自动化集成:Docker容器入门简介

    前言:该系列文章,围绕持续集成:Jenkins+Docker+K8S相关组件,实现自动化管理源码编译.打包.镜像构建.部署等操作:本篇文章主要描述Docker基础用法. 一.Docker简介 1.基础 ...

  9. 容器技术第一讲:容器入门篇

    女主宣言 容器作为Paas的一种体现,越来越受到广大程序员的喜爱.本文作为容器的入门篇,对Docker的原理和主要技术进行了初步的介绍. PS:丰富的一线技术.多元化的表现形式,尽在"HUL ...

最新文章

  1. python培训的课时是多久_如何快速学习python,学习python的最短时间是多久?
  2. C和C++之用extern “C“实现它们之间的互调
  3. java学习(24):if..else...if
  4. python编程(基于twisted的客户端编程)
  5. zabbix安装与配置
  6. python必背代码-Python高手必修课:如何让 Python 代码更易读,推荐收藏
  7. 苹果Mac强大的代码编辑器:Nova
  8. MLP 又又又升级了!港大商汤开源首个用于检测与分割任务的MLP架构
  9. python中数据处理的格式,json.csv txt excel
  10. 功率放大器ADS仿真实例
  11. Chrome快捷键整理
  12. [ZT]毁人不倦的应试教育(3)
  13. makefile中常用函数
  14. 注册最便宜的xyz域名,低成本搭建一个博客
  15. 让IIS服务器支持PHP
  16. 一行代码实现访客人次统计
  17. SAP SuccessFactors 功能介绍
  18. AMD Ryzen 7 5800U 机器安装Vmware虚拟机
  19. PreCreateWindow作用
  20. 【cocos2dx面试题干货】--2021年最新cocos2dx面试干货(引擎篇)

热门文章

  1. java细节_java细节知识
  2. php怎么获取栏目,thinkphp获取栏目和文章当前位置的方法
  3. linux安装ssh放在,Linux安装SSH
  4. 微软自带报ocienvcreate失败_微软推出的免费神器,治好了我的拖延症!
  5. java jdom_JAVA JDOM生成XML
  6. mysql覆盖索引二次查找_mysql中关于覆盖索引的知识点总结
  7. 形式多样!APP引导页设计灵感
  8. 在集设|参透海报设计中提取排版设计灵感
  9. 递归查找所有子代id php,PHP递归函数:从父ID获取子ID
  10. java 安全策略,编程式安全策略配置