podman(2)

#podman(2)

文章目录


##使用 Podman
使用 Podman 非常的简单,Podman 的指令跟 Docker 大多数都是相同的。下面我们来看几个常用的例子:****
运行一个容器

[root@192 ~]# podman run -dit --name tt busybox
76aaefe45b03b5a5ea3d082b6b9ef995a44d3ef181316cdc78e6881c8ecad3c8

列出运行的容器

[root@192 ~]# podman ps
CONTAINER ID  IMAGE                             COMMAND     CREATED        STATUS            PORTS       NAMES
76aaefe45b03  docker.io/library/busybox:latest  sh          9 seconds ago  Up 9 seconds ago              tt

查看镜像

[root@192 ~]# podman images
REPOSITORY                  TAG         IMAGE ID      CREATED      SIZE
docker.io/glume007/busybox  1           7a80323521cc  2 weeks ago  1.47 MB
docker.io/glume007/busybox  v1          7a80323521cc  2 weeks ago  1.47 MB
docker.io/library/busybox   latest      7a80323521cc  2 weeks ago  1.47 MB

注意:如果在ps命令中添加-a,Podman 将显示所有容器

##检查正在运行的容器

[root@192 ~]# podman inspect -l |grep -i ipaddress
            "IPAddress": "10.88.0.3",
                    "IPAddress": "10.88.0.3",

注意:-l 是最新容器的便利参数。您还可以使用容器的 ID 代替 -l。

##查看一个运行中容器的
日志

[root@192 ~]# podman logs --latest 

[root@192 ~]# podman logs tt

选项

  --latest    #最近的

##查看一个运行容器中的进程资源使用情况

[root@192 ~]# podman top tt
USER        PID         PPID        %CPU        ELAPSED          TTY         TIME        COMMAND
root        1           0           0.000       5m13.577010853s  pts/0       0s          sh 

##停止一个容器

[root@192 ~]# podman stop tt
tt
[root@192 ~]# podman ps
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES

##开启一个容器

[root@192 ~]# podman start tt
tt
[root@192 ~]# podman ps
CONTAINER ID  IMAGE                             COMMAND     CREATED        STATUS            PORTS       NAMES
76aaefe45b03  docker.io/library/busybox:latest  sh          7 minutes ago  Up 5 seconds ago              tt

上传镜像
例如,如果我们想在 http://docker.io 上分享我们新建的 Nginx 容器镜像,这很容易。首先登录码头:

[root@192 ~]# mkdir /nginx
[root@192 ~]# cd /nginx/
[root@192 nginx]# mkdir files
[root@192 nginx]# ls
files
[root@192 nginx]# cd files/
[root@192 files]# wget https://nginx.org/download/nginx-1.22.0.tar.gz
--2022-08-15 12:39:33--  https://nginx.org/download/nginx-1.22.0.tar.gz
正在解析主机 nginx.org (nginx.org)... 52.58.199.22, 3.125.197.172, 2a05:d014:edb:5704::6, ...
正在连接 nginx.org (nginx.org)|52.58.199.22|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:1073322 (1.0M) [application/octet-stream]
正在保存至: “nginx-1.22.0.tar.gz”

nginx-1.22.0.t 100%   1.02M   343KB/s  用时 3.1s        

2022-08-15 12:39:38 (343 KB/s) - 已保存 “nginx-1.22.0.tar.gz” [1073322/1073322])

[root@192 files]# ls
nginx-1.22.0.tar.gz

[root@192 nginx]# vim Dockerfile
FROM docker.io/library/centos

ENV PATH /usr/local/nginx/sbin:$PATH
ADD files/nginx-1.22.0.tar.gz /usr/src
RUN useradd -r -M -s /sbin/nologin nginx && \
    yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++ make && \
    mkdir -p /var/log/nginx && \
    cd /usr/src/nginx-1.22.0 && \
    ./configure \
    --prefix=/usr/local/nginx \
    --user=nginx \
    --group=nginx \
    --with-debug \
    --with-http_ssl_module \
    --with-http_realip_module \
    --with-http_image_filter_module \
    --with-http_gunzip_module \
    --with-http_gzip_static_module \
    --with-http_stub_status_module \
    --http-log-path=/var/log/nginx/access.log \
    --error-log-path=/var/log/nginx/error.log && \
  make && make install

CMD ["nginx","-g","daemon off"]

[root@192 nginx]# tree
.
├── Dockerfile
└── files
    └── nginx-1.22.0.tar.gz

