podman用户操作实例
实现root用户与普通用户端口通信
Slirp4netns
Slirp4netns 是无根容器和 Pod 的默认网络设置。它的发明是因为不允许非特权用户在主机上创建网络接口。Slirp4netns 在容器的网络命名空间中创建一个 TAP 设备,并连接到用户模式 TCP/IP 堆栈。
此笔记本电脑上的非特权用户创建了两个容器:数据库容器和 Web 容器。这两个容器都能够访问便携式计算机外部网络上的内容。如果容器绑定到主机端口并且便携式计算机防火墙允许,则外部客户端可以访问容器。请记住,非特权用户必须使用端口 1024 到 65535,因为较低的端口需要 root 权限。(CAP_NET_BIND_SERVICE)注意:这可以使用sysctl net.ipv4.ip_unprivileged_port_start
slirp4netns的缺点之一是容器彼此完全隔离。与网桥方法不同,没有虚拟网络。为了使容器相互通信,它们可以将端口映射与主机系统一起使用,也可以将它们放入Pod中,在那里它们共享相同的网络命名空间。有关详细信息,请参阅容器和 Pod 之间的通信。
在普通用户中创建容器,root用户访问查看网卡时是没有通信网卡的,但是当我们
在普通用户容器中已经创建了一个印射81端口的容器,是否可以通信呢?
例:
下面的示例将演示两个无根容器如何相互通信,其中一个是 Web 服务器。然后,它将显示主机网络上的客户端如何与无根Web服务器进行通信。
[hh@localhost ~]$ podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dbf856602146 docker.io/library/httpd:latest httpd-foreground 27 seconds ago Exited (0) 5 seconds ago 0.0.0.0:81->80/tcp web
[hh@localhost ~]$ podman start web
web
[hh@localhost ~]$ podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dbf856602146 docker.io/library/httpd:latest httpd-foreground 41 seconds ago Up 3 seconds ago 0.0.0.0:81->80/tcp web
[hh@localhost ~]$ ss -antl
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 [::]:22 [::]:*
LISTEN 0 128 *:81 *:*
宿主机查看网卡
[root@localhost ~]# ifconfig
cni-podman0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether ca:61:ef:f6:fb:e0 txqueuelen 1000 (Ethernet)
RX packets 58 bytes 3646 (3.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 30 bytes 2546 (2.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.47.137 netmask 255.255.255.0 broadcast 192.168.47.255
inet6 fe80::20c:29ff:fe5a:68d1 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:5a:68:d1 txqueuelen 1000 (Ethernet)
RX packets 269991 bytes 274718386 (261.9 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 127863 bytes 69067421 (65.8 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 //可见没有看到容器虚拟网卡
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 142 bytes 11272 (11.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 142 bytes 11272 (11.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@localhost ~]#
宿主机查看已存在81
[root@localhost ~]# ss -antl
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 [::]:22 [::]:*
LISTEN 0 128 *:81 *:*
[root@localhost ~]# curl 192.168.47.137:81
<html><body><h1>It works!</h1></body></html>
防火墙开放81端口
[root@localhost ~]# firewall-cmd --zone=public --add-port=81/tcp --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
在到普通用户登录容器,写入网页配置文件
[hh@localhost ~]$ podman exec -it web /bin/bash
root@dbf856602146:/usr/local/apache2# ls
bin build cgi-bin conf error htdocs icons include logs modules
root@dbf856602146:/usr/local/apache2# cd htdocs/
root@dbf856602146:/usr/local/apache2/htdocs# ls
index.html
root@dbf856602146:/usr/local/apache2/htdocs# echo "6666" > index.html
root@dbf856602146:/usr/local/apache2/htdocs# cat index.html
6666
podman基础命令大全
cp
在容器和本地文件系统之间 复制文件/文件夹
//将本地文件传输到容器中
[root@localhost ~]# podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9471fdc1f3b6 docker.io/library/httpd:latest httpd-foreground 23 seconds ago Up 2 seconds ago wqe
[root@localhost ~]# ls
anaconda-ks.cfg
[root@localhost ~]# podman cp anaconda-ks.cfg wqe:/tmp/
[root@localhost ~]# podman exxec -it wqe /bin/bash
Error: