Podman

Podman

安装

//安装podman
[root@localhost ~]# yum -y install podman

[root@localhost ~]#  podman info
host:
  arch: amd64
  buildahVersion: 1.18.0
  cgroupManager: systemd
  cgroupVersion: v1
  conmon:
    package: conmon-2.0.22-3.module_el8.3.0+699+d61d9c41.x86_64
    path: /usr/bin/conmon
    version: 'conmon version 2.0.22, commit: 01898f0a68e4bf403cba544b87ecd260545ae25a'
  cpus: 1
  distribution:
    distribution: '"rhel"'
    version: "8.0"
  eventLogger: file
  hostname: localhost.localdomain
  idMappings:
    gidmap: null
    uidmap: null
  kernel: 4.18.0-80.el8.x86_64
  linkmode: dynamic
  memFree: 931704832
  memTotal: 1893818368
  ociRuntime:
    name: runc
    package: runc-1.0.0-70.rc92.module_el8.3.0+699+d61d9c41.x86_64
    path: /usr/bin/runc
    version: 'runc version spec: 1.0.2-dev'
  os: linux
  remoteSocket:
    path: /run/podman/podman.sock
  rootless: false
  slirp4netns:
    executable: ""
    package: ""
    version: ""
  swapFree: 2147479552
  swapTotal: 2147479552
  uptime: 34m 0.25s
registries:
  search:
  - registry.access.redhat.com
  - registry.redhat.io
  - docker.io
store:
  configFile: /etc/containers/storage.conf
  containerStore:
    number: 0
    paused: 0
    running: 0
    stopped: 0
  graphDriverName: overlay
  graphOptions:
    overlay.mountopt: nodev,metacopy=on
  graphRoot: /var/lib/containers/storage
  graphStatus:
    Backing Filesystem: xfs
    Native Overlay Diff: "false"
    Supports d_type: "true"
    Using metacopy: "true"
  imageStore:
    number: 0
  runRoot: /var/run/containers/storage
  volumePath: /var/lib/containers/storage/volumes
version:
  APIVersion: "2"
  Built: 1613969495
  BuiltTime: Mon Feb 22 12:51:35 2021
  GitCommit: ""
  GoVersion: go1.14.12
  OsArch: linux/amd64
  Version: 2.2.1

配置加速器

//备份配置文件
[root@localhost ~]# cd /etc/containers/
[root@localhost containers]# ls
certs.d  oci  policy.json  registries.conf  registries.d  storage.conf
[root@localhost containers]# mv registries.conf registries.conf.tmpl

//新建一个空的registries.conf文件,并进行配置
[root@localhost containers]# vim registries.conf
unqualified-search-registries = ["docker.io"]

[[registry]]
prefix = ""
location= "******.mirror.aliyuncs.com"			#这里填写自己的加速器

podman基础命令应用

//使用pull命令拉网上的镜像,不加版本默认为最新
[root@localhost ~]# podman pull busybox
Completed short name "busybox" with unqualified-search registries (origin: /etc/containers/registries.conf)
Trying to pull docker.io/library/busybox:latest...
Getting image source signatures
Copying blob 8b3d7e226fab done  
Copying config a9d583973f done  
Writing manifest to image destination
Storing signatures
a9d583973f65a19b3bbd7a4312b4e2c27712c44c0ed8b94e9a38cc73e7565b75

//需要指定版本要使用:加指定版本
[root@localhost ~]# podman pull httpd:2.4-alpine
Completed short name "httpd" with unqualified-search registries (origin: /etc/containers/registries.conf)
Trying to pull docker.io/library/httpd:2.4-alpine...
Getting image source signatures
Copying blob d632c8441234 done  
Copying blob 0fcb24848396 done  
Copying blob f84cab65f19f done  
Copying blob 3e84dc11ea39 done  
Copying blob 87259b7246e5 done  
Copying config 40841bcea4 done  
Writing manifest to image destination
Storing signatures
40841bcea476b7411a163009cb256251aa3830efab8f07a689f52258f145ca48

//使用images查看本地的镜像
[root@localhost ~]# podman images
REPOSITORY                 TAG     IMAGE ID      CREATED       SIZE
docker.io/library/busybox  latest  a9d583973f65  17 hours ago  1.45 MB

//使用images查看本地的镜像
[root@localhost ~]# podman images
REPOSITORY                 TAG         IMAGE ID      CREATED       SIZE
docker.io/library/busybox  latest      a9d583973f65  11 hours ago  1.45 MB
docker.io/library/httpd    2.4-alpine  40841bcea476  13 days ago   57.8 MB