1 directory, 2 files

[root@192 nginx]# podman build  -t nginx .
STEP 1/5: FROM docker.io/library/centos
Trying to pull docker.io/library/centos:latest...
Getting image source signatures

 修改镜像名
 [root@192 ~]# podman tag docker.io/library/nginx:latest docker.io/glume007/nginx:v1

登录并上传镜像
[root@192 ~]# podman login docker.io  需要告诉其要登录到docker仓库
[root@192 ~]# podman login docker.io
Username: glume007    #账户
Password: ********    #密码
Login Succeeded!

[root@localhost nginx]# podman push docker.io/glume007/nginx:v1  上传镜像
Getting image source signatures
Copying blob 38c40d6c2c85 done
Copying blob fee76a531659 done
Copying blob c2adabaecedb done
Copying config 7f3589c0b8 done
Writing manifest to image destination
Copying config 7f3589c0b8 done
Writing manifest to image destination
Storing signatures

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

[root@192 ~]# dnf -y install crun
[root@192 ~]# vim /usr/share/containers/containers.conf 
431 # Default OCI runtime
432 #
433 #runtime = "crun"
434 runtime = "crun"  //将runc改为crun

[root@192 ~]# podman run -dit --name tt busybox
7afdcf6f7c66cb5eb58a6503721f22512e4fd15319da7019f31159e4712e2336
[root@192 ~]# podman inspect tt |grep crun
        "OCIRuntime": "crun",
            "crun",

安装slirp4netns和fuse-overlayfs

[root@192 ~]# dnf -y install slirp4netns fuse-overlayfs
[root@192 ~]# vim /etc/containers/storage.conf 
77 mount_program = "/usr/bin/fuse-overlayfs"     取消注释

/ etc / subuid和/ etc / subgid配置

Podman要求运行它的用户在/ etc / subuid和/ etc / subgid文件中列出一系列UID,shadow-utils或newuid包提供这些文件

[root@192 ~]# dnf -y install shadow-utils
[root@192 ~]# useradd gg
c[root@192 ~]# cat /etc/subuid
dly:100000:65536
gg:165536:65536
[root@192 ~]# cat /etc/subgid
dly:100000:65536
gg:165536:65536

[root@192 ~]# vim /etc/sysctl.conf 
net.ipv4.ping_group_range = 0 200000 	在配置文件中加入此行
[root@192 ~]# sysctl -p
net.ipv4.ping_group_range = 0 200000

这个文件的格式是 USERNAME:UID:RANGE中/etc/passwd或输出中列出的用户名getpwent。

为用户分配的初始 UID。
为用户分配的 UID 范围的大小。
该usermod程序可用于为用户分配 UID 和 GID,而不是直接更新文件。

[root@192 ~]# usermod --add-subuids 200000-201000 --add-subgids 200000-201000 ff
[root@192 ~]# grep ff  /etc/subuid /etc/subgid
/etc/subuid:ff:200000:1001
/etc/subgid:ff:200000:1001

用户配置文件

三个主要的配置文件是container.conf、storage.conf和registries.conf。用户可以根据需要修改这些文件。

container.conf

// 用户配置文件
[root@localhost ~]# cat /usr/share/containers/containers.conf
[root@localhost ~]# cat /etc/containers/containers.conf
[root@localhost ~]# cat ~/.config/containers/containers.conf  优先级最高

在普通用户中这些字段默认

[root@192 ~]# grephroot="$HOME/.local/share/containers/storage"
[root@192 ~]# runroot="$XDG_RUNTIME_DIR/containers"

登录账号

