Podman容器技术基础(二)

容器的使用

运行一个容器

[root@cent1 ~]# podman pull httpd		#首先拉取镜像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 1efc276f4ff9 done
Copying blob 80cb79a80bbe done
Writing manifest to image destination
Storing signatures
f2a976f932ec6fe48978c1cdde2c8217a497b1f080c80e49049e02757302cf74
[root@cent1 ~]# podman run -dit --name httpd1 httpd
142e4cdcae4d44ef46a4d4f6fff35a654fcd0cfb500a3ff1c05fa9e0aaaf38fd

查看镜像

[root@cent1 ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/httpd latest f2a976f932ec 13 days ago 149 MB

列出正在运行的容器

[root@cent1 ~]# podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
142e4cdcae4d docker.io/library/httpd:latest httpd-foreground 29 seconds ago Up 29 seconds ago httpd1

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

检查正在运行的容器

[root@cent1 ~]# podman inspect httpd1 |grep -i ipaddr		#利用grep过滤查看ip
"IPAddress": "10.88.0.6",
"IPAddress": "10.88.0.6",

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

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

选项
-l --latest #最近的 [root@cent1 ~]# podman logs -l
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
[Mon Aug 15 07:10:33.198432 2022] [mpm_event:notice] [pid 1:tid 139798604795200] AH00489: Apache/2.4.54 (Unix) configured -- resuming normal operations
[Mon Aug 15 07:10:33.198614 2022] [core:notice] [pid 1:tid 139798604795200] AH00094: Command line: 'httpd -D FOREGROUND'
10.88.0.1 - - [15/Aug/2022:07:34:41 +0000] "GET / HTTP/1.1" 200 45

查看一个运行容器中的进程资源使用情况,可以使用top观察容器中的 nginx pid

语法:
podman top <container_id> [root@cent1 ~]# podman top httpd1
USER PID PPID %CPU ELAPSED TTY TIME COMMAND
root 1 0 0.000 28m39.856159659s pts/0 0s httpd -DFOREGROUND
www-data 9 1 0.000 28m39.856392576s pts/0 0s httpd -DFOREGROUND
www-data 10 1 0.000 28m39.856431469s pts/0 0s httpd -DFOREGROUND
www-data 17 1 0.000 28m39.856463178s pts/0 0s httpd -DFOREGROUND

停止一个运行中的容器

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

删除一个容器

[root@cent1 ~]# podman rm -f httpd1
142e4cdcae4d44ef46a4d4f6fff35a654fcd0cfb500a3ff1c05fa9e0aaaf38fd
[root@cent1 ~]# podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

以上这些特性基本上都和 Docker 一样,Podman 除了兼容这些特性外,还支持了一些新的特性。

例如我们想在docker.io上分享我们新建的Nginx容器镜像

[root@cent1 nginx]# tree
.
├── Dockerfile
└── files
└── nginx-1.23.1.tar.gz 1 directory, 2 files
[root@cent1 ~]# podman pull centos #由于官方镜像内的yum仓库无法使用,所以这里利用官方镜像创建容器,重新配置yum仓库,然后再打包为镜像上传到自己的dockerhub下
[root@cent1 ~]# podman run -dit --name centos1 centos #使用centos镜像创建一个容器
0d9ba6a56252f077b2245133dd6f513224d6e70398eebee8766caddfd85aae36
[root@cent1 ~]# podman exec -it centos1 /bin/bash #进入容器
[root@0d9ba6a56252 /]# cd /etc/yum.repos.d/ #重新配置yum仓库
[root@0d9ba6a56252 yum.repos.d]# rm -rf *
[root@0d9ba6a56252 yum.repos.d]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
[root@0d9ba6a56252 yum.repos.d]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
[root@cent1 ~]# podman commit -p centos1 centos:v3 #重开一个终端,将容器重新打包为镜像
Getting image source signatures
Copying blob 2653d992f4ef skipped: already exists
Copying blob 3e576afe7647 done
Copying config ccd1007825 done
Writing manifest to image destination
Storing signatures
ccd1007825988982a9af46c6590d2f786e40e69c14e1c89bd66696dbf9bdd8da
[root@cent1 ~]# podman login #登录自己的dockerhub账号
Username: xiang0311
Password:
Login Succeeded!
[root@cent1 ~]# podman tag centos:v3 docker.io/xiang0311/centos:v2 #标记镜像
[root@cent1 ~]# podman push docker.io/xiang0311/centos/:v2 #上传到自己的docker hub账号仓库下
[root@cent1 nginx]# cat Dockerfile
FROM docker.io/xiang0311/centos:v2 #这里为自己dockerhub账号下的镜像 ENV PATH /usr/local/nginx/sbin:$PATH
ADD files/nginx-1.23.1.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.23.1 && \
./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@cent1 nginx]# podman build -t nginx . #构建镜像
[root@cent1 nginx]# podman tag localhost/nginx docker.io/xiang0311/nginx:v1 #标记镜像
[root@cent1 nginx]# podman push docker.io/xiang0311/nginx:v1 #上传镜像

总而言之,Podman 使查找、运行、构建和共享容器变得容易。

用户操作

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

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

[root@cent1 ~]# rpm -qa | grep crun			#先查看自己系统是否有crun
[root@cent1 ~]# dnf -y install crun
[root@cent1 ~]# vim /usr/share/containers/containers.conf
runtime = "crun" #取消此行注释
#runtime = "runc" #注释此行
[root@cent1 ~]# podman run -dit --name web1 -p 80:80 docker.io/xiang0311/nginx:v1
6351479af7a13edc6fe9b5d82fb82739e6866cb43d9fa0842ccc1ae52e0f1f48
[root@cent1 ~]# podman inspect web1 | grep crun
"OCIRuntime": "crun",
"crun",

安装slirp4netns和fuse-overlayfs

在普通用户环境中使用Podman时,建议使用fuse-overlayfs而不是VFS文件系统,至少需要版本0.7.6。现在新版本默认就是了。

[root@cent1 ~]# rpm -qa | grep slirp4netns		#先查找这两个包,如果没有就需要安装
slirp4netns-1.1.8-1.module_el8.5.0+890+6b136101.x86_64
[root@cent1 ~]# rpm -qa | grep fuse-overlayfs
fuse-overlayfs-1.7.1-1.module_el8.5.0+890+6b136101.x86_64
[root@cent1 ~]# vim /etc/containers/storage.conf
mount_program = "/usr/bin/fuse-overlayfs" #取消此行注释

/ etc / subuid和/ etc / subgid配置

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

[root@cent1 ~]# dnf -y install shadow-utils
[root@cent1 ~]# useradd zhangsan
[root@cent1 ~]# useradd lisi
[root@cent1 ~]# cat /etc/subgid #可以在/ etc / subuid和/ etc / subgid查看,每个用户的值必须唯一且没有任何重叠。
zhangsan:100000:65536
lisi:165536:65536
[root@cent1 ~]# cat /etc/subuid
zhangsan:100000:65536
lisi:165536:65536
[root@cent1 ~]# vim /etc/sysctl.conf #启动非特权ping
net.ipv4.ping_group_range=0 200000 #大于100000这个就表示tom可以操作podman
[root@cent1 ~]# sysctl -p #刷新
net.ipv4.ping_group_range = 0 200000

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

USERNAME:为用户分配的初始UID:为用户分配的UID范围的大小

该usermod程序可用于为用户分配 UID 和 GID,而不是直接更新文件。

[root@cent1 ~]# usermod --add-subuids 200000-201000 --add-subgids 200000-201000 zhangsan
[root@cent1 ~]# grep zhangsan /etc/subuid /etc/subgid
/etc/subuid:zhangsan:100000:65536
/etc/subuid:zhangsan:200000:1001
/etc/subgid:zhangsan:100000:65536
/etc/subgid:zhangsan:200000:1001

用户配置文件

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

container.conf

用户配置文件
1.~/.config/containers/containers.conf #优先级最高
2.cat /etc/containers/containers.conf
3.cat /usr/share/containers/containers.conf

如果它们以该顺序存在。每个文件都可以覆盖特定字段的前一个文件。

配置storage.conf文件

1./etc/containers/storage.conf
2.$HOME/.config/containers/storage.conf

在普通用户中/etc/containers/storage.conf的一些字段将被忽略

[root@cent1 ~]# vi /etc/containers/storage.conf
driver = "overlay"
......
mount_program = "/usr/bin/fuse-overlayfs" #取消注释
[root@cent1 ~]# vim /etc/sysctl.conf
net.ipv4.ping_group_range=0 200000
user.max_user_namespaces=15000c
[root@cent1 ~]# sysctl -p #刷新

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

graphroot="$HOME/.local/share/containers/storage"
runroot="$XDG_RUNTIME_DIR/containers"