//使用search命令查找网上的镜像httpd
[root@localhost ~]# podman search httpd
INDEX      NAME                                             DESCRIPTION                                      STARS   OFFICIAL  AUTOMATED
docker.io  docker.io/library/httpd                          The Apache HTTP Server Project                   3399    [OK]      
docker.io  docker.io/centos/httpd-24-centos7                Platform for running Apache httpd 2.4 or bui...  36                
docker.io  docker.io/manageiq/httpd                         Container with httpd, built on CentOS for Ma...  0                 [OK]
docker.io  docker.io/clearlinux/httpd                       httpd HyperText Transfer Protocol (HTTP) ser...  1  
......

//使用create在一个镜像中创建容器
[root@localhost ~]# podman create httpd:2.4-alpine 
7edbc6af5cdcea46a25ea42353cb689845653727bf40eefb12eaa498ef4e5f2b

//使用ps -a查看所有的容器
[root@localhost ~]# podman ps -a
CONTAINER ID  IMAGE                               COMMAND           CREATED         STATUS   PORTS   NAMES
7edbc6af5cdc  docker.io/library/httpd:2.4-alpine  httpd-foreground  48 seconds ago  Created          beautiful_edison

//使用start使容器启动
[root@localhost ~]# podman start 7edbc6af5cdc
7edbc6af5cdc

//使用restart重启容器
[root@localhost ~]# podman restart 7edbc6af5cdc
7edbc6af5cdcea46a25ea42353cb689845653727bf40eefb12eaa498ef4e5f2b

//使用stop停止容器
[root@localhost ~]# podman stop 7edbc6af5cdc
7edbc6af5cdcea46a25ea42353cb689845653727bf40eefb12eaa498ef4e5f2b
[root@localhost ~]# podman ps -a
CONTAINER ID  IMAGE                               COMMAND           CREATED        STATUS                    PORTS   NAMES
7edbc6af5cdc  docker.io/library/httpd:2.4-alpine  httpd-foreground  6 minutes ago  Exited (0) 4 seconds ago          beautiful_edison

//使用rm删除容器(删除时容器应处于停止状态,若容器还在运行则删除失败,可以使用rm -f强制删除)
[root@localhost ~]# podman rm 7edbc6af5cdc
7edbc6af5cdcea46a25ea42353cb689845653727bf40eefb12eaa498ef4e5f2b
[root@yqh ~]# podman ps -a
CONTAINER ID  IMAGE   COMMAND  CREATED  STATUS  PORTS   NAMES


//使用run可以自动进行创建和运行容器(加上-d使其在后台运行)
[root@localhost ~]# podman run -d httpd
Completed short name "httpd" with unqualified-search registries (origin: /etc/containers/registries.conf)
Trying to pull docker.io/library/httpd:latest...
Getting image source signatures
Copying blob 243acf75a504 done  
Copying blob 45b42c59be33 done  
Copying blob 8fc1ad93a9b1 done  
Copying blob 83ac8490fcc3 done  
Copying blob bdb2d204d86d done  
Copying config 464fdc577e done  
Writing manifest to image destination
Storing signatures
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.88.0.6. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.88.0.6. Set the 'ServerName' directive globally to suppress this message
[Wed Mar 10 08:47:56.661193 2021] [mpm_event:notice] [pid 1:tid 140400069350528] AH00489: Apache/2.4.46 (Unix) configured -- resuming normal operations
[Wed Mar 10 08:47:56.661319 2021] [core:notice] [pid 1:tid 140400069350528] AH00094: Command line: 'httpd -D FOREGROUND'

[root@localhost ~]# podman ps -a
CONTAINER ID  IMAGE                           COMMAND           CREATED         STATUS             PORTS   NAMES
1307c283b810  docker.io/library/httpd:latest  httpd-foreground  23 seconds ago  Up 23 seconds ago          bold_bouman


//使用inspect查看容器的各种信息,比如IP
[root@localhost ~]# podman inspect 1307c283b810
        "NetworkSettings": {
            "EndpointID": "",
            "Gateway": "10.88.0.1",
            "IPAddress": "10.88.0.6",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "MacAddress": "2e:8c:c7:9b:ac:cb",
            "Bridge": "",
            "SandboxID": "",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/netns/cni-ff472609-0748-aba8-b730-e68eeb4d9f3b"
        },

//使用attach进入到容器的内部,但不能操作且退出时容器也会停止,不推荐使用。
[root@localhost ~]# podman attach 1307c283b810

(另开一个终端访问它)
[root@localhost ~]# curl 10.88.0.6
<html><body><h1>It works!</h1></body></html>

(内部出现访问信息)
10.88.0.1 - - [10/Mar/2021:09:59:12 +0000] "GET / HTTP/1.1" 200 45

(Ctrl+C终止容器运行)
^C[Wed Mar 10 09:59:20.064118 2021] [mpm_event:notice] [pid 1:tid 140400069350528] AH00491: caught SIGTERM, shutting down

