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. OS模块中获取当前文件的绝对路径的相关方法

    os.path.realpath(__file__) 作用:获取当前执行py脚本的绝对路径(在当前工作目录下的绝对路径) __file__ : 表示当前文件的本身,一般值是当前文件的相对路径 例如: ...

  2. gitpod.io,云端开发调试工具。

    gitpod,一款在线开发调试工具,使用它你可以在网页上直接开发软件项目了. 比如你的项目仓库在github上,你可以直接在网址的前面添加gitpod.io/#,然后回车就能在网页上使用vscode打 ...

  3. 【喜讯】Apache DolphinScheduler 荣获 “2020 年度十大开源新锐项目”

    经 10000+ 开发者公开票选,20+专家评审. 10+ 主编团打分,历经数月打磨,11 月 19 日,由InfoQ 发起并组织的[2020中国技术力量年度榜单评选]结果正式揭晓. 2020 年度十 ...

  4. pytest-fixture执行顺序

    作用域-scope 作用域越大,越先执行,session>package>module>class>function. 是否自动调用fixture 自动调用(autouse=T ...

  5. Linux 11 安装Tomcat

    参考源 https://www.bilibili.com/video/BV187411y7hF?spm_id_from=333.999.0.0 版本 本文章基于 CentOS 7.6 这里使用解压缩方 ...

  6. HCIA-Datacom 3.3 实验三:以太网链路聚合实验

    实验介绍 随着网络规模不断扩大,用户对骨干链路的带宽和可靠性提出越来越高的要求.在传统技术中,常用更换高速率的接口板或更换支持高速率接口板的设备的方式来增加带宽,但这种方案需要付出高额的费用,而且不够 ...

  7. centos7.6内核之cfs_bandwidth下的distribute_cfs_runtime hard lockup

    接到业务兄弟报障,出现多例crash,堆栈大多数如下: KERNEL: /usr/lib/debug/lib/modules/3.10.0-957.27.2.el7.x86_64/vmlinuxDUM ...

  8. z—libirary最新地址获取,zlibirary地址获取方式,zliabary最新地址,zliabary官网登录方式,zliabary最新登陆

    Z-Library(缩写为z-lib,以前称为BookFinder)是Library Genesis的镜像,一个影子图书馆项目,用于对学术期刊文章.学术文本和大众感兴趣的书籍(其中一些是盗版的)进行文 ...

  9. 从零开始实现一个MyBatis加解密插件

    作者:vivo 互联网服务器团队- Li Gang 本篇文章介绍使用MyBatis插件来实现数据库字段加解密的过程. 一.需求背景 公司出于安全合规的考虑,需要对明文存储在数据库中的部分字段进行加密, ...

  10. 小A的树 - 树形DP

    题面 1 9 4 4 1 1 5 1 2 3 2 3 6 6 7 6 8 9 6 0 1 0 1 0 0 1 0 1 3 2 7 3 4 0 9 5 YES YES NO NO 题解 n <= ...