registries.conf

配置按此顺序读入,这些文件不是默认创建的,可以从/usr/share/containers或复制文件/etc/containers并进行修改。

1./etc/containers/registries.conf
2./etc/containers/registries.d/*
3.HOME/.config/containers/registries.conf

授权文件

此文件里面写了docker账号的密码,以加密方式显示

[root@cent1 ~]# podman login
Username: xiang0311
Password:
Login Succeeded!
[root@cent1 ~]# cat /run/user/0/containers/auth.json
{
"auths": {
"docker.io": {
"auth": "eGlhbmcwMzExOmxvdmV6eXAzMzMu"
}
}

普通用户是无法看见root用户的镜像的

#root用户
[root@cent1 ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/xiang0311/centos v3 ccd100782598 3 hours ago 217 MB
localhost/centos v3 ccd100782598 3 hours ago 217 MB
docker.io/xiang0311/nginx v1 e3f50c7181d7 7 hours ago 545 MB
#普通用户
[root@cent1 ~]# su - zhangsan
[zhangsan@cent1 ~]$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE

容器卷

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

使用卷

[lisi@cent1 ~]$ podman pull busybox
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
7a80323521ccd4c2b4b423fa6e38e5cea156600f40cd855e464cc52a321a24dd
[lisi@cent1 ~]$ mkdir data
[lisi@cent1 ~]$ podman run -it --name web -v "$(pwd)"/data:/data:Z docker.io/library/busybox:latest /bin/sh
/ # cd data/
/data # ls
/data # touch 123
/data # ls -l
total 0
-rw-r--r-- 1 root root 0 Aug 15 11:43 123

在主机上查看

[lisi@cent1 data]$ ll
total 0
-rw-r--r--. 1 lisi lisi 0 Aug 15 19:43 123
[lisi@cent1 data]$ echo qqq > 123
[lisi@cent1 data]$ cat 123
qqq

在容器内查看

/data # cat 123
qqq
/data # ls -l
total 4
-rw-r--r-- 1 root root 4 Aug 15 11:46 123

我们可以发现在容器里面的文件的属主和属组都属于root,那么如何才能让其属于tom用户呢?下面告诉你答案

[lisi@cent1 ~]$ podman rm -f web2
130a2c19ef5ae099b5d157c2361c081777d555b5f5f7ce6b066e0084804b8142
[lisi@cent1 ~]$ podman run -it --name web2 -v "$(pwd)"/data:/data:Z --userns=keep-id docker.io/library/busybox /bin/sh
~ $ cd data/
/data $ ls -l
total 4
-rw-r--r-- 1 lisi lisi 4 Aug 15 11:46 123

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

[lisi@cent1 ~]$ 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的端口

[lisi@cent1 ~]$ podman run -d -p 1024:80 httpd
2206552f4a6a4d0e6ecd73f618489721a6d45d875e6cc20f9aa86f1006c890f4
[lisi@cent1 ~]$ ss -tanl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 *:1024 *:*
LISTEN 0 128 [::]:22 [::]:*

配置echo ‘net.ipv4.ip_unprivileged_port_start=80’ >> /etc/sysctl.conf后可以映射大于等于80的端口

[root@cent1 ~]# vim /etc/sysctl.conf
net.ipv4.ip_unprivileged_port_start=80
[root@cent1 ~]# sysctl -p
net.ipv4.ip_unprivileged_port_start = 80
[lisi@cent1 ~]$ podman run -d -p 80:80 httpd
77147eaac4b63b58840ddc1b0aab44ef29e5c9d4f2daf19e2a8afbfdd1e07ee5
[lisi@cent1 ~]$ ss -tanl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 *:1024 *:*
LISTEN 0 128 *:80 *:*
LISTEN 0 128 [::]:22

Podman容器基础(二)的更多相关文章

  1. 容器基础(二): 使用Namespace进行边界隔离

    Linux Namespace 容器技术可以认为是一种沙盒(sandbox), 为了实现沙盒/容器/应用间的隔离,就需要一种技术来对容器界定边界,从而让容器不至于互相干扰.当前使用的技术就是Names ...

  2. Podman容器技术基础

    Podman容器技术基础 目录 Podman容器技术基础 简介 安装 基础命令 简介 Podman 是一个开源的容器运行时项目,可在大多数 Linux 平台上使用.Podman 提供与 Docker ...

  3. C++ 顺序容器基础知识总结

    0.前言 本文简单地总结了STL的顺序容器的知识点.文中并不涉及具体的实现技巧,对于细节的东西也没有提及.一来不同的标准库有着不同的实现,二来关于具体实现<STL源码剖析>已经展示得全面细 ...

  4. Bootstrap <基础二十九>面板(Panels)

    Bootstrap 面板(Panels).面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素添加 class .panel 和 class .pa ...

  5. Bootstrap <基础二十二>超大屏幕(Jumbotron)

    Bootstrap 支持的另一个特性,超大屏幕(Jumbotron).顾名思义该组件可以增加标题的大小,并为登陆页面内容添加更多的外边距(margin).使用超大屏幕(Jumbotron)的步骤如下: ...

  6. Bootstrap<基础二> 网格系统

    Bootstrap 提供了一套响应式.移动设备优先的流式网格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列. 什么是网格(Grid)? 摘自维基百科: 在平面设计中,网格 ...

  7. 2、JavaScript 基础二 (从零学习JavaScript)

     11.强制转换 强制转换主要指使用Number.String和Boolean三个构造函数,手动将各种类型的值,转换成数字.字符串或者布尔值. 1>Number强制转换 参数为原始类型值的转换规 ...

  8. Python全栈开发【基础二】

    Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 其他(编码,range,f ...

  9. Bootstrap <基础二十八>列表组

    列表组.列表组件用于以列表形式呈现复杂的和自定义的内容.创建一个基本的列表组的步骤如下: 向元素 <ul> 添加 class .list-group. 向 <li> 添加 cl ...

随机推荐

  1. Cow Picnic S

    题目描述: K(1≤K≤100)只奶牛分散在N(1≤N≤1000)个牧场.现在她们要集中起来进餐.牧场之间有M(1≤M≤10000)条有向路连接,而且不存在起点和终点相同的有向路.她们进餐的地点必须是 ...

  2. 丽泽普及2022交流赛day21 社论

    A 暴力 . greater<double> -> greater<int> \(100\) -> \(50\) 代码丢了 . B dp . 考场上代码抢救一下就过 ...

  3. 说起分布式自增ID只知道UUID?SnowFlake(雪花)算法了解一下(Python3.0实现)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_155 但凡说起分布式系统,我们肯定会对一些海量级的业务进行分拆,比如:用户表,订单表.因为数据量巨大一张表完全无法支撑,就会对其进 ...

  4. CMAKE编译时如何自动下载第三方库并解压、安装到指定目录

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 导语 在日常开发过程中难免会使用到第三方库或者需要将部分库分离另外存储,如果将库与代码放在一起难免会造成工程庞大,此时就可 ...

  5. 万答#15,都有哪些情况可能导致MGR服务无法启动

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 本文转载自微信公众号 "老叶茶馆" 欢迎大家关注! 1.都有 ...

  6. 日均 6000+ 实例,TB 级数据流量,Apache DolphinScheduler 如何做联通医疗大数据平台的“顶梁柱”?

    作者 | 胡泽康 鄞乐炜 作者简介 胡泽康 联通(广东)产业互联网公司  大数据工程师,专注于开源大数据领域,从事大数据平台研发工作 鄞乐炜 联通(广东)产业互联网公司 大数据工程师,主要从事大数据平 ...

  7. [游记]CSP 2021 J/S

    这一次,也许是我的OI生涯的转折点了--能过,学习OI的时间就不会减少:但不能过,就会减少学习OI的时间-- 上午(S组) 6:00起床.去吃早餐,结果因为边喝粥边喝牛奶导致肚子疼.(我在这里劝大家, ...

  8. java-流的使用完结与异常处理机制

    1.1java.io.objectInputStream 对象输入流:用于将一组字节(通过对象输出流写出对象而转换的一组字节)读取并转换为对应的对象.对象输出流将对象写出时转换为一组字节的过程,称为: ...

  9. C++ IO流_数据的旅行之路

    1. 前言 程序中的数据总是在流动着,既然是流动就会有方向.数据从程序的外部流到程序内部,称为输入:数据从程序内部流到外部称为输出. C++提供有相应的API实现程序和外部数据之间的交互,统称这类AP ...

  10. BI如何实现用户身份集成自定义安全程序开发

    统一身份认证是整个 IT 架构的最基本的组成部分,而账号则是实现统一身份认证的基础.做好账号的规划和设计直接决定着企业整个信息系统建设的便利与难易程度,决定着系统能否足够敏捷和快速赋能,也决定了在数字 ...