[root@192 ~]# podman login 
Authenticating with existing credentials for docker.io
Existing credentials are valid. Already logged in to docker.io
[root@192 ~]# cat /run/user/0/containers/auth.json 
{
	"auths": {
		"docker.io": {
			"auth": "Z2x1bWUwMDc6TFlGMTk4NzA4MjVAZGx5"
		}
	}

[root@192 ~]# podman images
REPOSITORY                  TAG         IMAGE ID      CREATED      SIZE
docker.io/glume007/busybox  1           7a80323521cc  2 weeks ago  1.47 MB
docker.io/glume007/busybox  v1          7a80323521cc  2 weeks ago  1.47 MB
docker.io/library/busybox   latest      7a80323521cc  2 weeks ago  1.47 MB

[root@192 ~]# su - ff
[ff@192 ~]$ podman images
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE

容器与root用户一起运行,则root容器中的用户实际上就是主机上的用户。
UID GID是在/etc/subuid和/etc/subgid等中用户映射中指定的第一个UID GID。
如果普通用户的身份从主机目录挂载到容器中,并在该目录中以根用户身份创建文件,则会看到它实际上是你的用户在主机上拥有的。
使用卷

[root@192 ~]# su - ff
[ff@192 ~]$ pwd
/home/ff
[ff@192 ~]$ ls
[ff@192 ~]$ mkdir data
[ff@192 ~]$ cd data/
[ff@192 data]$ pwd
/home/ff/data

[ff@192 ~]$ podman login
Username: glume007
Password: 
Login Succeeded!
[ff@192 ~]$ podman run -it -v /home/ff/data/:/data:Z busybox /bin/sh
Resolved "busybox" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull docker.io/library/busybox:latest...
Getting image source signatures
Copying blob 50783e0dfb64 done  
Copying config 7a80323521 done  
Writing manifest to image destination
Storing signatures
/ # ls
bin   dev   home  root  sys   usr
data  etc   proc  run   tmp   var
/ # cd data/
/data # ls
/data # touch 1 2 3
/data # ls
1  2  3

在主机上查看

[ff@192 data]$ ls
1  2  3
[ff@192 data]$ echo ff > 1
[ff@192 data]$ cat 1
ff

容器里查看

/data # ls
1  2  3
/data # cat 1
ff

可以发现在容器里的文件的属主和属组都是root, 我们可以将其改为普通用户ff
/bin/sh: ll: not found
/data # ls -l
total 4
-rw-r--r--    1 root     root             3 Aug 15 03:17 1
-rw-r--r--    1 root     root             0 Aug 15 03:16 2
-rw-r--r--    1 root     root             0 Aug 15 03:16 3

只要在运行容器的时候加上一个--userns=keep-id即可。
[ff@192 ~]$ podman run -it --name yy -v /home/ff/data:/data:Z --userns keep-id busybox
~ $ cd /data
/data $ ls -l
total 4
-rw-r--r--    1 ff       ff               3 Aug 15 03:17 1
-rw-r--r--    1 ff       ff               0 Aug 15 03:16 2
-rw-r--r--    1 ff       ff               0 Aug 15 03:16 3

使用普通用户映射容器端口时会报“ permission denied”的错误

[ff@192 ~]$ podman run -d -p 80:80 httpd
Error: rootlessport cannot expose privileged port 80, you can add 'net.ipv4.ip_unprivileged_port_start=80' to /etc/sysctl.conf (currently 1024), or choose a larger port number (>= 1024): listen tcp 0.0.0.0:80: bind: permission denied

普通用户可以映射>= 1024的端口

[ff@192 ~]$ podman run -d -p 1024:80 httpd
Resolving "httpd" using unqualified-search registries (/etc/containers/registries.conf)
Trying to pull docker.io/library/httpd:latest...
Getting image source signatures
Copying blob 80e368ef21fc done  
Copying blob 80cb79a80bbe done  
Copying blob aed046121ed8 done  
Copying blob 1efc276f4ff9 done  
Copying blob 4340e7be3d7f done  
Copying config f2a976f932 done  
Writing manifest to image destination
Storing signatures
d2cf2784be07b7da6350aa83f7ac0374d147b2c51354602d61229d63dd7b16c6

[ff@192 ~]$ podman ps
CONTAINER ID  IMAGE                           COMMAND           CREATED        STATUS             PORTS                 NAMES
2b0ed157f40f  docker.io/library/httpd:latest  httpd-foreground  9 seconds ago  Up 10 seconds ago  0.0.0.0:1024->80/tcp  silly_robinson

在配置文件/etc/sysctl.conf/ 加入’net.ipv4.ip_unprivileged_port_start=80’ 后就可以映射大于等于80的端口

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

[ff@192 ~]$ podman run -d -p 80:80 httpd
4adeab8759b4a2c67dd5b81f51bdb962b1fcd0debc8c7a8d7c1dd2e5a0256ce2
[ff@192 ~]$ podman ps
CONTAINER ID  IMAGE                           COMMAND           CREATED         STATUS             PORTS               NAMES
4adeab8759b4  docker.io/library/httpd:latest  httpd-foreground  34 seconds ago  Up 33 seconds ago  0.0.0.0:80->80/tcp  friendly_raman

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值