容器软件组:一组软件
组名:container-tools
[root@pc2 ~]# yum -y module install container-tools
容器相关的所有软件
podman会赋予容器和运行容器的虚拟机IP
使用容器时需要将selinux设置成disabled
podman
安装容器软件:podman
[root@pc2 ~]# yum -y install podman
[root@pc2 ~]# rpm -q podman
podman-4.0.2-6.module+el8.6.0+785+d1251653.x86_64
[root@pc2 ~]#
Linux容器管理
镜像、仓库
什么是镜像
镜像是启动容器的核心
在podman中容器是基于镜像启动的
容器使用镜像启动
镜像是怎么来的
镜像可以从官方镜像仓库下载,也可以自己制作
官方镜像仓库
docker.io
quay.io
查看本机镜像
podman images
镜像的名称和标签
指定镜像的方法
每一个镜像都对应唯一的镜像 id
镜像名称 + 标签 = 唯一
每一个镜像都有标签,如果没写就是默认标签 latest
我们在调用镜像的时候,如果没有指定标签也是 latest
获取镜像
查找镜像
[root@pc2 ~]# podman search 关键字
podman search httpd
下载镜像
[root@pc2 ~]# podman pull 镜像名称:标签
podman pull localhost/myos:latest
导入镜像
[root@pc2 ~]# podman load -i 备份文件.tar.gz
[root@pc2 ~]# podman load -i /root/img.tar.xz #导入镜像
Getting image source signatures
Copying blob 7039aed436b9 done
Copying blob 879054335f94 done
Copying config 608968fe77 done
Writing manifest to image destination
Storing signatures
Getting image source signatures
Copying blob 879054335f94 skipped: already exists
Copying config 8cf70153e0 done
Writing manifest to image destination
Storing signatures
Loaded image(s): localhost/httpd:latest,localhost/rockylinux:8.6
[root@pc2 ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/httpd latest 608968fe7738 9 months ago 222 MB
localhost/rockylinux 8.6 8cf70153e062 16 months ago 202 MB
[root@pc2 ~]#
运行容器
run 命令
podman run 命令
podman run -选项 镜像名称:镜像标签 启动命令
查看 run 的选项
podman help run
man podman-run
run = 创建 + 启动 + 进入
命令的参数
podman run 命令的选项
-i 交互式
-t 终端
-d 后台运行
--name 容器名字
启动容器并进入容器
podman run -it httpd:latest /bin/bash
运行容器
使用podman命令启动容器
可以通过提示符判定自己是否进入容器了
podman命令行
podman镜像管理
镜像管理命令
查看镜像
[root@pc2 ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
查找镜像
[root@pc2 ~]# podman search 关键字
删除镜像
#按照镜像的 名称+标签 删除镜像
[root@pc2 ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/httpd latest 608968fe7738 9 months ago 222 MB
localhost/rockylinux 8.6 8cf70153e062 16 months ago 202 MB
[root@pc2 ~]# podman rmi localhost/rockylinux:8.6
Untagged: localhost/rockylinux:8.6
[root@pc2 ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/httpd latest 608968fe7738 9 months ago 222 MB
#按照镜像的 ID,删除镜像
[root@pc2 ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/httpd latest 608968fe7738 9 months ago 222 MB
localhost/rockylinux 8.6 8cf70153e062 16 months ago 202 MB
[root@pc2 ~]# podman rmi 608968fe7738
Untagged: localhost/httpd:latest
Deleted: 608968fe7738f5d640bc6c38d28a6d3955f3d1e2c9e28dbd39958847d24253f9
[root@pc2 ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/rockylinux 8.6 8cf70153e062 16 months ago 202 MB
[root@pc2 ~]#
podman容器管理
容器管理命令
启动容器
podman run –选项 镜像名称:镜像标签 启动命令
查看容器
podman ps [ -a 所有容器id ] [ -q 只显示容器 id ]
删除容器
podman rm 容器id
-f 强制
启动、停止、重启
podman start|stop|restart 容器id
进入容器
podman exec -it 容器id 启动命令
管理容器进阶
对外发布容器服务
怎么访问podman服务
默认容器可以访问外网
但外部网络的主机不可以访问容器内的资源
容器每次创建IP地址都会改变
解决这个问题的最佳方法是端口绑定
容器可以与宿主机的端口进行绑定
从而把宿主机变成对应的服务,不用关心容器的IP地址
发布podman服务
使用 -p 参数把容器端口和宿主机端口绑定
同一宿主机端口只能绑定一个容器服务
-p [可选IP]:宿主机端口:容器端口
例如:把宿主机变成 apache
podman run -d -p 80:80 httpd:latest
例如:把宿主机变成 nginx
podman run -d -p 80:80 nginx:8.6
端口绑定
[root@pc2 ~]# podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
efb2c993fa57 localhost/httpd:latest /usr/sbin/httpd -... 18 minutes ago Up 18 minutes ago myweb
[root@pc2 ~]# podman rm -f myweb
efb2c993fa57d5bde9dc318892196b1a09fdea05254cba5da871e96cfe099112
[root@pc2 ~]# podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@pc2 ~]#
[root@pc2 ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/myos 1.0 eb23d4bbb032 About an hour ago 222 MB
localhost/httpd latest 608968fe7738 9 months ago 222 MB
localhost/rockylinux 8.6 8cf70153e062 16 months ago 202 MB
[root@pc2 ~]# podman run --name myweb -p 80:80 -itd localhost/httpd:latest
19a7ff90b7ea2799a11209ac942fb1bc26772c6428c830ec993ed56fc4701a47
[root@pc2 ~]# podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
19a7ff90b7ea localhost/httpd:latest /usr/sbin/httpd -... 4 seconds ago Up 4 seconds ago 0.0.0.0:80->80/tcp myweb
[root@pc2 ~]#
[root@pc2 ~]# podman exec -it myweb /bin/bash
[root@19a7ff90b7ea html]# exit
exit
[root@pc2 ~]# podman inspect myweb| grep -i ipaddr
"IPAddress": "10.88.0.10",
"IPAddress": "10.88.0.10",
[root@pc2 ~]# rpm -q httpd
未安装软件包 httpd
[root@pc2 ~]# curl 192.168.88.2
Welcome to The Apache.
[root@pc2 ~]#
容器共享卷
卷的用途
podman容器不适合保存任何数据
数据文件与配置文件频繁更改
修改多个容器中的数据非常困难
多容器之间有数据共享、同步需求
重要数据在容器内不方便管理易丢失
解决这些问题请使用主机卷映射功能
主机卷的映射
podman可以映射宿主机文件或目录到容器中
---目标对象不存在就自动创建
---目标对象存在就直接覆盖掉
---多个容器可以映射同一个目标对象来达到数据共享的目的
---目标对象指的是容器中的文件或目录
启动容器时,使用 -v 映射参数
podman run -d -v 宿主机目录:容器内对象 镜像名称:标签
卷映射案例
在宿主机上修改httpd网站的主页文件,把网站的主页文件,通过卷映射到容器内
[root@pc2 ~]# podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
19a7ff90b7ea localhost/httpd:latest /usr/sbin/httpd -... 16 minutes ago Up 16 minutes ago 0.0.0.0:80->80/tcp myweb
[root@pc2 ~]# podman rm -f myweb
19a7ff90b7ea2799a11209ac942fb1bc26772c6428c830ec993ed56fc4701a47
[root@pc2 ~]# podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@pc2 ~]# mkdir /webroot
[root@pc2 ~]# echo wo shi webroot > /webroot/index.html
[root@pc2 ~]# cat /webroot/index.html
wo shi webroot
[root@pc2 ~]# podman run --name myweb -itd -p 80:80 -v /webroot:/var/www/html localhost/httpd:latest
6ed132cbe7f18643a434a76a6f46e1ab866aa56590d1d83880135da73c70e043
[root@pc2 ~]# podman exec -it myweb /bin/bash
[root@6ed132cbe7f1 html]# cat index.html
wo shi webroot
[root@6ed132cbe7f1 html]# exit
exit
[root@pc2 ~]# curl 192.168.88.2
wo shi webroot
[root@pc2 ~]#
管理系统服务
systemd
一个更高级的系统&服务管理器
---开机服务并行启动,各系统服务间的精确依赖
---服务目录:/usr/lib/systemd/system/
---主要管理工具:systemctl
管理员管理容器服务
管理员服务文件默认路径
---/usr/lib/systemd/system/
生成服务启动配置文件
--- --files 生成文件类型
--- podman generate systemd --name 容器名 --files
重新加载服务启动配置文件
--- systemctl daemon-reload
在容器内制作镜像
构建FTP服务,提供光盘内容
[root@pc2 ~]# yum -y install vsftpd
root@pc2 ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES #开启匿名用户访问功能
[root@pc2 ~]# systemctl restart vsftpd
[root@pc2 ~]# systemctl enable vsftpd
Created symlink /etc/systemd/system/multi-user.target.wants/vsftpd.service → /usr/lib/systemd/system/vsftpd.service.
[root@pc2 ~]# mkdir /var/ftp/dvd
[root@pc2 ~]# mount /dev/cdrom /var/ftp/dvd
mount: /var/ftp/dvd: WARNING: device write-protected, mounted read-only.
[root@pc2 ~]# ls /var/ftp/dvd/
AppStream BaseOS EFI images isolinux LICENSE media.repo TRANS.TBL
[root@pc2~]#
[root@pc2 ~]# curl ftp://10.88.0.1/dvd/ #必须有/结尾
dr-xr-xr-x 4 0 0 2048 May 15 2022 AppStream
dr-xr-xr-x 4 0 0 2048 May 15 2022 BaseOS
dr-xr-xr-x 3 0 0 2048 May 15 2022 EFI
-r--r--r-- 1 0 0 2204 Mar 30 2022 LICENSE
-r--r--r-- 1 0 0 883 May 15 2022 TRANS.TBL
dr-xr-xr-x 3 0 0 2048 May 15 2022 images
dr-xr-xr-x 2 0 0 2048 May 15 2022 isolinux
-r--r--r-- 1 0 0 86 May 15 2022 media.repo
[root@pc2 ~]#
[root@pc2 ~]# ifconfig | head -2
cni-podman0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 10.88.0.1 netmask 255.255.0.0 broadcast 10.88.255.255
[root@pc2 ~]# podman run -itd --name haha localhost/rockylinux:8.6 /bin/bash
523d8b5e0a0856b3b56c445d51d928c42c4dd516fa08d8daed83fab0404b0b35
[root@pc2 ~]# podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9074081dd922 localhost/rockylinux:8.6 /bin/bash 3 hours ago Up 3 hours ago abc01
523d8b5e0a08 localhost/rockylinux:8.6 /bin/bash 5 seconds ago Up 5 seconds ago haha
[root@pc2 ~]# podman exec -it haha /bin/bash
[root@523d8b5e0a08 /]# ls /etc/yum.repos.d/
Rocky-AppStream.repo Rocky-NFV.repo
Rocky-BaseOS.repo Rocky-Plus.repo
Rocky-Debuginfo.repo Rocky-PowerTools.repo
Rocky-Devel.repo Rocky-RT.repo
Rocky-Extras.repo Rocky-ResilientStorage.repo
Rocky-HighAvailability.repo Rocky-Sources.repo
Rocky-Media.repo
[root@523d8b5e0a08 /]# rm -rf /etc/yum.repos.d/*
[root@523d8b5e0a08 /]# ls /etc/yum.repos.d/
[root@523d8b5e0a08 /]# exit
exit
[root@pc2 ~]# ifconfig | head -2
cni-podman0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.88.0.1 netmask 255.255.0.0 broadcast 10.88.255.255
[root@pc2 ~]# podman exec -it haha /bin/bash
[root@523d8b5e0a08 /]# ping -c 2 10.88.0.1
PING 10.88.0.1 (10.88.0.1) 56(84) bytes of data.
64 bytes from 10.88.0.1: icmp_seq=1 ttl=64 time=0.075 ms
64 bytes from 10.88.0.1: icmp_seq=2 ttl=64 time=0.050 ms
--- 10.88.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1056ms
rtt min/avg/max/mdev = 0.050/0.062/0.075/0.014 ms
[root@523d8b5e0a08 /]# vi /etc/yum.repos.d/dvd.repo
[app]
baseurl=ftp://10.88.0.1/dvd/AppStream
gpgcheck=0
[app]
baseurl=ftp://10.88.0.1/dvd/BaseOS
gpgcheck=0
[root@523d8b5e0a08 /]# yum -y install net-tools
[root@523d8b5e0a08 /]# ifconfig | head -2
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.88.0.5 netmask 255.255.0.0 broadcast 10.88.255.255
[root@523d8b5e0a08 /]# exit
exit
[root@pc2 ~]# podman inspect haha | grep -i ipadd
"IPAddress": "10.88.0.5",
"IPAddress": "10.88.0.5",
[root@pc2 ~]#
查看容器详细信息:过滤查看容器IP地址
---podman inspect 容器
cni-podman0 这个IP地址是固定不变的
容器的IP地址是变化的(不固定)
将容器封装成镜像
[root@pc2 ~]# podman stop haha
haha
[root@pc2 ~]# podman commit haha myos:1.0 #将容器封装成镜像
Getting image source signatures
Copying blob 879054335f94 skipped: already exists
Copying blob 7da1886ad5fb done
Copying config eb23d4bbb0 done
Writing manifest to image destination
Storing signatures
eb23d4bbb032f0a18ab59225c1123e1ee53fa7b97b22625a0daff6088a2e4063
[root@pc2 ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/myos 1.0 eb23d4bbb032 11 seconds ago 222 MB
localhost/httpd latest 608968fe7738 9 months ago 222 MB
localhost/rockylinux 8.6 8cf70153e062 16 months ago 202 MB
[root@pc2 ~]# podman run --name test -it localhost/myos:1.0 /bin/bash
[root@dda43fe8a8c6 /]# ifconfig | head -2
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.88.0.7 netmask 255.255.0.0 broadcast 10.88.255.255
[root@dda43fe8a8c6 /]# exit
exit
端口绑定
[root@pc2 ~]# podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
efb2c993fa57 localhost/httpd:latest /usr/sbin/httpd -... 18 minutes ago Up 18 minutes ago myweb
[root@pc2 ~]# podman rm -f myweb
efb2c993fa57d5bde9dc318892196b1a09fdea05254cba5da871e96cfe099112
[root@pc2 ~]# podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@pc2 ~]#
[root@pc2 ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/myos 1.0 eb23d4bbb032 About an hour ago 222 MB
localhost/httpd latest 608968fe7738 9 months ago 222 MB
localhost/rockylinux 8.6 8cf70153e062 16 months ago 202 MB
[root@pc2 ~]# podman run --name myweb -p 80:80 -itd localhost/httpd:latest
19a7ff90b7ea2799a11209ac942fb1bc26772c6428c830ec993ed56fc4701a47
[root@pc2 ~]# podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
19a7ff90b7ea localhost/httpd:latest /usr/sbin/httpd -... 4 seconds ago Up 4 seconds ago 0.0.0.0:80->80/tcp myweb
[root@pc2 ~]#
[root@pc2 ~]# podman exec -it myweb /bin/bash
[root@19a7ff90b7ea html]# exit
exit
[root@pc2 ~]# podman inspect myweb| grep -i ipaddr
"IPAddress": "10.88.0.10",
"IPAddress": "10.88.0.10",
[root@pc2 ~]# rpm -q httpd
未安装软件包 httpd
[root@pc2 ~]# curl 192.168.88.2
Welcome to The Apache.
[root@pc2 ~]#
目录绑定(容器共享卷)
podman容器不适合保存任何数据
podman可以映射宿主主机文件或目录到容器中
---目标对象不存在就自动创建
---目标对象存在就直接覆盖掉
---多个容器可以映射同一个目标对象来达到数据共享的目的
[root@pc2 ~]# podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
19a7ff90b7ea localhost/httpd:latest /usr/sbin/httpd -... 16 minutes ago Up 16 minutes ago 0.0.0.0:80->80/tcp myweb
[root@pc2 ~]# podman rm -f myweb
19a7ff90b7ea2799a11209ac942fb1bc26772c6428c830ec993ed56fc4701a47
[root@pc2 ~]# podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@pc2 ~]# mkdir /webroot
[root@pc2 ~]# echo wo shi webroot > /webroot/index.html
[root@pc2 ~]# cat /webroot/index.html
wo shi webroot
[root@pc2 ~]# podman run --name myweb -itd -p 80:80 -v /webroot:/var/www/html localhost/httpd:latest
6ed132cbe7f18643a434a76a6f46e1ab866aa56590d1d83880135da73c70e043
[root@pc2 ~]# podman exec -it myweb /bin/bash
[root@6ed132cbe7f1 html]# cat index.html
wo shi webroot
[root@6ed132cbe7f1 html]# exit
exit
[root@pc2 ~]# curl 192.168.88.2
wo shi webroot
[root@pc2 ~]#