podman
使用 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
语法:
podman top <container_id>
停止一个容器
[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
删除一个容器
[root@192 ~]# podman rm -f tt
76aaefe45b03b5a5ea3d082b6b9ef995a44d3ef181316cdc78e6881c8ecad3c8
[root@192 ~]# podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
-f --强制删除,可以在容器启动时删除
上传镜像
例如,如果我们想在 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@192 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