//使用exec -it指定交互模式进入容器,比如/bin/bash或/bin/sh,由此可以实现操作且退出时容器不会停止
(需要先启动容器)
[root@localhost ~]# podman start 1307c283b810
1307c283b810
[root@localhost ~]# podman exec -it 1307c283b810 /bin/sh
# pwd
/usr/local/apache2

普通用户使用的配置

在允许没有root权限的用户运行Podman之前,管理员必须安装或构建Podman并完成以下配置。

详情见 Podman官方文档

创建普通用户

[root@localhost ~]# useradd yc

group V2支持
cgroup V2 Linux内核功能允许用户限制无根容器可以使用的资源量。如果使用cgroup V2启用了运行Podman的Linux发行版,则可能需要更改默认的OCI运行时。某些较旧的版本runc不适用于cgroup V2,您可能必须切换到备用OCI运行时crun。

用于通过在系统级或在任一改变用于在containers.conf文件“默认OCI运行时”的值的所有命令用户级别从runtime = "runc"到runtime = "crun"。

//安装crun
[root@localhost ~]# yum -y install crun

//取消注释并修改成crun
[root@localhost ~]# vim /usr/share/containers/containers.conf
runtime = "crun"
          
//启动一个容器查看
[root@localhost ~]# podman run -d --rm --name web2 nginx
[root@localhost ~]# podman inspect web2|grep crun
        "OCIRuntime": "crun",
            "crun",

安装slirp4netns

提供用户模式网络,并且必须安装上才能使Podman在普通用户环境中运行

[root@localhost ~]# yum -y install slirp4netns

安装fuse-overlayfs

在普通用户环境下,建议使用fuse-overlayfs文件系统而不是VFS文件系统

[root@localhost ~]# yum -y install fuse-overlayfs

//确保配置文件如下
[root@localhost ~]# vim /etc/containers/storage.conf
[storage]
driver = "overlay"
······
mount_program = "/usr/bin/fuse-overlayfs"		#取消注释

启用用户名称空间(RHEL7)

文件中指定了系统上允许的用户名称空间的数量/proc/sys/user/max_user_namespaces。在大多数Linux平台上,默认情况下是预设的,因此无需进行任何调整。但是,在RHEL7上,具有root权限的用户可能需要使用以下命令将其设置为合理的值: sysctl user.max_user_namespaces=15000

配置/etc/subuid和/etc/subgid
安装shadow或newuid

[root@localhost ~]# yum -y install shadow
[root@localhost ~]# yum -y install newuid

启用非特权ping

[root@localhost ~]# echo 'net.ipv4.ip_unprivileged_port_start=80' >> /etc/sysctl.conf
[root@localhost ~]# sysctl -p
net.ipv4.ip_unprivileged_port_start = 80

使用普通用户启动nginx容器测试

//启动一个nginx容器
[yc@localhos ~]$ podman run -d --name web -p 80:80 nginx
ae9b8ef916baf09a92801b1f72e14df44a9253b6bb122348174058dabb3b15d1

[yc@localhos ~]$ podman ps -a
CONTAINER ID  IMAGE                           COMMAND               CREATED        STATUS            PORTS               NAMES
ae9b8ef916ba  docker.io/library/nginx:latest  nginx -g daemon o...  5 minutes ago  Up 4 minutes ago  0.0.0.0:80->80/tcp  web

[localhost@yc ~]$ ss -antl
State     Recv-Q     Send-Q         Local Address:Port         Peer Address:Port    
LISTEN    0          128                  0.0.0.0:22                0.0.0.0:*       
LISTEN    0          128                        *:80                      *:*       
LISTEN    0          128                     [::]:22                   [::]:* 

授权文件

  • podman login和podman logout命令使用的默认授权文件位于中${XDG_RUNTIME_DIR}/containers/auth.json
//使用root用户登录官网
[root@localhost ~]# podman login
Username: yanchuang
Password: 
Login Succeeded!

[root@localhost ~]# find / -name auth.json
/run/containers/0/auth.json

不用创建仓库推镜像至官网

[root@localhos ~]# podman images
REPOSITORY                 TAG     IMAGE ID      CREATED       SIZE
docker.io/library/busybox  latest  a9d583973f65  1 hours ago  1.45 MB
docker.io/library/nginx    latest  35c43ace9216  1 hours ago   137 MB
docker.io/library/httpd    latest  464fdc577ef4  1 hours ago   142 MB

//给busybox打上标签
[root@localhos ~]# podman tag docker.io/library/busybox:latest docker.io/baoziong/busybox:v0.1

//直接上传镜像
[root@localhos ~]# podman push docker.io/baoziong/busybox:v0.1
Getting image source signatures
Copying blob 2983725f2649 skipped: already exists  
Copying config a9d583973f done  
Writing manifest to image destination
Storing signatures
posted @ 2021-03-10 23:38  吻如雪上霜  阅读(347)  评论(0编辑  收藏  举报